update Framebuffer with the GraphicsContextResource changes. also fixed a few small issues with how it handled new/lost contexts and restored itself

This commit is contained in:
Gered 2013-04-01 17:51:58 -04:00
parent e5f17c1786
commit decbe56cd0
2 changed files with 53 additions and 64 deletions

View file

@ -16,30 +16,24 @@
Framebuffer::Framebuffer()
{
STACK_TRACE;
m_graphicsDevice = NULL;
m_viewContext = NULL;
m_framebufferName = 0;
m_fixedWidth = 0;
m_fixedHeight = 0;
}
Framebuffer::~Framebuffer()
BOOL Framebuffer::Initialize(GraphicsDevice *graphicsDevice)
{
STACK_TRACE;
Release();
}
BOOL Framebuffer::Create(GraphicsDevice *graphicsDevice)
{
STACK_TRACE;
ASSERT(graphicsDevice != NULL);
if (!GraphicsContextResource::Initialize(graphicsDevice))
return FALSE;
ASSERT(m_framebufferName == 0);
if (m_framebufferName != 0)
return FALSE;
GL_CALL(glGenFramebuffers(1, &m_framebufferName));
CreateFramebuffer();
m_graphicsDevice = graphicsDevice;
m_viewContext = NULL;
m_fixedWidth = 0;
m_fixedHeight = 0;
@ -47,7 +41,7 @@ BOOL Framebuffer::Create(GraphicsDevice *graphicsDevice)
return TRUE;
}
BOOL Framebuffer::Create(GraphicsDevice *graphicsDevice, uint16_t fixedWidth, uint16_t fixedHeight)
BOOL Framebuffer::Initialize(GraphicsDevice *graphicsDevice, uint16_t fixedWidth, uint16_t fixedHeight)
{
STACK_TRACE;
ASSERT(fixedWidth != 0);
@ -55,7 +49,7 @@ BOOL Framebuffer::Create(GraphicsDevice *graphicsDevice, uint16_t fixedWidth, ui
if (fixedWidth == 0 || fixedHeight == 0)
return FALSE;
BOOL createSuccess = Create(graphicsDevice);
BOOL createSuccess = Initialize(graphicsDevice);
if (!createSuccess)
return FALSE;
@ -87,20 +81,26 @@ void Framebuffer::Release()
GL_CALL(glDeleteFramebuffers(1, &m_framebufferName));
}
if (m_graphicsDevice != NULL)
if (GetGraphicsDevice() != NULL)
{
if (m_graphicsDevice->GetViewContext() == m_viewContext)
m_graphicsDevice->SetViewContext(NULL);
if (GetGraphicsDevice()->GetViewContext() == m_viewContext)
GetGraphicsDevice()->SetViewContext(NULL);
SAFE_DELETE(m_viewContext);
}
m_framebufferName = 0;
m_graphicsDevice = NULL;
m_fixedWidth = 0;
m_fixedHeight = 0;
}
void Framebuffer::CreateFramebuffer()
{
STACK_TRACE;
ASSERT(m_framebufferName == 0);
GL_CALL(glGenFramebuffers(1, &m_framebufferName));
}
BOOL Framebuffer::AttachViewContext()
{
STACK_TRACE;
@ -115,9 +115,9 @@ BOOL Framebuffer::AttachViewContext()
m_viewContext = new ViewContext();
BOOL success;
if (IsUsingFixedDimensions())
success = m_viewContext->Create(m_graphicsDevice, Rect(0, 0, m_fixedWidth, m_fixedHeight));
success = m_viewContext->Create(GetGraphicsDevice(), Rect(0, 0, m_fixedWidth, m_fixedHeight));
else
success = m_viewContext->Create(m_graphicsDevice);
success = m_viewContext->Create(GetGraphicsDevice());
if (!success)
{
SAFE_DELETE(m_viewContext);
@ -148,7 +148,7 @@ BOOL Framebuffer::AttachTexture(FRAMEBUFFER_DATA_TYPE type)
// don't allow unsupported types!
if (type == FRAMEBUFFER_DATA_NONE)
return FALSE;
if (type == FRAMEBUFFER_DATA_DEPTH && !m_graphicsDevice->IsDepthTextureSupported())
if (type == FRAMEBUFFER_DATA_DEPTH && !GetGraphicsDevice()->IsDepthTextureSupported())
return FALSE;
if (type == FRAMEBUFFER_DATA_STENCIL)
return FALSE;
@ -183,7 +183,7 @@ BOOL Framebuffer::AttachTexture(FRAMEBUFFER_DATA_TYPE type)
GetDimensionsForAttachment(width, height);
Texture *attach = new Texture();
BOOL textureSuccess = attach->Create(m_graphicsDevice, width, height, textureFormat);
BOOL textureSuccess = attach->Create(GetGraphicsDevice(), width, height, textureFormat);
ASSERT(textureSuccess == TRUE);
if (!textureSuccess)
{
@ -191,9 +191,9 @@ BOOL Framebuffer::AttachTexture(FRAMEBUFFER_DATA_TYPE type)
return FALSE;
}
m_graphicsDevice->BindFramebuffer(this);
GetGraphicsDevice()->BindFramebuffer(this);
GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, attachmentType, GL_TEXTURE_2D, attach->GetTextureName(), 0));
m_graphicsDevice->UnbindFramebuffer(this);
GetGraphicsDevice()->UnbindFramebuffer(this);
m_textures[type] = attach;
@ -227,14 +227,14 @@ BOOL Framebuffer::ReCreateAndAttach(FramebufferTextureMap::iterator &itor, BOOL
if (releaseFirst)
existing->Release();
BOOL textureSuccess = existing->Create(m_graphicsDevice, width, height, existingFormat);
BOOL textureSuccess = existing->Create(GetGraphicsDevice(), width, height, existingFormat);
ASSERT(textureSuccess == TRUE);
if (!textureSuccess)
return FALSE;
m_graphicsDevice->BindFramebuffer(this);
GetGraphicsDevice()->BindFramebuffer(this);
GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, attachmentType, GL_TEXTURE_2D, existing->GetTextureName(), 0));
m_graphicsDevice->UnbindFramebuffer(this);
GetGraphicsDevice()->UnbindFramebuffer(this);
return TRUE;
}
@ -280,7 +280,7 @@ BOOL Framebuffer::AttachRenderbuffer(FRAMEBUFFER_DATA_TYPE type)
GetDimensionsForAttachment(width, height);
Renderbuffer *attach = new Renderbuffer();
BOOL renderbufferSuccess = attach->Create(m_graphicsDevice, width, height, type);
BOOL renderbufferSuccess = attach->Create(GetGraphicsDevice(), width, height, type);
ASSERT(renderbufferSuccess == TRUE);
if (!renderbufferSuccess)
{
@ -288,9 +288,9 @@ BOOL Framebuffer::AttachRenderbuffer(FRAMEBUFFER_DATA_TYPE type)
return FALSE;
}
m_graphicsDevice->BindFramebuffer(this);
GetGraphicsDevice()->BindFramebuffer(this);
GL_CALL(glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachmentType, GL_RENDERBUFFER, attach->GetRenderbufferName()));
m_graphicsDevice->UnbindFramebuffer(this);
GetGraphicsDevice()->UnbindFramebuffer(this);
m_renderbuffers[type] = attach;
@ -325,14 +325,14 @@ BOOL Framebuffer::ReCreateAndAttach(FramebufferRenderbufferMap::iterator &itor,
if (releaseFirst)
existing->Release();
BOOL renderbufferSuccess = existing->Create(m_graphicsDevice, width, height, existingType);
BOOL renderbufferSuccess = existing->Create(GetGraphicsDevice(), width, height, existingType);
ASSERT(renderbufferSuccess == TRUE);
if (!renderbufferSuccess)
return FALSE;
m_graphicsDevice->BindFramebuffer(this);
GetGraphicsDevice()->BindFramebuffer(this);
GL_CALL(glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachmentType, GL_RENDERBUFFER, existing->GetRenderbufferName()));
m_graphicsDevice->UnbindFramebuffer(this);
GetGraphicsDevice()->UnbindFramebuffer(this);
return TRUE;
}
@ -348,8 +348,8 @@ BOOL Framebuffer::ReleaseViewContext()
if (m_viewContext == NULL)
return FALSE;
if (m_graphicsDevice->GetViewContext() == m_viewContext)
m_graphicsDevice->SetViewContext(NULL);
if (GetGraphicsDevice()->GetViewContext() == m_viewContext)
GetGraphicsDevice()->SetViewContext(NULL);
SAFE_DELETE(m_viewContext);
@ -388,9 +388,9 @@ BOOL Framebuffer::ReleaseTexture(FRAMEBUFFER_DATA_TYPE type)
if (attachmentType == 0)
return FALSE;
m_graphicsDevice->BindFramebuffer(this);
GetGraphicsDevice()->BindFramebuffer(this);
GL_CALL(glFramebufferTexture2D(GL_FRAMEBUFFER, attachmentType, GL_TEXTURE_2D, 0, 0));
m_graphicsDevice->UnbindFramebuffer(this);
GetGraphicsDevice()->UnbindFramebuffer(this);
BOOL removeSuccess = RemoveTexture(existing);
ASSERT(removeSuccess == TRUE);
@ -432,9 +432,9 @@ BOOL Framebuffer::ReleaseRenderbuffer(FRAMEBUFFER_DATA_TYPE type)
if (attachmentType == 0)
return FALSE;
m_graphicsDevice->BindFramebuffer(this);
GetGraphicsDevice()->BindFramebuffer(this);
GL_CALL(glFramebufferRenderbuffer(GL_FRAMEBUFFER, attachmentType, GL_RENDERBUFFER, 0));
m_graphicsDevice->UnbindFramebuffer(this);
GetGraphicsDevice()->UnbindFramebuffer(this);
BOOL removeSuccess = RemoveRenderbuffer(existing);
ASSERT(removeSuccess == TRUE);
@ -499,24 +499,11 @@ Renderbuffer* Framebuffer::GetRenderbuffer(FRAMEBUFFER_DATA_TYPE type) const
void Framebuffer::OnNewContext()
{
STACK_TRACE;
if (m_framebufferName == 0 && m_graphicsDevice != NULL)
if (m_framebufferName == 0 && GetGraphicsDevice() != NULL)
{
// the view context (if one is set) doesn't need to be recreated
// but the call to Create() will reset the pointer
// TODO: maybe this should call a Recreate() method instead
ViewContext *viewContext = m_viewContext;
// recreate the framebuffer
BOOL createSuccess = Create(m_graphicsDevice);
ASSERT(createSuccess == TRUE);
if (!createSuccess)
{
m_framebufferName = 0;
m_viewContext = viewContext;
return;
}
CreateFramebuffer();
m_viewContext = viewContext;
if (m_viewContext != NULL)
m_viewContext->OnNewContext();
@ -561,11 +548,11 @@ void Framebuffer::OnLostContext()
void Framebuffer::OnResize()
{
STACK_TRACE;
if (m_framebufferName != 0 && m_graphicsDevice != NULL)
if (m_framebufferName != 0 && GetGraphicsDevice() != NULL)
{
if (m_viewContext != NULL)
{
GameWindow *window = m_graphicsDevice->GetWindow();
GameWindow *window = GetGraphicsDevice()->GetWindow();
m_viewContext->OnResize(window->GetRect(), window->GetScreenOrientation());
}
@ -651,7 +638,7 @@ void Framebuffer::GetDimensionsForAttachment(uint16_t &width, uint16_t &height)
if (m_viewContext != NULL)
viewContext = m_viewContext;
else
viewContext = m_graphicsDevice->GetViewContext();
viewContext = GetGraphicsDevice()->GetViewContext();
ASSERT(viewContext != NULL);
width = viewContext->GetViewportWidth();

View file

@ -20,15 +20,16 @@ class Framebuffer : public GraphicsContextResource
public:
Framebuffer();
virtual ~Framebuffer();
virtual ~Framebuffer() { Release(); }
BOOL Create(GraphicsDevice *graphicsDevice);
BOOL Create(GraphicsDevice *graphicsDevice, uint16_t fixedWidth, uint16_t fixedHeight);
void Release();
uint32_t GetFramebufferName() const { return m_framebufferName; }
BOOL IsInvalidated() const { return m_framebufferName == 0; }
BOOL IsUsingFixedDimensions() const { return (m_fixedWidth != 0 && m_fixedHeight != 0); }
BOOL Initialize(GraphicsDevice *graphicsDevice);
BOOL Initialize(GraphicsDevice *graphicsDevice, uint16_t fixedWidth, uint16_t fixedHeight);
uint32_t GetFramebufferName() const { return m_framebufferName; }
BOOL IsInvalidated() const { return m_framebufferName == 0; }
BOOL IsUsingFixedDimensions() const { return (m_fixedWidth != 0 && m_fixedHeight != 0); }
BOOL AttachViewContext();
BOOL AttachTexture(FRAMEBUFFER_DATA_TYPE type);
@ -37,7 +38,7 @@ public:
BOOL ReleaseTexture(FRAMEBUFFER_DATA_TYPE type);
BOOL ReleaseRenderbuffer(FRAMEBUFFER_DATA_TYPE type);
ViewContext* GetViewContext() const { return m_viewContext; }
ViewContext* GetViewContext() const { return m_viewContext; }
Texture* GetTexture(FRAMEBUFFER_DATA_TYPE type) const;
Renderbuffer* GetRenderbuffer(FRAMEBUFFER_DATA_TYPE type) const;
@ -49,6 +50,8 @@ private:
void OnBind();
void OnUnBind();
void CreateFramebuffer();
BOOL ReCreateAndAttach(FramebufferTextureMap::iterator &itor, BOOL releaseFirst);
BOOL ReCreateAndAttach(FramebufferRenderbufferMap::iterator &itor, BOOL releaseFirst);
BOOL RemoveTexture(Texture *texture);
@ -57,7 +60,6 @@ private:
void GetDimensionsForAttachment(uint16_t &width, uint16_t &height) const;
uint32_t m_framebufferName;
GraphicsDevice *m_graphicsDevice;
uint16_t m_fixedWidth;
uint16_t m_fixedHeight;
ViewContext *m_viewContext;