1 /*
2  * Copyright (C) 2009 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef WebGLBuffer_h
27 #define WebGLBuffer_h
28 
29 #include "ArrayBuffer.h"
30 #include "WebGLObject.h"
31 
32 #include <wtf/PassRefPtr.h>
33 #include <wtf/RefCounted.h>
34 
35 namespace WebCore {
36 class ArrayBufferView;
37 
38 class WebGLBuffer : public WebGLObject {
39 public:
~WebGLBuffer()40     virtual ~WebGLBuffer() { deleteObject(); }
41 
42     static PassRefPtr<WebGLBuffer> create(WebGLRenderingContext*);
43 
44     bool associateBufferData(GC3Dsizeiptr size);
45     bool associateBufferData(ArrayBuffer*);
46     bool associateBufferData(ArrayBufferView*);
47     bool associateBufferSubData(GC3Dintptr offset, ArrayBuffer*);
48     bool associateBufferSubData(GC3Dintptr offset, ArrayBufferView*);
49 
50     GC3Dsizeiptr byteLength() const;
elementArrayBuffer()51     const ArrayBuffer* elementArrayBuffer() const { return m_elementArrayBuffer.get(); }
52 
53     // Gets the cached max index for the given type. Returns -1 if
54     // none has been set.
55     int getCachedMaxIndex(GC3Denum type);
56     // Sets the cached max index for the given type.
57     void setCachedMaxIndex(GC3Denum type, int value);
58 
getTarget()59     GC3Denum getTarget() const { return m_target; }
60     void setTarget(GC3Denum);
61 
hasEverBeenBound()62     bool hasEverBeenBound() const { return object() && m_target; }
63 
64 protected:
65     WebGLBuffer(WebGLRenderingContext*);
66 
67     virtual void deleteObjectImpl(Platform3DObject o);
68 
69 private:
isBuffer()70     virtual bool isBuffer() const { return true; }
71 
72     GC3Denum m_target;
73 
74     RefPtr<ArrayBuffer> m_elementArrayBuffer;
75     GC3Dsizeiptr m_byteLength;
76 
77     // Optimization for index validation. For each type of index
78     // (i.e., UNSIGNED_SHORT), cache the maximum index in the
79     // entire buffer.
80     //
81     // This is sufficient to eliminate a lot of work upon each
82     // draw call as long as all bound array buffers are at least
83     // that size.
84     struct MaxIndexCacheEntry {
85         GC3Denum type;
86         int maxIndex;
87     };
88     // OpenGL ES 2.0 only has two valid index types (UNSIGNED_BYTE
89     // and UNSIGNED_SHORT), but might as well leave open the
90     // possibility of adding others.
91     MaxIndexCacheEntry m_maxIndexCache[4];
92     unsigned int m_nextAvailableCacheEntry;
93 
94     // Clears all of the cached max indices.
95     void clearCachedMaxIndices();
96 
97     // Helper function called by the three associateBufferData().
98     bool associateBufferDataImpl(ArrayBuffer* array, GC3Dintptr byteOffset, GC3Dsizeiptr byteLength);
99     // Helper function called by the two associateBufferSubData().
100     bool associateBufferSubDataImpl(GC3Dintptr offset, ArrayBuffer* array, GC3Dintptr arrayByteOffset, GC3Dsizeiptr byteLength);
101 };
102 
103 } // namespace WebCore
104 
105 #endif // WebGLBuffer_h
106