CCIOSurfaceLayerImpl.cpp [plain text]
#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "cc/CCIOSurfaceLayerImpl.h"
#include "Extensions3DChromium.h"
#include "GraphicsContext3D.h"
#include "LayerRendererChromium.h"
#include "cc/CCIOSurfaceDrawQuad.h"
#include "cc/CCProxy.h"
#include "cc/CCQuadCuller.h"
namespace WebCore {
CCIOSurfaceLayerImpl::CCIOSurfaceLayerImpl(int id)
: CCLayerImpl(id)
, m_ioSurfaceId(0)
, m_ioSurfaceChanged(false)
, m_ioSurfaceTextureId(0)
{
}
CCIOSurfaceLayerImpl::~CCIOSurfaceLayerImpl()
{
m_ioSurfaceTextureId = 0;
}
void CCIOSurfaceLayerImpl::willDraw(LayerRendererChromium* layerRenderer)
{
CCLayerImpl::willDraw(layerRenderer);
if (m_ioSurfaceChanged) {
GraphicsContext3D* context = layerRenderer->context();
Extensions3DChromium* extensions = static_cast<Extensions3DChromium*>(context->getExtensions());
ASSERT(extensions->supports("GL_CHROMIUM_iosurface"));
ASSERT(extensions->supports("GL_ARB_texture_rectangle"));
if (!m_ioSurfaceTextureId)
m_ioSurfaceTextureId = context->createTexture();
GLC(context, context->activeTexture(GraphicsContext3D::TEXTURE0));
GLC(context, context->bindTexture(Extensions3D::TEXTURE_RECTANGLE_ARB, m_ioSurfaceTextureId));
GLC(context, context->texParameteri(Extensions3D::TEXTURE_RECTANGLE_ARB, GraphicsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR));
GLC(context, context->texParameteri(Extensions3D::TEXTURE_RECTANGLE_ARB, GraphicsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR));
GLC(context, context->texParameteri(Extensions3D::TEXTURE_RECTANGLE_ARB, GraphicsContext3D::TEXTURE_WRAP_S, GraphicsContext3D::CLAMP_TO_EDGE));
GLC(context, context->texParameteri(Extensions3D::TEXTURE_RECTANGLE_ARB, GraphicsContext3D::TEXTURE_WRAP_T, GraphicsContext3D::CLAMP_TO_EDGE));
extensions->texImageIOSurface2DCHROMIUM(Extensions3D::TEXTURE_RECTANGLE_ARB,
m_ioSurfaceSize.width(),
m_ioSurfaceSize.height(),
m_ioSurfaceId,
0);
m_ioSurfaceChanged = false;
}
}
void CCIOSurfaceLayerImpl::appendQuads(CCQuadCuller& quadList, const CCSharedQuadState* sharedQuadState, bool&)
{
IntRect quadRect(IntPoint(), bounds());
quadList.append(CCIOSurfaceDrawQuad::create(sharedQuadState, quadRect, m_ioSurfaceSize, m_ioSurfaceTextureId));
}
void CCIOSurfaceLayerImpl::dumpLayerProperties(TextStream& ts, int indent) const
{
writeIndent(ts, indent);
ts << "iosurface id: " << m_ioSurfaceId << " texture id: " << m_ioSurfaceTextureId;
CCLayerImpl::dumpLayerProperties(ts, indent);
}
void CCIOSurfaceLayerImpl::didLoseContext()
{
m_ioSurfaceTextureId = 0;
m_ioSurfaceChanged = true;
}
void CCIOSurfaceLayerImpl::setIOSurfaceProperties(unsigned ioSurfaceId, const IntSize& size)
{
if (m_ioSurfaceId != ioSurfaceId)
m_ioSurfaceChanged = true;
m_ioSurfaceId = ioSurfaceId;
m_ioSurfaceSize = size;
}
}
#endif // USE(ACCELERATED_COMPOSITING)