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 WebGLBuffer_h
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#define WebGLBuffer_h
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "ArrayBuffer.h"
30dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "WebGLObject.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/PassRefPtr.h>
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/RefCounted.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blocknamespace WebCore {
36e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass ArrayBufferView;
37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
38dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochclass WebGLBuffer : public WebGLObject {
39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochpublic:
40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual ~WebGLBuffer() { deleteObject(); }
41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
42dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    static PassRefPtr<WebGLBuffer> create(WebGLRenderingContext*);
43dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool associateBufferData(GC3Dsizeiptr size);
452fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool associateBufferData(ArrayBuffer*);
462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool associateBufferData(ArrayBufferView*);
472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool associateBufferSubData(GC3Dintptr offset, ArrayBuffer*);
482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool associateBufferSubData(GC3Dintptr offset, ArrayBufferView*);
49dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Dsizeiptr byteLength() const;
51dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    const ArrayBuffer* elementArrayBuffer() const { return m_elementArrayBuffer.get(); }
52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Gets the cached max index for the given type. Returns -1 if
54dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // none has been set.
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int getCachedMaxIndex(GC3Denum type);
56dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Sets the cached max index for the given type.
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void setCachedMaxIndex(GC3Denum type, int value);
58dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum getTarget() const { return m_target; }
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    void setTarget(GC3Denum);
61dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bool hasEverBeenBound() const { return object() && m_target; }
634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
64dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochprotected:
65dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    WebGLBuffer(WebGLRenderingContext*);
66dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
67dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual void deleteObjectImpl(Platform3DObject o);
68dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
69dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochprivate:
70dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    virtual bool isBuffer() const { return true; }
71dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Denum m_target;
73dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
74dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    RefPtr<ArrayBuffer> m_elementArrayBuffer;
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    GC3Dsizeiptr m_byteLength;
76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
77dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Optimization for index validation. For each type of index
78dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // (i.e., UNSIGNED_SHORT), cache the maximum index in the
79dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // entire buffer.
80dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    //
81dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // This is sufficient to eliminate a lot of work upon each
82dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // draw call as long as all bound array buffers are at least
83dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // that size.
84dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    struct MaxIndexCacheEntry {
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        GC3Denum type;
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        int maxIndex;
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    };
88dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // OpenGL ES 2.0 only has two valid index types (UNSIGNED_BYTE
89dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // and UNSIGNED_SHORT), but might as well leave open the
90dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // possibility of adding others.
91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    MaxIndexCacheEntry m_maxIndexCache[4];
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    unsigned int m_nextAvailableCacheEntry;
93dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
94dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Clears all of the cached max indices.
95dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    void clearCachedMaxIndices();
96dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
97dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Helper function called by the three associateBufferData().
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool associateBufferDataImpl(ArrayBuffer* array, GC3Dintptr byteOffset, GC3Dsizeiptr byteLength);
99dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // Helper function called by the two associateBufferSubData().
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool associateBufferSubDataImpl(GC3Dintptr offset, ArrayBuffer* array, GC3Dintptr arrayByteOffset, GC3Dsizeiptr byteLength);
101dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch};
102dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif // WebGLBuffer_h
106