18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#ifndef WebGLTexture_h
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#define WebGLTexture_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "WebGLObject.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/PassRefPtr.h>
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/RefCounted.h>
33967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include <wtf/Vector.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore {
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass WebGLTexture : public WebGLObject {
38dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochpublic:
39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual ~WebGLTexture() { deleteObject(); }
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    static PassRefPtr<WebGLTexture> create(WebGLRenderingContext*);
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void setTarget(GC3Denum target, GC3Dint maxLevel);
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void setParameteri(GC3Denum pname, GC3Dint param);
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void setParameterf(GC3Denum pname, GC3Dfloat param);
46967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    GC3Denum getTarget() const { return m_target; }
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
49e14391e94c850b8bd03680c23b38978db68687a8John Reck    int getMinFilter() const { return m_minFilter; }
50e14391e94c850b8bd03680c23b38978db68687a8John Reck
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void setLevelInfo(GC3Denum target, GC3Dint level, GC3Denum internalFormat, GC3Dsizei width, GC3Dsizei height, GC3Denum type);
52967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool canGenerateMipmaps();
54dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Generate all level information.
55dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void generateMipmapLevelInfo();
566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum getInternalFormat(GC3Denum target, GC3Dint level) const;
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum getType(GC3Denum target, GC3Dint level) const;
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Dsizei getWidth(GC3Denum target, GC3Dint level) const;
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Dsizei getHeight(GC3Denum target, GC3Dint level) const;
61967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
62dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Whether width/height is NotPowerOfTwo.
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool isNPOT(GC3Dsizei, GC3Dsizei);
646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
65dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool isNPOT() const;
66dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Determine if texture sampling should always return [0, 0, 0, 1] (OpenGL ES 2.0 Sec 3.8.2).
67dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool needToUseBlackTexture() const;
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bool hasEverBeenBound() const { return object() && m_target; }
704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static GC3Dint computeLevelCount(GC3Dsizei width, GC3Dsizei height);
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
73dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochprotected:
74dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebGLTexture(WebGLRenderingContext*);
7521939df44de1705786c545cd1bf519d47250322dBen Murdoch
76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual void deleteObjectImpl(Platform3DObject);
77967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
78dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochprivate:
79dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    class LevelInfo {
80dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    public:
81dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        LevelInfo()
82dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            : valid(false)
83dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            , internalFormat(0)
84dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            , width(0)
85dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            , height(0)
86dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            , type(0)
87dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        {
88dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        }
89967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        void setInfo(GC3Denum internalFmt, GC3Dsizei w, GC3Dsizei h, GC3Denum tp)
91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        {
92dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            valid = true;
93dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            internalFormat = internalFmt;
94dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            width = w;
95dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            height = h;
96dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            type = tp;
97dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        }
986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
99dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        bool valid;
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        GC3Denum internalFormat;
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        GC3Dsizei width;
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        GC3Dsizei height;
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        GC3Denum type;
104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    };
105dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
106cad810f21b803229eb11403f9209855525a25d57Steve Block    virtual bool isTexture() const { return true; }
107cad810f21b803229eb11403f9209855525a25d57Steve Block
108cad810f21b803229eb11403f9209855525a25d57Steve Block    void update();
109cad810f21b803229eb11403f9209855525a25d57Steve Block
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int mapTargetToIndex(GC3Denum) const;
111cad810f21b803229eb11403f9209855525a25d57Steve Block
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    const LevelInfo* getLevelInfo(GC3Denum target, GC3Dint level) const;
113cad810f21b803229eb11403f9209855525a25d57Steve Block
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum m_target;
115cad810f21b803229eb11403f9209855525a25d57Steve Block
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum m_minFilter;
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum m_magFilter;
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum m_wrapS;
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum m_wrapT;
120cad810f21b803229eb11403f9209855525a25d57Steve Block
121dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Vector<Vector<LevelInfo> > m_info;
122dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
123dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool m_isNPOT;
124dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool m_isComplete;
125dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    bool m_needToUseBlackTexture;
126dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
127dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif // WebGLTexture_h
131