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