diff --git a/src/framework/graphics/framebuffer.cpp b/src/framework/graphics/framebuffer.cpp index dd3bc5c..dde1d53 100644 --- a/src/framework/graphics/framebuffer.cpp +++ b/src/framework/graphics/framebuffer.cpp @@ -280,7 +280,7 @@ BOOL Framebuffer::AttachRenderbuffer(FRAMEBUFFER_DATA_TYPE type) GetDimensionsForAttachment(width, height); Renderbuffer *attach = new Renderbuffer(); - BOOL renderbufferSuccess = attach->Create(GetGraphicsDevice(), width, height, type); + BOOL renderbufferSuccess = attach->Initialize(GetGraphicsDevice(), width, height, type); ASSERT(renderbufferSuccess == TRUE); if (!renderbufferSuccess) { @@ -325,7 +325,7 @@ BOOL Framebuffer::ReCreateAndAttach(FramebufferRenderbufferMap::iterator &itor, if (releaseFirst) existing->Release(); - BOOL renderbufferSuccess = existing->Create(GetGraphicsDevice(), width, height, existingType); + BOOL renderbufferSuccess = existing->Initialize(GetGraphicsDevice(), width, height, existingType); ASSERT(renderbufferSuccess == TRUE); if (!renderbufferSuccess) return FALSE; diff --git a/src/framework/graphics/renderbuffer.cpp b/src/framework/graphics/renderbuffer.cpp index 202a315..7042deb 100644 --- a/src/framework/graphics/renderbuffer.cpp +++ b/src/framework/graphics/renderbuffer.cpp @@ -16,24 +16,55 @@ Renderbuffer::Renderbuffer() m_type = FRAMEBUFFER_DATA_NONE; } -Renderbuffer::~Renderbuffer() -{ - STACK_TRACE; - Release(); -} - -BOOL Renderbuffer::Create(GraphicsDevice *graphicsDevice, uint16_t width, uint16_t height, FRAMEBUFFER_DATA_TYPE type) +BOOL Renderbuffer::Initialize(GraphicsDevice *graphicsDevice, uint16_t width, uint16_t height, FRAMEBUFFER_DATA_TYPE type) { STACK_TRACE; ASSERT(m_renderbufferName == 0); if (m_renderbufferName != 0) return FALSE; - ASSERT(graphicsDevice != NULL); + if (!GraphicsContextResource::Initialize(graphicsDevice)) + return FALSE; + + m_width = width; + m_height = height; + m_type = type; + + BOOL success = CreateRenderbuffer(); + if (!success) + { + m_width = 0; + m_height = 0; + m_type = FRAMEBUFFER_DATA_NONE; + } + + return success; +} + +void Renderbuffer::Release() +{ + STACK_TRACE; + if (m_renderbufferName != 0) + { + GetGraphicsDevice()->UnbindRenderBuffer(this); + GL_CALL(glDeleteRenderbuffers(1, &m_renderbufferName)); + } + + m_renderbufferName = 0; + m_width = 0; + m_height = 0; + + GraphicsContextResource::Release(); +} + +BOOL Renderbuffer::CreateRenderbuffer() +{ + STACK_TRACE; + ASSERT(m_renderbufferName == 0); uint32_t format = 0; #ifdef MOBILE - switch (type) + switch (m_type) { case FRAMEBUFFER_DATA_COLOR_RGB: format = GL_RGB565; @@ -49,7 +80,7 @@ BOOL Renderbuffer::Create(GraphicsDevice *graphicsDevice, uint16_t width, uint16 default: break; }; #else - switch (type) + switch (m_type) { case FRAMEBUFFER_DATA_COLOR_RGB: format = GL_RGB; @@ -72,43 +103,24 @@ BOOL Renderbuffer::Create(GraphicsDevice *graphicsDevice, uint16_t width, uint16 GL_CALL(glGenRenderbuffers(1, &m_renderbufferName)); - m_width = width; - m_height = height; - m_type = type; - - m_graphicsDevice->BindRenderbuffer(this); + GetGraphicsDevice()->BindRenderbuffer(this); // have OpenGL allocate the renderbuffer's storage - GL_CALL(glRenderbufferStorage(GL_RENDERBUFFER, format, width, height)); - + GL_CALL(glRenderbufferStorage(GL_RENDERBUFFER, format, m_width, m_height)); + // don't leave this buffer bound, we'll let an associated Framebuffer // object that this will get attached to manage that for itself... - m_graphicsDevice->UnbindRenderbuffer(); + GetGraphicsDevice()->UnbindRenderbuffer(); return TRUE; } -void Renderbuffer::Release() -{ - STACK_TRACE; - if (m_renderbufferName != 0) - { - m_graphicsDevice->UnbindRenderBuffer(this); - GL_CALL(glDeleteRenderbuffers(1, &m_renderbufferName)); - } - - m_graphicsDevice = NULL; - m_renderbufferName = 0; - m_width = 0; - m_height = 0; -} - void Renderbuffer::OnNewContext() { STACK_TRACE; - if (m_renderbufferName == 0 && m_graphicsDevice != NULL) + if (m_renderbufferName == 0 && GetGraphicsDevice() != NULL) { - BOOL success = Create(m_graphicsDevice, m_width, m_height, m_type); + BOOL success = CreateRenderbuffer(); ASSERT(success == TRUE); } } diff --git a/src/framework/graphics/renderbuffer.h b/src/framework/graphics/renderbuffer.h index 4f05e3b..6531d28 100644 --- a/src/framework/graphics/renderbuffer.h +++ b/src/framework/graphics/renderbuffer.h @@ -15,48 +15,48 @@ class Renderbuffer : public GraphicsContextResource { public: Renderbuffer(); - virtual ~Renderbuffer(); - - /** - * Creates a new renderbuffer with the specified properties. - * @param graphicsDevice this graphics device this renderbuffer is - * associated with - * @param width the width of the renderbuffer in pixels - * @param height the height of the renderbuffer in pixels - * @param format the type of data this renderbuffer contains - * @return TRUE if the renderbuffer was created successfully - */ - BOOL Create(GraphicsDevice *graphicsDevice, uint16_t width, uint16_t height, FRAMEBUFFER_DATA_TYPE type); + virtual ~Renderbuffer() { Release(); } /** * Releases the resources associated with this renderbuffer. */ void Release(); + /** + * Initializes the renderbuffer with the specified properties. + * @param graphicsDevice this graphics device this renderbuffer is + * associated with + * @param width the width of the renderbuffer in pixels + * @param height the height of the renderbuffer in pixels + * @param format the type of data this renderbuffer contains + * @return TRUE if the renderbuffer was created successfully + */ + BOOL Initialize(GraphicsDevice *graphicsDevice, uint16_t width, uint16_t height, FRAMEBUFFER_DATA_TYPE type); + /** * @return the name or ID assigned to this renderbuffer by OpenGL */ - uint32_t GetRenderbufferName() const { return m_renderbufferName; } + uint32_t GetRenderbufferName() const { return m_renderbufferName; } /** * @return the width of the renderbuffer in pixels */ - uint16_t GetWidth() const { return m_width; } + uint16_t GetWidth() const { return m_width; } /** * @return the height of the renderbuffer in pixels */ - uint16_t GetHeight() const { return m_height; } + uint16_t GetHeight() const { return m_height; } /** * @return the type of data this renderbuffer contains */ - FRAMEBUFFER_DATA_TYPE GetType() const { return m_type; } + FRAMEBUFFER_DATA_TYPE GetType() const { return m_type; } /** * @return TRUE if the renderbuffer has been marked as invalid and needs to be recreated */ - BOOL IsInvalidated() const { return m_renderbufferName == 0; } + BOOL IsInvalidated() const { return m_renderbufferName == 0; } /** * New OpenGL graphics context creation callback. @@ -69,7 +69,8 @@ public: void OnLostContext(); private: - GraphicsDevice *m_graphicsDevice; + BOOL CreateRenderbuffer(); + uint32_t m_renderbufferName; uint16_t m_width; uint16_t m_height;