Commit 42c92aa5 authored by nadro's avatar nadro

- Improved OpenGL optimized calls organization.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4412 dfc29bdd-3216-0410-991c-e03cc46cb475
parent dd15cecd
...@@ -43,9 +43,7 @@ COpenGLDriver::COpenGLDriver(const irr::SIrrlichtCreationParameters& params, ...@@ -43,9 +43,7 @@ COpenGLDriver::COpenGLDriver(const irr::SIrrlichtCreationParameters& params,
CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true), CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true),
AntiAlias(params.AntiAlias), RenderTargetTexture(0), AntiAlias(params.AntiAlias), RenderTargetTexture(0),
CurrentRendertargetSize(0,0), ColorFormat(ECF_R8G8B8), CurrentRendertargetSize(0,0), ColorFormat(ECF_R8G8B8),
CurrentTarget(ERT_FRAME_BUFFER), Params(params), CurrentTarget(ERT_FRAME_BUFFER), Params(params), BridgeCalls(0),
IsDepthTestEnabled(false), IsTexture2DEnabled(false), DepthMask(true),
CurrentMatrixMode(0), CurrentActiveTexture(0),
HDc(0), Window(static_cast<HWND>(params.WindowId)), Win32Device(device), HDc(0), Window(static_cast<HWND>(params.WindowId)), Win32Device(device),
DeviceType(EIDT_WIN32) DeviceType(EIDT_WIN32)
{ {
...@@ -481,9 +479,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -481,9 +479,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params,
CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true), CurrentRenderMode(ERM_NONE), ResetRenderStates(true), Transformation3DChanged(true),
AntiAlias(params.AntiAlias), RenderTargetTexture(0), AntiAlias(params.AntiAlias), RenderTargetTexture(0),
CurrentRendertargetSize(0,0), ColorFormat(ECF_R8G8B8), CurrentRendertargetSize(0,0), ColorFormat(ECF_R8G8B8),
CurrentTarget(ERT_FRAME_BUFFER), Params(params), CurrentTarget(ERT_FRAME_BUFFER), Params(params), BridgeCalls(0),
IsDepthTestEnabled(false), IsTexture2DEnabled(false), DepthMask(true),
CurrentMatrixMode(0), CurrentActiveTexture(0),
OSXDevice(device), DeviceType(EIDT_OSX) OSXDevice(device), DeviceType(EIDT_OSX)
{ {
#ifdef _DEBUG #ifdef _DEBUG
...@@ -511,9 +507,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -511,9 +507,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params,
Transformation3DChanged(true), AntiAlias(params.AntiAlias), Transformation3DChanged(true), AntiAlias(params.AntiAlias),
RenderTargetTexture(0), CurrentRendertargetSize(0,0), RenderTargetTexture(0), CurrentRendertargetSize(0,0),
ColorFormat(ECF_R8G8B8), CurrentTarget(ERT_FRAME_BUFFER), Params(params), ColorFormat(ECF_R8G8B8), CurrentTarget(ERT_FRAME_BUFFER), Params(params),
IsDepthTestEnabled(false), IsTexture2DEnabled(false), DepthMask(true), BridgeCalls(0), X11Device(device), DeviceType(EIDT_X11)
CurrentMatrixMode(0), CurrentActiveTexture(0),
X11Device(device), DeviceType(EIDT_X11)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("COpenGLDriver"); setDebugName("COpenGLDriver");
...@@ -606,9 +600,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -606,9 +600,7 @@ COpenGLDriver::COpenGLDriver(const SIrrlichtCreationParameters& params,
Transformation3DChanged(true), AntiAlias(params.AntiAlias), Transformation3DChanged(true), AntiAlias(params.AntiAlias),
RenderTargetTexture(0), CurrentRendertargetSize(0,0), RenderTargetTexture(0), CurrentRendertargetSize(0,0),
ColorFormat(ECF_R8G8B8), CurrentTarget(ERT_FRAME_BUFFER), Params(params), ColorFormat(ECF_R8G8B8), CurrentTarget(ERT_FRAME_BUFFER), Params(params),
IsDepthTestEnabled(false), IsTexture2DEnabled(false), DepthMask(true), BridgeCalls(0), SDLDevice(device), DeviceType(EIDT_SDL)
CurrentMatrixMode(0), CurrentActiveTexture(0),
SDLDevice(device), DeviceType(EIDT_SDL)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("COpenGLDriver"); setDebugName("COpenGLDriver");
...@@ -631,6 +623,9 @@ COpenGLDriver::~COpenGLDriver() ...@@ -631,6 +623,9 @@ COpenGLDriver::~COpenGLDriver()
if (CgContext) if (CgContext)
cgDestroyContext(CgContext); cgDestroyContext(CgContext);
#endif #endif
if (BridgeCalls)
delete BridgeCalls;
RequestedLights.clear(); RequestedLights.clear();
...@@ -688,6 +683,10 @@ bool COpenGLDriver::genericDriverInit() ...@@ -688,6 +683,10 @@ bool COpenGLDriver::genericDriverInit()
CurrentTexture.clear(); CurrentTexture.clear();
// load extensions // load extensions
initExtensions(Params.Stencilbuffer); initExtensions(Params.Stencilbuffer);
if (!BridgeCalls)
BridgeCalls = new COpenGLCallBridge(this);
if (queryFeature(EVDF_ARB_GLSL)) if (queryFeature(EVDF_ARB_GLSL))
{ {
char buf[32]; char buf[32];
...@@ -890,11 +889,9 @@ void COpenGLDriver::clearBuffers(bool backBuffer, bool zBuffer, bool stencilBuff ...@@ -890,11 +889,9 @@ void COpenGLDriver::clearBuffers(bool backBuffer, bool zBuffer, bool stencilBuff
if (zBuffer) if (zBuffer)
{ {
if (!DepthMask) BridgeCalls->setDepthMask(true);
glDepthMask(GL_TRUE);
LastMaterial.ZWriteEnable=true; LastMaterial.ZWriteEnable=true;
DepthMask = true;
mask |= GL_DEPTH_BUFFER_BIT; mask |= GL_DEPTH_BUFFER_BIT;
} }
...@@ -962,7 +959,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri ...@@ -962,7 +959,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri
case ETS_WORLD: case ETS_WORLD:
{ {
// OpenGL only has a model matrix, view and world is not existent. so lets fake these two. // OpenGL only has a model matrix, view and world is not existent. so lets fake these two.
setGlMatrixMode(GL_MODELVIEW); BridgeCalls->setMatrixMode(GL_MODELVIEW);
// first load the viewing transformation for user clip planes // first load the viewing transformation for user clip planes
glLoadMatrixf((Matrices[ETS_VIEW]).pointer()); glLoadMatrixf((Matrices[ETS_VIEW]).pointer());
...@@ -978,7 +975,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri ...@@ -978,7 +975,7 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri
break; break;
case ETS_PROJECTION: case ETS_PROJECTION:
{ {
setGlMatrixMode(GL_PROJECTION); BridgeCalls->setMatrixMode(GL_PROJECTION);
glLoadMatrixf(mat.pointer()); glLoadMatrixf(mat.pointer());
} }
break; break;
...@@ -992,9 +989,9 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri ...@@ -992,9 +989,9 @@ void COpenGLDriver::setTransform(E_TRANSFORMATION_STATE state, const core::matri
const bool isRTT = Material.getTexture(i) && Material.getTexture(i)->isRenderTarget(); const bool isRTT = Material.getTexture(i) && Material.getTexture(i)->isRenderTarget();
setGlActiveTexture(GL_TEXTURE0_ARB + i); BridgeCalls->setActiveTexture(GL_TEXTURE0_ARB + i);
setGlMatrixMode(GL_TEXTURE); BridgeCalls->setMatrixMode(GL_TEXTURE);
if (!isRTT && mat.isIdentity() ) if (!isRTT && mat.isIdentity() )
glLoadIdentity(); glLoadIdentity();
else else
...@@ -1797,8 +1794,8 @@ void COpenGLDriver::draw2DVertexPrimitiveList(const void* vertices, u32 vertexCo ...@@ -1797,8 +1794,8 @@ void COpenGLDriver::draw2DVertexPrimitiveList(const void* vertices, u32 vertexCo
else else
setRenderStates2DMode(Material.MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA, (Material.getTexture(0) != 0), Material.MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL); setRenderStates2DMode(Material.MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA, (Material.getTexture(0) != 0), Material.MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL);
if (MultiTextureExtension) if (MultiTextureExtension)
extGlClientActiveTexture(GL_TEXTURE0_ARB); extGlClientActiveTexture(GL_TEXTURE0_ARB);
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
...@@ -2469,16 +2466,7 @@ bool COpenGLDriver::disableTextures(u32 fromStage) ...@@ -2469,16 +2466,7 @@ bool COpenGLDriver::disableTextures(u32 fromStage)
for (u32 i=fromStage; i<MaxSupportedTextures; ++i) for (u32 i=fromStage; i<MaxSupportedTextures; ++i)
{ {
result &= setActiveTexture(i, 0); result &= setActiveTexture(i, 0);
BridgeCalls->setTexture(i, true);
if(DriverStage.getTexture(i) != 0 || !DriverStage.getTextureFixedPipeline(i))
{
setGlActiveTexture(GL_TEXTURE0_ARB + i);
glDisable(GL_TEXTURE_2D);
DriverStage.setTexture(i, 0);
DriverStage.setTextureFixedPipeline(i, true);
}
} }
return result; return result;
} }
...@@ -2581,10 +2569,10 @@ void COpenGLDriver::setRenderStates3DMode() ...@@ -2581,10 +2569,10 @@ void COpenGLDriver::setRenderStates3DMode()
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// switch back the matrices // switch back the matrices
setGlMatrixMode(GL_MODELVIEW); BridgeCalls->setMatrixMode(GL_MODELVIEW);
glLoadMatrixf((Matrices[ETS_VIEW] * Matrices[ETS_WORLD]).pointer()); glLoadMatrixf((Matrices[ETS_VIEW] * Matrices[ETS_WORLD]).pointer());
setGlMatrixMode(GL_PROJECTION); BridgeCalls->setMatrixMode(GL_PROJECTION);
glLoadMatrixf(Matrices[ETS_PROJECTION].pointer()); glLoadMatrixf(Matrices[ETS_PROJECTION].pointer());
ResetRenderStates = true; ResetRenderStates = true;
...@@ -2876,30 +2864,13 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -2876,30 +2864,13 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
if (!CurrentTexture[i]) if (!CurrentTexture[i])
{ {
if(DriverStage.getTexture(i) != 0 || !DriverStage.getTextureFixedPipeline(i)) BridgeCalls->setTexture(i, fixedPipeline);
{
setGlActiveTexture(GL_TEXTURE0_ARB + i);
glDisable(GL_TEXTURE_2D);
DriverStage.setTexture(i, 0);
DriverStage.setTextureFixedPipeline(i, true);
}
continue; continue;
} }
else else
{ {
if(DriverStage.getTexture(i) != CurrentTexture[i] || !DriverStage.getTextureFixedPipeline(i)) BridgeCalls->setTexture(i, fixedPipeline);
{
setGlActiveTexture(GL_TEXTURE0_ARB + i);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tmpTexture->getOpenGLTextureName());
DriverStage.setTexture(i, CurrentTexture[i]);
DriverStage.setTextureFixedPipeline(i, true);
}
setTransform ((E_TRANSFORMATION_STATE) (ETS_TEXTURE_0 + i), material.getTextureMatrix(i)); setTransform ((E_TRANSFORMATION_STATE) (ETS_TEXTURE_0 + i), material.getTextureMatrix(i));
} }
...@@ -2908,14 +2879,7 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -2908,14 +2879,7 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
{ {
if (CurrentTexture[i]) if (CurrentTexture[i])
{ {
if(DriverStage.getTexture(i) != CurrentTexture[i]) BridgeCalls->setTexture(i, fixedPipeline);
{
setGlActiveTexture(GL_TEXTURE0_ARB + i);
glBindTexture(GL_TEXTURE_2D, tmpTexture->getOpenGLTextureName());
DriverStage.setTexture(i, CurrentTexture[i]);
DriverStage.setTextureFixedPipeline(i, false);
}
} }
else else
continue; continue;
...@@ -3038,90 +3002,28 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -3038,90 +3002,28 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
switch (material.ZBuffer) switch (material.ZBuffer)
{ {
case ECFN_NEVER: case ECFN_NEVER:
{ BridgeCalls->setDepthFunc(0);
if(IsDepthTestEnabled)
{
glDisable(GL_DEPTH_TEST);
IsDepthTestEnabled = false;
}
}
break; break;
case ECFN_LESSEQUAL: case ECFN_LESSEQUAL:
{ BridgeCalls->setDepthFunc(GL_LEQUAL);
if(!IsDepthTestEnabled)
{
glEnable(GL_DEPTH_TEST);
IsDepthTestEnabled = true;
}
glDepthFunc(GL_LEQUAL);
}
break; break;
case ECFN_EQUAL: case ECFN_EQUAL:
{ BridgeCalls->setDepthFunc(GL_EQUAL);
if(!IsDepthTestEnabled)
{
glEnable(GL_DEPTH_TEST);
IsDepthTestEnabled = true;
}
glDepthFunc(GL_EQUAL);
}
break; break;
case ECFN_LESS: case ECFN_LESS:
{ BridgeCalls->setDepthFunc(GL_LESS);
if(!IsDepthTestEnabled)
{
glEnable(GL_DEPTH_TEST);
IsDepthTestEnabled = true;
}
glDepthFunc(GL_LESS);
}
break; break;
case ECFN_NOTEQUAL: case ECFN_NOTEQUAL:
{ BridgeCalls->setDepthFunc(GL_NOTEQUAL);
if(!IsDepthTestEnabled)
{
glEnable(GL_DEPTH_TEST);
IsDepthTestEnabled = true;
}
glDepthFunc(GL_NOTEQUAL);
}
break; break;
case ECFN_GREATEREQUAL: case ECFN_GREATEREQUAL:
{ BridgeCalls->setDepthFunc(GL_GEQUAL);
if(!IsDepthTestEnabled)
{
glEnable(GL_DEPTH_TEST);
IsDepthTestEnabled = true;
}
glDepthFunc(GL_GEQUAL);
}
break; break;
case ECFN_GREATER: case ECFN_GREATER:
{ BridgeCalls->setDepthFunc(GL_GREATER);
if(!IsDepthTestEnabled)
{
glEnable(GL_DEPTH_TEST);
IsDepthTestEnabled = true;
}
glDepthFunc(GL_GREATER);
}
break; break;
case ECFN_ALWAYS: case ECFN_ALWAYS:
{ BridgeCalls->setDepthFunc(GL_ALWAYS);
if(!IsDepthTestEnabled)
{
glEnable(GL_DEPTH_TEST);
IsDepthTestEnabled = true;
}
glDepthFunc(GL_ALWAYS);
}
break; break;
} }
} }
...@@ -3130,21 +3032,9 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -3130,21 +3032,9 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
// if (resetAllRenderStates || lastmaterial.ZWriteEnable != material.ZWriteEnable) // if (resetAllRenderStates || lastmaterial.ZWriteEnable != material.ZWriteEnable)
{ {
if (material.ZWriteEnable && (AllowZWriteOnTransparent || !material.isTransparent())) if (material.ZWriteEnable && (AllowZWriteOnTransparent || !material.isTransparent()))
{ BridgeCalls->setDepthMask(true);
if (!DepthMask)
{
glDepthMask(GL_TRUE);
DepthMask = true;
}
}
else else
{ BridgeCalls->setDepthMask(false);
if (DepthMask)
{
glDepthMask(GL_FALSE);
DepthMask = false;
}
}
} }
// back face culling // back face culling
...@@ -3367,7 +3257,7 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -3367,7 +3257,7 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
// be sure to leave in texture stage 0 // be sure to leave in texture stage 0
if (fixedPipeline) if (fixedPipeline)
setGlActiveTexture(GL_TEXTURE0_ARB); BridgeCalls->setActiveTexture(GL_TEXTURE0_ARB);
} }
...@@ -3385,7 +3275,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh ...@@ -3385,7 +3275,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
{ {
bool BindedTexture = false; bool BindedTexture = false;
setGlActiveTexture(GL_TEXTURE0_ARB); BridgeCalls->setActiveTexture(GL_TEXTURE0_ARB);
if (CurrentRenderMode != ERM_2D || Transformation3DChanged) if (CurrentRenderMode != ERM_2D || Transformation3DChanged)
{ {
...@@ -3397,7 +3287,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh ...@@ -3397,7 +3287,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
} }
if (Transformation3DChanged) if (Transformation3DChanged)
{ {
setGlMatrixMode(GL_PROJECTION); BridgeCalls->setMatrixMode(GL_PROJECTION);
const core::dimension2d<u32>& renderTargetSize = getCurrentRenderTargetSize(); const core::dimension2d<u32>& renderTargetSize = getCurrentRenderTargetSize();
core::matrix4 m(core::matrix4::EM4CONST_NOTHING); core::matrix4 m(core::matrix4::EM4CONST_NOTHING);
...@@ -3405,12 +3295,12 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh ...@@ -3405,12 +3295,12 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
m.setTranslation(core::vector3df(-1,1,0)); m.setTranslation(core::vector3df(-1,1,0));
glLoadMatrixf(m.pointer()); glLoadMatrixf(m.pointer());
setGlMatrixMode(GL_MODELVIEW); BridgeCalls->setMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
glTranslatef(0.375f, 0.375f, 0.0f); glTranslatef(0.375f, 0.375f, 0.0f);
// Make sure we set first texture matrix // Make sure we set first texture matrix
setGlActiveTexture(GL_TEXTURE0_ARB); BridgeCalls->setActiveTexture(GL_TEXTURE0_ARB);
Transformation3DChanged = false; Transformation3DChanged = false;
} }
...@@ -3453,18 +3343,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh ...@@ -3453,18 +3343,7 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
if (texture) if (texture)
{ {
if(!BindedTexture && CurrentTexture[0]) if(!BindedTexture && CurrentTexture[0])
{ BridgeCalls->setTexture(0, true);
if(DriverStage.getTexture(0) != CurrentTexture[0] || !DriverStage.getTextureFixedPipeline(0))
{
setGlActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, static_cast<const COpenGLTexture*>(CurrentTexture[0])->getOpenGLTextureName());
DriverStage.setTexture(0, CurrentTexture[0]);
DriverStage.setTextureFixedPipeline(0, true);
}
}
if (!OverrideMaterial2DEnabled) if (!OverrideMaterial2DEnabled)
{ {
...@@ -3786,9 +3665,9 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>& ...@@ -3786,9 +3665,9 @@ void COpenGLDriver::drawStencilShadowVolume(const core::array<core::vector3df>&
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glDisable(GL_FOG); glDisable(GL_FOG);
glDepthFunc(GL_LESS); BridgeCalls->setDepthFunc(GL_LESS);
glDepthMask(GL_FALSE); // no depth buffer writing BridgeCalls->setDepthMask(false);
DepthMask = false;
if (debugDataVisible & scene::EDS_MESH_WIRE_OVERLAY) if (debugDataVisible & scene::EDS_MESH_WIRE_OVERLAY)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
if (!(debugDataVisible & (scene::EDS_SKELETON|scene::EDS_MESH_WIRE_OVERLAY))) if (!(debugDataVisible & (scene::EDS_SKELETON|scene::EDS_MESH_WIRE_OVERLAY)))
...@@ -3918,8 +3797,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef ...@@ -3918,8 +3797,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glDisable(GL_FOG); glDisable(GL_FOG);
glDepthMask(GL_FALSE); BridgeCalls->setDepthMask(false);
DepthMask = false;
glShadeModel(GL_FLAT); glShadeModel(GL_FLAT);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
...@@ -3932,10 +3810,10 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef ...@@ -3932,10 +3810,10 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
// draw a shadow rectangle covering the entire screen using stencil buffer // draw a shadow rectangle covering the entire screen using stencil buffer
setGlMatrixMode(GL_MODELVIEW); BridgeCalls->setMatrixMode(GL_MODELVIEW);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
setGlMatrixMode(GL_PROJECTION); BridgeCalls->setMatrixMode(GL_PROJECTION);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
...@@ -3959,7 +3837,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef ...@@ -3959,7 +3837,7 @@ void COpenGLDriver::drawStencilShadow(bool clearStencilBuffer, video::SColor lef
// restore settings // restore settings
glPopMatrix(); glPopMatrix();
setGlMatrixMode(GL_MODELVIEW); BridgeCalls->setMatrixMode(GL_MODELVIEW);
glPopMatrix(); glPopMatrix();
glPopAttrib(); glPopAttrib();
} }
...@@ -4342,7 +4220,7 @@ bool COpenGLDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuff ...@@ -4342,7 +4220,7 @@ bool COpenGLDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuff
if ((RenderTargetTexture != texture) || if ((RenderTargetTexture != texture) ||
(CurrentTarget==ERT_MULTI_RENDER_TEXTURES)) (CurrentTarget==ERT_MULTI_RENDER_TEXTURES))
{ {
setGlActiveTexture(GL_TEXTURE0_ARB); BridgeCalls->setActiveTexture(GL_TEXTURE0_ARB);
ResetRenderStates=true; ResetRenderStates=true;
if (RenderTargetTexture!=0) if (RenderTargetTexture!=0)
{ {
...@@ -4931,31 +4809,118 @@ GLenum COpenGLDriver::getZBufferBits() const ...@@ -4931,31 +4809,118 @@ GLenum COpenGLDriver::getZBufferBits() const
} }
return bits; return bits;
} }
void COpenGLDriver::setGlMatrixMode(GLenum mode) COpenGLCallBridge* COpenGLDriver::getBridgeCalls() const
{
if (CurrentMatrixMode != mode)
{
glMatrixMode(mode);
CurrentMatrixMode = mode;
}
}
void COpenGLDriver::setGlActiveTexture(GLenum texture)
{ {
if (MultiTextureExtension && CurrentActiveTexture != texture) return BridgeCalls;
{
extGlActiveTexture(texture);
CurrentActiveTexture = texture;
}
} }
#ifdef _IRR_COMPILE_WITH_CG_ #ifdef _IRR_COMPILE_WITH_CG_
const CGcontext& COpenGLDriver::getCgContext() const CGcontext& COpenGLDriver::getCgContext()
{ {
return CgContext; return CgContext;
} }
#endif #endif
COpenGLCallBridge::COpenGLCallBridge(COpenGLDriver* driver) : Driver(driver),
DepthMask(false), DepthFunc(0), DepthTest(false), MatrixMode(GL_MODELVIEW),
ActiveTexture(GL_TEXTURE0_ARB)
{
for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; ++i)
{
Texture[i] = 0;
TextureFixedPipeline[i] = true;
}
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
if(Driver->MultiTextureExtension)
Driver->extGlActiveTexture(GL_TEXTURE0_ARB);
}
void COpenGLCallBridge::setDepthMask(bool enabled)
{
if(DepthMask != enabled)
{
if (enabled)
glDepthMask(GL_TRUE);
else
glDepthMask(GL_FALSE);
DepthMask = enabled;
}
}
void COpenGLCallBridge::setDepthFunc(GLenum mode)
{
if(DepthFunc != mode)
{
if(mode == 0)
{
if(DepthTest)
{
glDisable(GL_DEPTH_TEST);
DepthTest = false;
}
}
else
{
if(!DepthTest)
{
glEnable(GL_DEPTH_TEST);
DepthTest = true;
}
glDepthFunc(mode);
}
DepthFunc = mode;
}
}
void COpenGLCallBridge::setMatrixMode(GLenum mode)
{
if (MatrixMode != mode)
{
glMatrixMode(mode);
MatrixMode = mode;
}
}
void COpenGLCallBridge::setActiveTexture(GLenum texture)
{
if (Driver->MultiTextureExtension && ActiveTexture != texture)
{
Driver->extGlActiveTexture(texture);
ActiveTexture = texture;
}
}
void COpenGLCallBridge::setTexture(u32 stage, bool fixedPipeline)
{
if (stage < MATERIAL_MAX_TEXTURES)
{
if((fixedPipeline && TextureFixedPipeline[stage] != fixedPipeline) || Texture[stage] != Driver->CurrentTexture[stage])
{
setActiveTexture(GL_TEXTURE0_ARB + stage);
if(Driver->CurrentTexture[stage])
{
if(fixedPipeline)
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, static_cast<const COpenGLTexture*>(Driver->CurrentTexture[stage])->getOpenGLTextureName());
}
else if(fixedPipeline)
glDisable(GL_TEXTURE_2D);
TextureFixedPipeline[stage] = fixedPipeline;
Texture[stage] = Driver->CurrentTexture[stage];
}
}
}
} // end namespace } // end namespace
......
...@@ -33,10 +33,12 @@ namespace irr ...@@ -33,10 +33,12 @@ namespace irr
namespace video namespace video
{ {
class COpenGLCallBridge;
class COpenGLTexture; class COpenGLTexture;
class COpenGLDriver : public CNullDriver, public IMaterialRendererServices, public COpenGLExtensionHandler class COpenGLDriver : public CNullDriver, public IMaterialRendererServices, public COpenGLExtensionHandler
{ {
friend class COpenGLCallBridge;
friend class COpenGLTexture; friend class COpenGLTexture;
public: public:
...@@ -411,12 +413,9 @@ namespace video ...@@ -411,12 +413,9 @@ namespace video
//! Get ZBuffer bits. //! Get ZBuffer bits.
GLenum getZBufferBits() const; GLenum getZBufferBits() const;
//! Set the gl matrix mode, if not set already //! Get bridge calls.
void setGlMatrixMode(GLenum mode); COpenGLCallBridge* getBridgeCalls() const;
//! Set active texture, if not set already
void setGlActiveTexture(GLenum texture);
//! Get Cg context //! Get Cg context
#ifdef _IRR_COMPILE_WITH_CG_ #ifdef _IRR_COMPILE_WITH_CG_
...@@ -424,8 +423,8 @@ namespace video ...@@ -424,8 +423,8 @@ namespace video
#endif #endif
private: private:
// Bridge calls.
COpenGLCallBridge* BridgeCalls;
//! clears the zbuffer and color buffer //! clears the zbuffer and color buffer
void clearBuffers(bool backBuffer, bool zBuffer, bool stencilBuffer, SColor color); void clearBuffers(bool backBuffer, bool zBuffer, bool stencilBuffer, SColor color);
...@@ -557,56 +556,6 @@ namespace video ...@@ -557,56 +556,6 @@ namespace video
}; };
STextureStageCache CurrentTexture; STextureStageCache CurrentTexture;
class SDriverStageCache
{
public:
SDriverStageCache()
{
for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
{
CurrentTexture[i] = 0;
CurrentTextureFixedPipeline[i] = true;
}
}
~SDriverStageCache()
{
}
const ITexture* getTexture(u32 stage) const
{
if ((u32)stage < MATERIAL_MAX_TEXTURES)
return CurrentTexture[stage];
else
return 0;
}
void setTexture(u32 stage, const ITexture* tex)
{
if (stage < MATERIAL_MAX_TEXTURES)
CurrentTexture[stage] = tex;
}
bool getTextureFixedPipeline(u32 stage) const
{
if ((u32)stage < MATERIAL_MAX_TEXTURES)
return CurrentTextureFixedPipeline[stage];
else
return true;
}
void setTextureFixedPipeline(u32 stage, bool texFixedPipeline)
{
if (stage < MATERIAL_MAX_TEXTURES)
CurrentTextureFixedPipeline[stage] = texFixedPipeline;
}
private:
const ITexture* CurrentTexture[MATERIAL_MAX_TEXTURES];
bool CurrentTextureFixedPipeline[MATERIAL_MAX_TEXTURES];
};
SDriverStageCache DriverStage;
core::array<ITexture*> DepthTextures; core::array<ITexture*> DepthTextures;
struct SUserClipPlane struct SUserClipPlane
{ {
...@@ -630,14 +579,6 @@ namespace video ...@@ -630,14 +579,6 @@ namespace video
SIrrlichtCreationParameters Params; SIrrlichtCreationParameters Params;
bool IsDepthTestEnabled;
bool IsTexture2DEnabled;
bool DepthMask;
GLenum CurrentMatrixMode;
GLenum CurrentActiveTexture;
//! All the lights that have been requested; a hardware limited //! All the lights that have been requested; a hardware limited
//! number of them will be used at once. //! number of them will be used at once.
struct RequestedLight struct RequestedLight
...@@ -675,6 +616,45 @@ namespace video ...@@ -675,6 +616,45 @@ namespace video
E_DEVICE_TYPE DeviceType; E_DEVICE_TYPE DeviceType;
}; };
//! This bridge between Irlicht pseudo OpenGL calls
//! and true OpenGL calls.
class COpenGLCallBridge
{
public:
COpenGLCallBridge(COpenGLDriver* driver);
// Depth calls.
void setDepthMask(bool enabled);
void setDepthFunc(GLenum mode);
// Matrix calls.
void setMatrixMode(GLenum mode);
// Texture calls.
void setActiveTexture(GLenum texture);
void setTexture(u32 stage, bool fixedPipeline);
private:
COpenGLDriver* Driver;
bool DepthMask;
GLenum DepthFunc;
bool DepthTest;
GLenum MatrixMode;
GLenum ActiveTexture;
const ITexture* Texture[MATERIAL_MAX_TEXTURES];
bool TextureFixedPipeline[MATERIAL_MAX_TEXTURES];
};
} // end namespace video } // end namespace video
} // end namespace irr } // end namespace irr
......
...@@ -269,7 +269,7 @@ public: ...@@ -269,7 +269,7 @@ public:
{ {
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine #ifdef GL_ARB_texture_env_combine
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
...@@ -297,14 +297,14 @@ public: ...@@ -297,14 +297,14 @@ public:
{ {
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
#ifdef GL_ARB_texture_env_combine #ifdef GL_ARB_texture_env_combine
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR); glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR);
#else #else
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_COLOR); glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_COLOR);
#endif #endif
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
} }
} }
}; };
...@@ -625,7 +625,7 @@ public: ...@@ -625,7 +625,7 @@ public:
{ {
// lightmap // lightmap
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine #ifdef GL_ARB_texture_env_combine
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
...@@ -679,7 +679,7 @@ public: ...@@ -679,7 +679,7 @@ public:
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.0f); glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.0f);
#endif #endif
} }
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
} }
} }
} }
...@@ -688,14 +688,14 @@ public: ...@@ -688,14 +688,14 @@ public:
{ {
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine #ifdef GL_ARB_texture_env_combine
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.f ); glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.f );
#else #else
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.f ); glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.f );
#endif #endif
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
} }
} }
...@@ -724,7 +724,7 @@ public: ...@@ -724,7 +724,7 @@ public:
// detail map on second layer // detail map on second layer
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine #ifdef GL_ARB_texture_env_combine
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD_SIGNED_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD_SIGNED_ARB);
...@@ -744,9 +744,9 @@ public: ...@@ -744,9 +744,9 @@ public:
{ {
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
} }
} }
}; };
...@@ -806,7 +806,7 @@ public: ...@@ -806,7 +806,7 @@ public:
{ {
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine #ifdef GL_ARB_texture_env_combine
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
...@@ -830,14 +830,14 @@ public: ...@@ -830,14 +830,14 @@ public:
{ {
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
} }
glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_T);
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
} }
} }
}; };
...@@ -876,7 +876,7 @@ public: ...@@ -876,7 +876,7 @@ public:
#endif #endif
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine #ifdef GL_ARB_texture_env_combine
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
...@@ -907,14 +907,14 @@ public: ...@@ -907,14 +907,14 @@ public:
{ {
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE1_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
} }
glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_T);
if (Driver->queryFeature(EVDF_MULTITEXTURE)) if (Driver->queryFeature(EVDF_MULTITEXTURE))
{ {
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
} }
glDisable(GL_BLEND); glDisable(GL_BLEND);
} }
......
...@@ -316,7 +316,7 @@ void COpenGLTexture::uploadTexture(bool newTexture, void* mipmapData, u32 level) ...@@ -316,7 +316,7 @@ void COpenGLTexture::uploadTexture(bool newTexture, void* mipmapData, u32 level)
if (!newTexture) if (!newTexture)
InternalFormat=oldInternalFormat; InternalFormat=oldInternalFormat;
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, TextureName); glBindTexture(GL_TEXTURE_2D, TextureName);
...@@ -654,7 +654,7 @@ void COpenGLTexture::bindRTT() ...@@ -654,7 +654,7 @@ void COpenGLTexture::bindRTT()
//! Unbind Render Target Texture //! Unbind Render Target Texture
void COpenGLTexture::unbindRTT() void COpenGLTexture::unbindRTT()
{ {
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, TextureName); glBindTexture(GL_TEXTURE_2D, TextureName);
...@@ -708,7 +708,7 @@ COpenGLFBOTexture::COpenGLFBOTexture(const core::dimension2d<u32>& size, ...@@ -708,7 +708,7 @@ COpenGLFBOTexture::COpenGLFBOTexture(const core::dimension2d<u32>& size,
// generate color texture // generate color texture
glGenTextures(1, &TextureName); glGenTextures(1, &TextureName);
Driver->setGlActiveTexture(GL_TEXTURE0_ARB); Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, TextureName); glBindTexture(GL_TEXTURE_2D, TextureName);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment