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 ...@@ -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