i'm writting handler for OpenGL texture and i'm thinking about safety and performance. Which level of optimization should remove marked if statements?
struct Texture2D { GLuint ID; inline Texture2D(): ID(0) {}; inline explicit Texture2D(GLuint id): ID(id) {}; ~Texture2D(); void GenTexture(bool regen = false); void DeleteTexture(); void BindTexture(); void Parameterf( GLenum pname, GLfloat param ); void Parameteri( GLenum pname, GLint param ); void glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params ); void glTexParameteriv( GLenum target, GLenum pname, const GLint *params ); static Texture2D binded; }; inline void Texture2D::GenTexture(bool regen) { if(ID){ if(regen) DeleteTexture(); else return; } glGenTextures(1,&ID); } inline void Texture2D::DeleteTexture() { glDeleteTextures(1,&ID); ID = 0; } inline void Texture2D::BindTexture() { glBindTexture(GL_TEXTURE_2D, ID); binded.ID = ID; } inline void Texture2D::Parameterf( GLenum pname, GLfloat param ){ if(binded.ID == ID) // THIS BindTexture(); // THIS glTexParameterf(GL_TEXTURE_2D,pname,param); } inline void Texture2D::Parameteri( GLenum pname, GLint param ){ if(binded.ID == ID) // THIS BindTexture(); // THIS glTexParameterf(GL_TEXTURE_2D,pname,param); } inline Texture2D::~Texture2D() { DeleteTexture(); } // in this function void loadTexture(...) { Texture2D t; t.GenTexture(); t.BindTexture(); // if statements in next functions t.Parameterf(...); t.Parameterf(...); t.Parameterf(...); t.Parameterf(...); t.Parameterf(...); }
!=? (Also, past participle of bind is bound </grammar nazi>)!=? The compiler is going to have a VERY tough time proving that the static variable isn't modified during opengl calls, so in general it can't eliminate the conditional test.