1f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch/*
2f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Copyright (C) 2010, Google Inc. All rights reserved.
3f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *
4f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * Redistribution and use in source and binary forms, with or without
5f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * modification, are permitted provided that the following conditions
6f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * are met:
7f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 1.  Redistributions of source code must retain the above copyright
8f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *     notice, this list of conditions and the following disclaimer.
9f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * 2.  Redistributions in binary form must reproduce the above copyright
10f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *     notice, this list of conditions and the following disclaimer in the
11f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *     documentation and/or other materials provided with the distribution.
12f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch *
13f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch */
24f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
25f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "config.h"
26f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
27f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#if USE(ACCELERATED_COMPOSITING)
28f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
29f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "LayerTexture.h"
30f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
31f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "GraphicsContext3D.h"
32f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "TextureManager.h"
33f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochnamespace WebCore {
35f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
36f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochLayerTexture::LayerTexture(GraphicsContext3D* context, TextureManager* manager)
37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    : m_context(context)
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    , m_textureManager(manager)
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    , m_token(0)
40f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    , m_format(0)
41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    , m_textureId(0)
42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
43f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
44f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
45f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochLayerTexture::~LayerTexture()
46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
47f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (m_token)
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_textureManager->releaseToken(m_token);
49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
50f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
51f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool LayerTexture::isValid(const IntSize& size, unsigned format)
52f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return m_token && size == m_size && format == m_format && m_textureManager->hasTexture(m_token);
54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
55f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochbool LayerTexture::reserve(const IntSize& size, unsigned format)
57f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
58f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_token)
59f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_token = m_textureManager->getToken();
60f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (size == m_size && format == m_format && m_textureManager->hasTexture(m_token))
62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_textureManager->protectTexture(m_token);
63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    else {
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_textureId = m_textureManager->requestTexture(m_token, size, format);
65f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (m_textureId) {
66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            m_size = size;
67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            m_format = format;
68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
70f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
71f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return m_textureId;
72f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
73f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
74f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid LayerTexture::bindTexture()
75f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(m_textureManager->hasTexture(m_token));
77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, m_textureId);
78f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid LayerTexture::framebufferTexture2D()
81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFER, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, m_textureId, 0);
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
84f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#endif // USE(ACCELERATED_COMPOSITING)
88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
89