ManagedTexture.cpp [plain text]
#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "ManagedTexture.h"
#include "GraphicsContext3D.h"
#include "TextureManager.h"
namespace WebCore {
ManagedTexture::ManagedTexture(TextureManager* manager)
: m_textureManager(manager)
, m_token(0)
, m_format(0)
, m_textureId(0)
{
m_textureManager->registerTexture(this);
}
ManagedTexture::ManagedTexture(TextureManager* manager, TextureToken token, IntSize size, unsigned format, unsigned textureId)
: m_textureManager(manager)
, m_token(token)
, m_size(size)
, m_format(format)
, m_textureId(textureId)
{
m_textureManager->registerTexture(this);
}
ManagedTexture::~ManagedTexture()
{
if (!m_textureManager)
return;
m_textureManager->unregisterTexture(this);
if (m_token)
m_textureManager->releaseToken(m_token);
}
void ManagedTexture::setTextureManager(TextureManager* manager)
{
if (manager == m_textureManager)
return;
if (m_textureManager)
m_textureManager->unregisterTexture(this);
m_textureManager = manager;
clear();
if (m_textureManager)
m_textureManager->registerTexture(this);
}
bool ManagedTexture::isValid(const IntSize& size, unsigned format)
{
return m_token && size == m_size && format == m_format && m_textureManager && m_textureManager->hasTexture(m_token);
}
bool ManagedTexture::reserve(const IntSize& size, unsigned format)
{
if (!m_textureManager)
return false;
if (!m_token)
m_token = m_textureManager->getToken();
bool reserved = true;
if (size == m_size && format == m_format && m_textureManager->hasTexture(m_token))
m_textureManager->protectTexture(m_token);
else {
m_textureId = 0;
reserved = m_textureManager->requestTexture(m_token, size, format);
if (reserved) {
m_size = size;
m_format = format;
}
}
return reserved;
}
void ManagedTexture::unreserve()
{
if (!m_token || !m_textureManager)
return;
m_textureManager->unprotectTexture(m_token);
}
void ManagedTexture::allocate(TextureAllocator* allocator)
{
ASSERT(m_textureManager->hasTexture(m_token));
if (!m_textureId)
m_textureId = m_textureManager->allocateTexture(allocator, m_token);
}
void ManagedTexture::bindTexture(GraphicsContext3D* context, TextureAllocator* allocator)
{
allocate(allocator);
context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId);
}
void ManagedTexture::framebufferTexture2D(GraphicsContext3D* context, TextureAllocator* allocator)
{
allocate(allocator);
context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_textureId, 0);
}
PassOwnPtr<ManagedTexture> ManagedTexture::steal()
{
OwnPtr<ManagedTexture> texture = adoptPtr(new ManagedTexture(m_textureManager, m_token, m_size, m_format, m_textureId));
clear();
return texture.release();
}
void ManagedTexture::clear()
{
m_token = 0;
m_size = IntSize();
m_format = 0;
m_textureId = 0;
}
}
#endif // USE(ACCELERATED_COMPOSITING)