// // Copyright 2014 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // ImageIndex.h: A helper struct for indexing into an Image array #ifndef LIBANGLE_IMAGE_INDEX_H_ #define LIBANGLE_IMAGE_INDEX_H_ #include "common/mathutil.h" #include "angle_gl.h" namespace gl { class ImageIndexIterator; struct ImageIndex { GLenum type; GLint mipIndex; GLint layerIndex; GLint numLayers; ImageIndex(const ImageIndex &other); ImageIndex &operator=(const ImageIndex &other); bool hasLayer() const { return layerIndex != ENTIRE_LEVEL; } bool is3D() const; static ImageIndex Make2D(GLint mipIndex); static ImageIndex MakeRectangle(GLint mipIndex); static ImageIndex MakeCube(GLenum target, GLint mipIndex); static ImageIndex Make2DArray(GLint mipIndex, GLint layerIndex); static ImageIndex Make2DArrayRange(GLint mipIndex, GLint layerIndex, GLint numLayers); static ImageIndex Make3D(GLint mipIndex, GLint layerIndex = ENTIRE_LEVEL); static ImageIndex MakeGeneric(GLenum target, GLint mipIndex); static ImageIndex Make2DMultisample(); static ImageIndex MakeInvalid(); static const GLint ENTIRE_LEVEL = static_cast(-1); bool operator<(const ImageIndex &other) const; bool operator==(const ImageIndex &other) const; bool operator!=(const ImageIndex &other) const; private: friend class ImageIndexIterator; ImageIndex(GLenum typeIn, GLint mipIndexIn, GLint layerIndexIn, GLint numLayersIn); }; class ImageIndexIterator { public: ImageIndexIterator(const ImageIndexIterator &other); static ImageIndexIterator Make2D(GLint minMip, GLint maxMip); static ImageIndexIterator MakeRectangle(GLint minMip, GLint maxMip); static ImageIndexIterator MakeCube(GLint minMip, GLint maxMip); static ImageIndexIterator Make3D(GLint minMip, GLint maxMip, GLint minLayer, GLint maxLayer); static ImageIndexIterator Make2DArray(GLint minMip, GLint maxMip, const GLsizei *layerCounts); static ImageIndexIterator Make2DMultisample(); ImageIndex next(); ImageIndex current() const; bool hasNext() const; private: ImageIndexIterator(GLenum type, const Range &mipRange, const Range &layerRange, const GLsizei *layerCounts); GLint maxLayer() const; void done(); GLenum mType; Range mMipRange; Range mLayerRange; const GLsizei *mLayerCounts; GLint mCurrentMip; GLint mCurrentLayer; }; } #endif // LIBANGLE_IMAGE_INDEX_H_