Commit 21585e94 authored by Lars Krecklau's avatar Lars Krecklau

Removed static contexts from the opengl object. In future, this has to be...

Removed static contexts from the opengl object. In future, this has to be handled by our opengl wrapper, which will hold a copy of the gl state on cpu side.
Made all opengl contexts not copyable.
Created a macro for the shared typedefs which directly creates a const version of the pointer.
Started to change some opengl object functions to be non-const although they might not change any class members, because the function still might change something on gpu side. Therfore, returning the context of any opengl object is also non-const now!
Changed the renderbuffer constructor to just create the context and moved the rest to its corresponding controller.
Removed own type enums in opengl objects => ONLY use the orginial GLenums here!
parent 9c1591ea
...@@ -7,9 +7,13 @@ ...@@ -7,9 +7,13 @@
#define ACGL_BASE_MACROS_HH #define ACGL_BASE_MACROS_HH
//Macro to make a class not copyable //Macro to make a class not copyable
#define NOT_COPYABLE(Class) private:\ #define ACGL_NOT_COPYABLE(Class) \
Class(const Class& other){ }\ private:\
void operator=(Class& other){ } Class(const Class& other){ }\
void operator=(Class& other){ }
#define ACGL_SHARED_TYPEDEF(Class) \
typedef std::tr1::shared_ptr<Class> Shared ## Class;
#endif // MACROS_HH #endif // MACROS_HH
...@@ -40,7 +40,7 @@ public: ...@@ -40,7 +40,7 @@ public:
// ============================================================================================ METHODS \/ // ============================================================================================ METHODS \/
// ==================================================================================================== \/ // ==================================================================================================== \/
public: public:
inline FrameBufferControl& size (GLsizei _width, GLsizei _height) { mWidth = _width; mHeight = _height; return *this; } inline FrameBufferControl& size (GLsizei _width, GLsizei _height) { mWidth = _width; mHeight = _height; return *this; }
inline FrameBufferControl& depthTexture (const SharedTexture& _pDepthTexture) { mDepthAttachment.texture = _pDepthTexture; return *this; } inline FrameBufferControl& depthTexture (const SharedTexture& _pDepthTexture) { mDepthAttachment.texture = _pDepthTexture; return *this; }
inline FrameBufferControl& depthRenderBuffer (const SharedRenderBuffer& _pDepthRenderBuffer) { mDepthAttachment.renderBuffer = _pDepthRenderBuffer; return *this; } inline FrameBufferControl& depthRenderBuffer (const SharedRenderBuffer& _pDepthRenderBuffer) { mDepthAttachment.renderBuffer = _pDepthRenderBuffer; return *this; }
......
...@@ -41,10 +41,9 @@ public: ...@@ -41,10 +41,9 @@ public:
public: public:
virtual SharedRenderBuffer create(void) virtual SharedRenderBuffer create(void)
{ {
return SharedRenderBuffer(new RenderBuffer( SharedRenderBuffer renderBuffer(new RenderBuffer(mInternalFormat));
mWidth, renderBuffer->setSize(mWidth, mHeight);
mHeight, return renderBuffer;
mInternalFormat));
} }
// =================================================================================================== \/ // =================================================================================================== \/
......
...@@ -24,7 +24,7 @@ class ShaderControlFile : public Resource::FileController<Shader> ...@@ -24,7 +24,7 @@ class ShaderControlFile : public Resource::FileController<Shader>
public: public:
ShaderControlFile(const std::string& _filename) ShaderControlFile(const std::string& _filename)
: Resource::FileController<Shader>(_filename, Base::Settings::the()->getFullShaderPath()), : Resource::FileController<Shader>(_filename, Base::Settings::the()->getFullShaderPath()),
mType(Shader::ShaderTypeInvalid) mType(GL_INVALID_ENUM)
{} {}
virtual ~ShaderControlFile(void) {} virtual ~ShaderControlFile(void) {}
......
...@@ -68,7 +68,7 @@ public: ...@@ -68,7 +68,7 @@ public:
texture->bind(); texture->bind();
texture->setParameter(GL_TEXTURE_MIN_FILTER, mMinFilter == 0 ? GL_NEAREST : mMinFilter); texture->setParameter(GL_TEXTURE_MIN_FILTER, mMinFilter == 0 ? GL_NEAREST : mMinFilter);
texture->setParameter(GL_TEXTURE_MAG_FILTER, mMagFilter == 0 ? GL_NEAREST : mMagFilter); texture->setParameter(GL_TEXTURE_MAG_FILTER, mMagFilter == 0 ? GL_NEAREST : mMagFilter);
texture->setRenderTarget(mWidth, mHeight, mDepth); texture->setSize(mWidth, mHeight, mDepth);
return texture; return texture;
} }
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <ACGL/ACGL.hh> #include <ACGL/ACGL.hh>
#include <ACGL/Base/Macros.hh>
#include <ACGL/OpenGL/GL.hh> #include <ACGL/OpenGL/GL.hh>
#include <ACGL/OpenGL/Tools.hh> #include <ACGL/OpenGL/Tools.hh>
...@@ -20,11 +21,7 @@ namespace OpenGL{ ...@@ -20,11 +21,7 @@ namespace OpenGL{
class ArrayBuffer class ArrayBuffer
{ {
// ======================================================================================================== \/ ACGL_NOT_COPYABLE(ArrayBuffer)
// ============================================================================================ GPU CONTEXT \/
// ======================================================================================================== \/
private:
static GLuint sArrayBufferContext;
// ==================================================================================================== \/ // ==================================================================================================== \/
// ============================================================================================ STRUCTS \/ // ============================================================================================ STRUCTS \/
...@@ -75,7 +72,7 @@ public: ...@@ -75,7 +72,7 @@ public:
// ============================================================================================ GETTERS \/ // ============================================================================================ GETTERS \/
// ==================================================================================================== \/ // ==================================================================================================== \/
public: public:
inline GLuint getContext (void) const { return mContext; } inline GLuint getContext (void) { return mContext; }
inline GLenum getUsage (void) const { return mUsage; } inline GLenum getUsage (void) const { return mUsage; }
inline GLenum getMode (void) const { return mMode; } inline GLenum getMode (void) const { return mMode; }
inline GLsizei getElements (void) const { return mElements; } inline GLsizei getElements (void) const { return mElements; }
...@@ -129,11 +126,7 @@ public: ...@@ -129,11 +126,7 @@ public:
//! Bind this buffer //! Bind this buffer
inline void bind(void) const inline void bind(void) const
{ {
if(sArrayBufferContext == mContext)
return;
glBindBuffer(GL_ARRAY_BUFFER, mContext); glBindBuffer(GL_ARRAY_BUFFER, mContext);
sArrayBufferContext = mContext;
} }
inline void setPointer(AttributeVec::size_type _indexInArray, GLuint _indexInShader) const inline void setPointer(AttributeVec::size_type _indexInArray, GLuint _indexInShader) const
...@@ -158,8 +151,10 @@ public: ...@@ -158,8 +151,10 @@ public:
} }
//! Set data for this buffer //! Set data for this buffer
inline void setData(const GLvoid* _pData) const //! Note: The function is not const, because it changes the corresponding GPU data
inline void setData(const GLvoid* _pData)
{ {
glBindBuffer(GL_ARRAY_BUFFER, mContext);
glBufferData( glBufferData(
GL_ARRAY_BUFFER, GL_ARRAY_BUFFER,
mStride * mElements, mStride * mElements,
...@@ -171,6 +166,7 @@ public: ...@@ -171,6 +166,7 @@ public:
inline void setData(const GLvoid* _pData, GLsizei _elements) inline void setData(const GLvoid* _pData, GLsizei _elements)
{ {
mElements = _elements; mElements = _elements;
glBindBuffer(GL_ARRAY_BUFFER, mContext);
glBufferData( glBufferData(
GL_ARRAY_BUFFER, GL_ARRAY_BUFFER,
mStride * mElements, mStride * mElements,
...@@ -190,7 +186,7 @@ protected: ...@@ -190,7 +186,7 @@ protected:
AttributeVec mAttributes; AttributeVec mAttributes;
}; };
typedef std::tr1::shared_ptr<ArrayBuffer> SharedArrayBuffer; ACGL_SHARED_TYPEDEF(ArrayBuffer)
} // OpenGL } // OpenGL
} // ACGL } // ACGL
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <ACGL/ACGL.hh> #include <ACGL/ACGL.hh>
#include <ACGL/Base/Macros.hh>
#include <ACGL/OpenGL/GL.hh> #include <ACGL/OpenGL/GL.hh>
#include <ACGL/OpenGL/Tools.hh> #include <ACGL/OpenGL/Tools.hh>
...@@ -18,11 +19,8 @@ namespace OpenGL{ ...@@ -18,11 +19,8 @@ namespace OpenGL{
class ElementArrayBuffer class ElementArrayBuffer
{ {
// ======================================================================================================== \/ ACGL_NOT_COPYABLE(ElementArrayBuffer)
// ============================================================================================ GPU CONTEXT \/
// ======================================================================================================== \/
private:
static GLuint sElementArrayBufferContext;
// ========================================================================================================= \/ // ========================================================================================================= \/
// ============================================================================================ CONSTRUCTORS \/ // ============================================================================================ CONSTRUCTORS \/
// ========================================================================================================= \/ // ========================================================================================================= \/
...@@ -55,7 +53,7 @@ public: ...@@ -55,7 +53,7 @@ public:
// ============================================================================================ GETTERS \/ // ============================================================================================ GETTERS \/
// ==================================================================================================== \/ // ==================================================================================================== \/
public: public:
inline GLuint getContext (void) const { return mContext; } inline GLuint getContext (void) { return mContext; }
inline GLenum getUsage (void) const { return mUsage; } inline GLenum getUsage (void) const { return mUsage; }
inline GLenum getMode (void) const { return mMode; } inline GLenum getMode (void) const { return mMode; }
inline GLsizei getElements (void) const { return mElements; } inline GLsizei getElements (void) const { return mElements; }
...@@ -82,11 +80,7 @@ public: ...@@ -82,11 +80,7 @@ public:
//! Bind this buffer //! Bind this buffer
inline void bind(void) const inline void bind(void) const
{ {
if(sElementArrayBufferContext == mContext)
return;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mContext); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mContext);
sElementArrayBufferContext = mContext;
} }
void draw(void) const void draw(void) const
...@@ -95,9 +89,11 @@ public: ...@@ -95,9 +89,11 @@ public:
} }
//! Set data for this buffer //! Set data for this buffer
//! Note: The function is not const, because it changes the corresponding GPU data
inline void setData( inline void setData(
const GLvoid* _pData) const GLvoid* _pData)
{ {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mContext);
glBufferData( glBufferData(
GL_ELEMENT_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER,
mElements * mSizeOfType, mElements * mSizeOfType,
...@@ -111,6 +107,7 @@ public: ...@@ -111,6 +107,7 @@ public:
GLsizei _elements) GLsizei _elements)
{ {
mElements = _elements; mElements = _elements;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mContext);
glBufferData( glBufferData(
GL_ELEMENT_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER,
mElements * mSizeOfType, mElements * mSizeOfType,
...@@ -130,7 +127,7 @@ protected: ...@@ -130,7 +127,7 @@ protected:
GLint mSizeOfType; GLint mSizeOfType;
}; };
typedef std::tr1::shared_ptr<ElementArrayBuffer> SharedElementArrayBuffer; ACGL_SHARED_TYPEDEF(ElementArrayBuffer)
} // OpenGL } // OpenGL
} // ACGL } // ACGL
......
...@@ -24,12 +24,12 @@ ...@@ -24,12 +24,12 @@
#include <ACGL/ACGL.hh> #include <ACGL/ACGL.hh>
#include <ACGL/Base/Macros.hh>
#include <ACGL/Base/StringOperations.hh>
#include <ACGL/OpenGL/GL.hh> #include <ACGL/OpenGL/GL.hh>
#include <ACGL/OpenGL/Tools.hh> #include <ACGL/OpenGL/Tools.hh>
#include <ACGL/OpenGL/Objects/RenderBuffer.hh> #include <ACGL/OpenGL/Objects/RenderBuffer.hh>
#include <ACGL/OpenGL/Objects/Texture.hh> #include <ACGL/OpenGL/Objects/Texture.hh>
#include <ACGL/Base/StringOperations.hh>
#include <tr1/memory> #include <tr1/memory>
...@@ -38,11 +38,7 @@ namespace OpenGL{ ...@@ -38,11 +38,7 @@ namespace OpenGL{
class FrameBuffer class FrameBuffer
{ {
// ======================================================================================================== \/ ACGL_NOT_COPYABLE(FrameBuffer)
// ============================================================================================ GPU CONTEXT \/
// ======================================================================================================== \/
private:
static GLuint sFrameBufferContext;
// =================================================================================================== \/ // =================================================================================================== \/
// ============================================================================================ STATIC \/ // ============================================================================================ STATIC \/
...@@ -62,14 +58,6 @@ public: ...@@ -62,14 +58,6 @@ public:
SharedRenderBuffer renderBuffer; SharedRenderBuffer renderBuffer;
}; };
// Per default an FBO is used for reading (glReadPixels etc) and drawing (glDraw*) but a
// read-only/draw-only setup is also possible.
enum TargetType {
READ_FRAMEBUFFER = GL_READ_FRAMEBUFFER,
DRAW_FRAMEBUFFER = GL_DRAW_FRAMEBUFFER,
READ_DRAW_FRAMEBUFFER = GL_FRAMEBUFFER
};
// ===================================================================================================== \/ // ===================================================================================================== \/
// ============================================================================================ TYPEDEFS \/ // ============================================================================================ TYPEDEFS \/
// ===================================================================================================== \/ // ===================================================================================================== \/
...@@ -111,7 +99,6 @@ public: ...@@ -111,7 +99,6 @@ public:
inline GLuint getContext (void) const { return mContext; } inline GLuint getContext (void) const { return mContext; }
inline GLsizei getWidth (void) const { return mWidth; } inline GLsizei getWidth (void) const { return mWidth; }
inline GLsizei getHeight (void) const { return mHeight; } inline GLsizei getHeight (void) const { return mHeight; }
inline GLsizei getDrawBuffers (void) const { return mDrawBuffers; }
inline const AttachmentVec& getColorAttachments (void) const { return mColorAttachments; } inline const AttachmentVec& getColorAttachments (void) const { return mColorAttachments; }
inline const Attachment& getDepthAttachment (void) const { return mDepthAttachment; } inline const Attachment& getDepthAttachment (void) const { return mDepthAttachment; }
...@@ -119,37 +106,40 @@ public: ...@@ -119,37 +106,40 @@ public:
// ============================================================================================ WRAPPERS \/ // ============================================================================================ WRAPPERS \/
// ===================================================================================================== \/ // ===================================================================================================== \/
public: public:
inline void bindAsRenderTarget(void) const
{
bind();
setDrawBuffers();
}
/** /**
* Per default a FrameBuffer gets used for read/write operations, but we can * Per default a FrameBuffer gets used for read/write operations, but we can
* bind two different FrameBuffers for these operations! * bind two different FrameBuffers for these operations!
*/ */
inline void bind( TargetType _type = READ_DRAW_FRAMEBUFFER ) const inline void bind(GLenum _type = GL_FRAMEBUFFER) const
{ {
if(sFrameBufferContext == mContext)
return;
glBindFramebuffer(_type, mContext); glBindFramebuffer(_type, mContext);
openGLRareError(); // glBindFramebuffer can only fail if the contect is no valid FBO which shouldn't happen using this framework openGLRareError(); // glBindFramebuffer can only fail if the contect is no valid FBO which shouldn't happen using this framework
sFrameBufferContext = mContext;
} }
inline void setDrawBuffers(void) const inline void bindAsRenderTarget(GLenum _type = GL_FRAMEBUFFER) const
{ {
glDrawBuffers(mDrawBuffers, msBuffers); bind(_type);
openGLRareError(); setDrawBuffers();
glViewport(0, 0, mWidth, mHeight);
} }
inline void setViewport(void) const inline void bindAsRenderTarget(GLint _x, GLint _y, GLsizei _w, GLsizei _h, GLenum _type = GL_FRAMEBUFFER) const
{ {
bind(_type);
setDrawBuffers();
glViewport(0, 0, mWidth, mHeight); glViewport(0, 0, mWidth, mHeight);
} }
inline bool isFrameBufferComplete(void) const
{
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
Utils::error() << "Failed to make complete FrameBuffer object: " << (glCheckFramebufferStatus(GL_FRAMEBUFFER)) << std::endl;
return false;
}
return true;
}
inline bool attachColorRenderBuffer(const SharedRenderBuffer& _renderBuffer) inline bool attachColorRenderBuffer(const SharedRenderBuffer& _renderBuffer)
{ {
if(_renderBuffer->getWidth() != mWidth && _renderBuffer->getHeight() != mHeight) if(_renderBuffer->getWidth() != mWidth && _renderBuffer->getHeight() != mHeight)
...@@ -228,22 +218,13 @@ public: ...@@ -228,22 +218,13 @@ public:
return true; return true;
} }
inline bool isFrameBufferComplete(void) private:
inline void setDrawBuffers(void) const
{ {
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) glDrawBuffers(mDrawBuffers, msBuffers);
{ openGLRareError();
Utils::error() << "Failed to make complete FrameBuffer object: " << (glCheckFramebufferStatus(GL_FRAMEBUFFER)) << std::endl;
return false;
}
return true;
} }
// ==================================================================================================== \/
// ============================================================================================ METHODS \/
// ==================================================================================================== \/
protected:
void clean(void);
// =================================================================================================== \/ // =================================================================================================== \/
// ============================================================================================ FIELDS \/ // ============================================================================================ FIELDS \/
// =================================================================================================== \/ // =================================================================================================== \/
...@@ -256,7 +237,7 @@ protected: ...@@ -256,7 +237,7 @@ protected:
Attachment mDepthAttachment; // depth and stencil are combined Attachment mDepthAttachment; // depth and stencil are combined
}; };
typedef std::tr1::shared_ptr<FrameBuffer> SharedFrameBuffer; ACGL_SHARED_TYPEDEF(FrameBuffer)
} // OpenGL } // OpenGL
} // ACGL } // ACGL
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <ACGL/ACGL.hh> #include <ACGL/ACGL.hh>
#include <ACGL/Base/Macros.hh>
#include <ACGL/OpenGL/GL.hh> #include <ACGL/OpenGL/GL.hh>
#include <ACGL/OpenGL/Tools.hh> #include <ACGL/OpenGL/Tools.hh>
...@@ -18,28 +19,24 @@ namespace OpenGL{ ...@@ -18,28 +19,24 @@ namespace OpenGL{
class RenderBuffer class RenderBuffer
{ {
ACGL_NOT_COPYABLE(RenderBuffer)
// ========================================================================================================= \/ // ========================================================================================================= \/
// ============================================================================================ CONSTRUCTORS \/ // ============================================================================================ CONSTRUCTORS \/
// ========================================================================================================= \/ // ========================================================================================================= \/
public: public:
RenderBuffer( RenderBuffer(
GLsizei _width,
GLsizei _height,
GLenum _internalFormat) GLenum _internalFormat)
: mContext(0), : mContext(0),
mInternalFormat(_internalFormat), mInternalFormat(_internalFormat),
mWidth(_width), mWidth(0),
mHeight(_height) mHeight(0)
{ {
glGenRenderbuffers(1, &mContext); glGenRenderbuffers(1, &mContext);
if (openGLCriticalErrorOccured() ) { if (openGLCriticalErrorOccured() ) {
ACGL::Utils::error() << "could not generate renderbuffer!" << std::endl; ACGL::Utils::error() << "could not generate renderbuffer!" << std::endl;
return; return;
} }
glBindRenderbuffer(GL_RENDERBUFFER, mContext);
glRenderbufferStorage(GL_RENDERBUFFER, mInternalFormat, mWidth, mHeight);
} }
virtual ~RenderBuffer(void) virtual ~RenderBuffer(void)
...@@ -57,6 +54,27 @@ public: ...@@ -57,6 +54,27 @@ public:
inline GLsizei getWidth (void) const { return mWidth; } inline GLsizei getWidth (void) const { return mWidth; }
inline GLsizei getHeight (void) const { return mHeight; } inline GLsizei getHeight (void) const { return mHeight; }
// ===================================================================================================== \/
// ============================================================================================ WRAPPERS \/
// ===================================================================================================== \/
public:
//! Bind the renderbuffer
inline void bind(void) const
{
glBindRenderbuffer(GL_RENDERBUFFER, mContext);
}
//! Set texture size and NULL data
inline void setSize(
GLsizei _width,
GLsizei _height)
{
mWidth = _width;
mHeight = _height;
glBindRenderbuffer(GL_RENDERBUFFER, mContext);
glRenderbufferStorage(GL_RENDERBUFFER, mInternalFormat, mWidth, mHeight);
}
// =================================================================================================== \/ // =================================================================================================== \/
// ============================================================================================ FIELDS \/ // ============================================================================================ FIELDS \/
// =================================================================================================== \/ // =================================================================================================== \/
...@@ -67,7 +85,7 @@ protected: ...@@ -67,7 +85,7 @@ protected:
GLsizei mHeight; GLsizei mHeight;
}; };
typedef std::tr1::shared_ptr<RenderBuffer> SharedRenderBuffer; ACGL_SHARED_TYPEDEF(RenderBuffer)
} // OpenGL } // OpenGL
} // ACGL } // ACGL
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <ACGL/ACGL.hh> #include <ACGL/ACGL.hh>
#include <ACGL/Base/Macros.hh>
#include <ACGL/OpenGL/GL.hh> #include <ACGL/OpenGL/GL.hh>
namespace ACGL{ namespace ACGL{
...@@ -19,28 +20,13 @@ namespace OpenGL{ ...@@ -19,28 +20,13 @@ namespace OpenGL{
class Shader class Shader
{ {
ACGL_NOT_COPYABLE(Shader)
// ===================================================================================================== \/ // ===================================================================================================== \/
// ============================================================================================ TYPEDEFS \/ // ============================================================================================ TYPEDEFS \/
// ===================================================================================================== \/ // ===================================================================================================== \/
public: public:
typedef std::vector<std::string> AttributeVec; typedef std::vector<std::string> AttributeVec;
// ================================================================================================== \/
// ============================================================================================ ENUMS \/
// ================================================================================================== \/
public:
//! Different types of a shader (i.e. vertex or fragment shaders)
enum ShaderType
{
ShaderTypeInvalid = 0,
ShaderTypeVertex = GL_VERTEX_SHADER,