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
This diff is collapsed.
......@@ -33,10 +33,12 @@ namespace irr
namespace video
{
class COpenGLCallBridge;
class COpenGLTexture;
class COpenGLDriver : public CNullDriver, public IMaterialRendererServices, public COpenGLExtensionHandler
{
friend class COpenGLCallBridge;
friend class COpenGLTexture;
public:
......@@ -411,12 +413,9 @@ namespace video
//! Get ZBuffer bits.
GLenum getZBufferBits() const;
//! Set the gl matrix mode, if not set already
void setGlMatrixMode(GLenum mode);
//! Set active texture, if not set already
void setGlActiveTexture(GLenum texture);
//! Get bridge calls.
COpenGLCallBridge* getBridgeCalls() const;
//! Get Cg context
#ifdef _IRR_COMPILE_WITH_CG_
......@@ -424,8 +423,8 @@ namespace video
#endif
private:
// Bridge calls.
COpenGLCallBridge* BridgeCalls;
//! clears the zbuffer and color buffer
void clearBuffers(bool backBuffer, bool zBuffer, bool stencilBuffer, SColor color);
......@@ -557,56 +556,6 @@ namespace video
};
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;
struct SUserClipPlane
{
......@@ -630,14 +579,6 @@ namespace video
SIrrlichtCreationParameters Params;
bool IsDepthTestEnabled;
bool IsTexture2DEnabled;
bool DepthMask;
GLenum CurrentMatrixMode;
GLenum CurrentActiveTexture;
//! All the lights that have been requested; a hardware limited
//! number of them will be used at once.
struct RequestedLight
......@@ -675,6 +616,45 @@ namespace video
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 irr
......
......@@ -269,7 +269,7 @@ public:
{
if (Driver->queryFeature(EVDF_MULTITEXTURE))
{
Driver->setGlActiveTexture(GL_TEXTURE1_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
......@@ -297,14 +297,14 @@ public:
{
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);
#ifdef GL_ARB_texture_env_combine
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR);
#else
glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_COLOR);
#endif
Driver->setGlActiveTexture(GL_TEXTURE0_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
}
}
};
......@@ -625,7 +625,7 @@ public:
{
// lightmap
Driver->setGlActiveTexture(GL_TEXTURE1_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
......@@ -679,7 +679,7 @@ public:
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.0f);
#endif
}
Driver->setGlActiveTexture(GL_TEXTURE0_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
}
}
}
......@@ -688,14 +688,14 @@ public:
{
if (Driver->queryFeature(EVDF_MULTITEXTURE))
{
Driver->setGlActiveTexture(GL_TEXTURE1_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 1.f );
#else
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1.f );
#endif
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);
}
}
......@@ -724,7 +724,7 @@ public:
// detail map on second layer
if (Driver->queryFeature(EVDF_MULTITEXTURE))
{
Driver->setGlActiveTexture(GL_TEXTURE1_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD_SIGNED_ARB);
......@@ -744,9 +744,9 @@ public:
{
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);
Driver->setGlActiveTexture(GL_TEXTURE0_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
}
}
};
......@@ -806,7 +806,7 @@ public:
{
if (Driver->queryFeature(EVDF_MULTITEXTURE))
{
Driver->setGlActiveTexture(GL_TEXTURE1_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
......@@ -830,14 +830,14 @@ public:
{
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);
}
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
if (Driver->queryFeature(EVDF_MULTITEXTURE))
{
Driver->setGlActiveTexture(GL_TEXTURE0_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
}
}
};
......@@ -876,7 +876,7 @@ public:
#endif
if (Driver->queryFeature(EVDF_MULTITEXTURE))
{
Driver->setGlActiveTexture(GL_TEXTURE1_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE1_ARB);
#ifdef GL_ARB_texture_env_combine
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
......@@ -907,14 +907,14 @@ public:
{
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);
}
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
if (Driver->queryFeature(EVDF_MULTITEXTURE))
{
Driver->setGlActiveTexture(GL_TEXTURE0_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
}
glDisable(GL_BLEND);
}
......
......@@ -316,7 +316,7 @@ void COpenGLTexture::uploadTexture(bool newTexture, void* mipmapData, u32 level)
if (!newTexture)
InternalFormat=oldInternalFormat;
Driver->setGlActiveTexture(GL_TEXTURE0_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, TextureName);
......@@ -654,7 +654,7 @@ void COpenGLTexture::bindRTT()
//! Unbind Render Target Texture
void COpenGLTexture::unbindRTT()
{
Driver->setGlActiveTexture(GL_TEXTURE0_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, TextureName);
......@@ -708,7 +708,7 @@ COpenGLFBOTexture::COpenGLFBOTexture(const core::dimension2d<u32>& size,
// generate color texture
glGenTextures(1, &TextureName);
Driver->setGlActiveTexture(GL_TEXTURE0_ARB);
Driver->getBridgeCalls()->setActiveTexture(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
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