update Renderbuffer with GraphicsContextResource changes

This commit is contained in:
Gered 2013-04-01 18:00:49 -04:00
parent decbe56cd0
commit c8b2f73d9a
3 changed files with 68 additions and 55 deletions

View file

@ -280,7 +280,7 @@ BOOL Framebuffer::AttachRenderbuffer(FRAMEBUFFER_DATA_TYPE type)
GetDimensionsForAttachment(width, height); GetDimensionsForAttachment(width, height);
Renderbuffer *attach = new Renderbuffer(); Renderbuffer *attach = new Renderbuffer();
BOOL renderbufferSuccess = attach->Create(GetGraphicsDevice(), width, height, type); BOOL renderbufferSuccess = attach->Initialize(GetGraphicsDevice(), width, height, type);
ASSERT(renderbufferSuccess == TRUE); ASSERT(renderbufferSuccess == TRUE);
if (!renderbufferSuccess) if (!renderbufferSuccess)
{ {
@ -325,7 +325,7 @@ BOOL Framebuffer::ReCreateAndAttach(FramebufferRenderbufferMap::iterator &itor,
if (releaseFirst) if (releaseFirst)
existing->Release(); existing->Release();
BOOL renderbufferSuccess = existing->Create(GetGraphicsDevice(), width, height, existingType); BOOL renderbufferSuccess = existing->Initialize(GetGraphicsDevice(), width, height, existingType);
ASSERT(renderbufferSuccess == TRUE); ASSERT(renderbufferSuccess == TRUE);
if (!renderbufferSuccess) if (!renderbufferSuccess)
return FALSE; return FALSE;

View file

@ -16,24 +16,55 @@ Renderbuffer::Renderbuffer()
m_type = FRAMEBUFFER_DATA_NONE; m_type = FRAMEBUFFER_DATA_NONE;
} }
Renderbuffer::~Renderbuffer() BOOL Renderbuffer::Initialize(GraphicsDevice *graphicsDevice, uint16_t width, uint16_t height, FRAMEBUFFER_DATA_TYPE type)
{
STACK_TRACE;
Release();
}
BOOL Renderbuffer::Create(GraphicsDevice *graphicsDevice, uint16_t width, uint16_t height, FRAMEBUFFER_DATA_TYPE type)
{ {
STACK_TRACE; STACK_TRACE;
ASSERT(m_renderbufferName == 0); ASSERT(m_renderbufferName == 0);
if (m_renderbufferName != 0) if (m_renderbufferName != 0)
return FALSE; 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; uint32_t format = 0;
#ifdef MOBILE #ifdef MOBILE
switch (type) switch (m_type)
{ {
case FRAMEBUFFER_DATA_COLOR_RGB: case FRAMEBUFFER_DATA_COLOR_RGB:
format = GL_RGB565; format = GL_RGB565;
@ -49,7 +80,7 @@ BOOL Renderbuffer::Create(GraphicsDevice *graphicsDevice, uint16_t width, uint16
default: break; default: break;
}; };
#else #else
switch (type) switch (m_type)
{ {
case FRAMEBUFFER_DATA_COLOR_RGB: case FRAMEBUFFER_DATA_COLOR_RGB:
format = GL_RGB; format = GL_RGB;
@ -72,43 +103,24 @@ BOOL Renderbuffer::Create(GraphicsDevice *graphicsDevice, uint16_t width, uint16
GL_CALL(glGenRenderbuffers(1, &m_renderbufferName)); GL_CALL(glGenRenderbuffers(1, &m_renderbufferName));
m_width = width; GetGraphicsDevice()->BindRenderbuffer(this);
m_height = height;
m_type = type;
m_graphicsDevice->BindRenderbuffer(this);
// have OpenGL allocate the renderbuffer's storage // 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 // don't leave this buffer bound, we'll let an associated Framebuffer
// object that this will get attached to manage that for itself... // object that this will get attached to manage that for itself...
m_graphicsDevice->UnbindRenderbuffer(); GetGraphicsDevice()->UnbindRenderbuffer();
return TRUE; 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() void Renderbuffer::OnNewContext()
{ {
STACK_TRACE; 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); ASSERT(success == TRUE);
} }
} }

View file

@ -15,48 +15,48 @@ class Renderbuffer : public GraphicsContextResource
{ {
public: public:
Renderbuffer(); Renderbuffer();
virtual ~Renderbuffer(); virtual ~Renderbuffer() { Release(); }
/**
* 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);
/** /**
* Releases the resources associated with this renderbuffer. * Releases the resources associated with this renderbuffer.
*/ */
void Release(); 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 * @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 * @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 * @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 * @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 * @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. * New OpenGL graphics context creation callback.
@ -69,7 +69,8 @@ public:
void OnLostContext(); void OnLostContext();
private: private:
GraphicsDevice *m_graphicsDevice; BOOL CreateRenderbuffer();
uint32_t m_renderbufferName; uint32_t m_renderbufferName;
uint16_t m_width; uint16_t m_width;
uint16_t m_height; uint16_t m_height;