diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/ImageIndex.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/ImageIndex.cpp | 130 |
1 files changed, 103 insertions, 27 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/ImageIndex.cpp b/src/3rdparty/angle/src/libANGLE/ImageIndex.cpp index c84e7c5d65..6f99f8ab54 100644 --- a/src/3rdparty/angle/src/libANGLE/ImageIndex.cpp +++ b/src/3rdparty/angle/src/libANGLE/ImageIndex.cpp @@ -1,3 +1,4 @@ +#include "ImageIndex.h" // // Copyright 2014 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be @@ -16,7 +17,8 @@ namespace gl ImageIndex::ImageIndex(const ImageIndex &other) : type(other.type), mipIndex(other.mipIndex), - layerIndex(other.layerIndex) + layerIndex(other.layerIndex), + numLayers(other.numLayers) {} ImageIndex &ImageIndex::operator=(const ImageIndex &other) @@ -24,29 +26,45 @@ ImageIndex &ImageIndex::operator=(const ImageIndex &other) type = other.type; mipIndex = other.mipIndex; layerIndex = other.layerIndex; + numLayers = other.numLayers; return *this; } +bool ImageIndex::is3D() const +{ + return type == GL_TEXTURE_3D || type == GL_TEXTURE_2D_ARRAY; +} + ImageIndex ImageIndex::Make2D(GLint mipIndex) { - return ImageIndex(GL_TEXTURE_2D, mipIndex, ENTIRE_LEVEL); + return ImageIndex(GL_TEXTURE_2D, mipIndex, ENTIRE_LEVEL, 1); +} + +ImageIndex ImageIndex::MakeRectangle(GLint mipIndex) +{ + return ImageIndex(GL_TEXTURE_RECTANGLE_ANGLE, mipIndex, ENTIRE_LEVEL, 1); } ImageIndex ImageIndex::MakeCube(GLenum target, GLint mipIndex) { ASSERT(gl::IsCubeMapTextureTarget(target)); return ImageIndex(target, mipIndex, - static_cast<GLint>(CubeMapTextureTargetToLayerIndex(target))); + static_cast<GLint>(CubeMapTextureTargetToLayerIndex(target)), 1); } ImageIndex ImageIndex::Make2DArray(GLint mipIndex, GLint layerIndex) { - return ImageIndex(GL_TEXTURE_2D_ARRAY, mipIndex, layerIndex); + return ImageIndex(GL_TEXTURE_2D_ARRAY, mipIndex, layerIndex, 1); +} + +ImageIndex ImageIndex::Make2DArrayRange(GLint mipIndex, GLint layerIndex, GLint numLayers) +{ + return ImageIndex(GL_TEXTURE_2D_ARRAY, mipIndex, layerIndex, numLayers); } ImageIndex ImageIndex::Make3D(GLint mipIndex, GLint layerIndex) { - return ImageIndex(GL_TEXTURE_3D, mipIndex, layerIndex); + return ImageIndex(GL_TEXTURE_3D, mipIndex, layerIndex, 1); } ImageIndex ImageIndex::MakeGeneric(GLenum target, GLint mipIndex) @@ -54,12 +72,17 @@ ImageIndex ImageIndex::MakeGeneric(GLenum target, GLint mipIndex) GLint layerIndex = IsCubeMapTextureTarget(target) ? static_cast<GLint>(CubeMapTextureTargetToLayerIndex(target)) : ENTIRE_LEVEL; - return ImageIndex(target, mipIndex, layerIndex); + return ImageIndex(target, mipIndex, layerIndex, 1); +} + +ImageIndex ImageIndex::Make2DMultisample() +{ + return ImageIndex(GL_TEXTURE_2D_MULTISAMPLE, 0, ENTIRE_LEVEL, 1); } ImageIndex ImageIndex::MakeInvalid() { - return ImageIndex(GL_NONE, -1, -1); + return ImageIndex(GL_NONE, -1, -1, -1); } bool ImageIndex::operator<(const ImageIndex &other) const @@ -72,33 +95,58 @@ bool ImageIndex::operator<(const ImageIndex &other) const { return mipIndex < other.mipIndex; } - else + else if (layerIndex != other.layerIndex) { return layerIndex < other.layerIndex; } + else + { + return numLayers < other.numLayers; + } +} + +bool ImageIndex::operator==(const ImageIndex &other) const +{ + return (type == other.type) && (mipIndex == other.mipIndex) && + (layerIndex == other.layerIndex) && (numLayers == other.numLayers); } -ImageIndex::ImageIndex(GLenum typeIn, GLint mipIndexIn, GLint layerIndexIn) - : type(typeIn), - mipIndex(mipIndexIn), - layerIndex(layerIndexIn) +bool ImageIndex::operator!=(const ImageIndex &other) const +{ + return !(*this == other); +} + +ImageIndex::ImageIndex(GLenum typeIn, GLint mipIndexIn, GLint layerIndexIn, GLint numLayersIn) + : type(typeIn), mipIndex(mipIndexIn), layerIndex(layerIndexIn), numLayers(numLayersIn) {} +ImageIndexIterator::ImageIndexIterator(const ImageIndexIterator &other) = default; + ImageIndexIterator ImageIndexIterator::Make2D(GLint minMip, GLint maxMip) { return ImageIndexIterator(GL_TEXTURE_2D, Range<GLint>(minMip, maxMip), - Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL), NULL); + Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL), + nullptr); +} + +ImageIndexIterator ImageIndexIterator::MakeRectangle(GLint minMip, GLint maxMip) +{ + return ImageIndexIterator(GL_TEXTURE_RECTANGLE_ANGLE, Range<GLint>(minMip, maxMip), + Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL), + nullptr); } ImageIndexIterator ImageIndexIterator::MakeCube(GLint minMip, GLint maxMip) { - return ImageIndexIterator(GL_TEXTURE_CUBE_MAP, Range<GLint>(minMip, maxMip), Range<GLint>(0, 6), NULL); + return ImageIndexIterator(GL_TEXTURE_CUBE_MAP, Range<GLint>(minMip, maxMip), Range<GLint>(0, 6), + nullptr); } ImageIndexIterator ImageIndexIterator::Make3D(GLint minMip, GLint maxMip, GLint minLayer, GLint maxLayer) { - return ImageIndexIterator(GL_TEXTURE_3D, Range<GLint>(minMip, maxMip), Range<GLint>(minLayer, maxLayer), NULL); + return ImageIndexIterator(GL_TEXTURE_3D, Range<GLint>(minMip, maxMip), + Range<GLint>(minLayer, maxLayer), nullptr); } ImageIndexIterator ImageIndexIterator::Make2DArray(GLint minMip, GLint maxMip, @@ -108,19 +156,33 @@ ImageIndexIterator ImageIndexIterator::Make2DArray(GLint minMip, GLint maxMip, Range<GLint>(0, IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS), layerCounts); } -ImageIndexIterator::ImageIndexIterator(GLenum type, const Range<GLint> &mipRange, - const Range<GLint> &layerRange, const GLsizei *layerCounts) +ImageIndexIterator ImageIndexIterator::Make2DMultisample() +{ + return ImageIndexIterator(GL_TEXTURE_2D_MULTISAMPLE, Range<GLint>(0, 0), + Range<GLint>(ImageIndex::ENTIRE_LEVEL, ImageIndex::ENTIRE_LEVEL), + nullptr); +} + +ImageIndexIterator::ImageIndexIterator(GLenum type, + const Range<GLint> &mipRange, + const Range<GLint> &layerRange, + const GLsizei *layerCounts) : mType(type), mMipRange(mipRange), mLayerRange(layerRange), mLayerCounts(layerCounts), - mCurrentMip(mipRange.start), - mCurrentLayer(layerRange.start) + mCurrentMip(mipRange.low()), + mCurrentLayer(layerRange.low()) {} GLint ImageIndexIterator::maxLayer() const { - return (mLayerCounts ? static_cast<GLint>(mLayerCounts[mCurrentMip]) : mLayerRange.end); + if (mLayerCounts) + { + ASSERT(mCurrentMip >= 0); + return (mCurrentMip < mMipRange.high()) ? mLayerCounts[mCurrentMip] : 0; + } + return mLayerRange.high(); } ImageIndex ImageIndexIterator::next() @@ -134,20 +196,28 @@ ImageIndex ImageIndexIterator::next() if (mCurrentLayer != ImageIndex::ENTIRE_LEVEL) { - if (mCurrentLayer < maxLayer()-1) + if (mCurrentLayer < maxLayer() - 1) { mCurrentLayer++; } - else if (mCurrentMip < mMipRange.end-1) + else if (mCurrentMip < mMipRange.high() - 1) { mCurrentMip++; - mCurrentLayer = mLayerRange.start; + mCurrentLayer = mLayerRange.low(); + } + else + { + done(); } } - else if (mCurrentMip < mMipRange.end-1) + else if (mCurrentMip < mMipRange.high() - 1) { mCurrentMip++; - mCurrentLayer = mLayerRange.start; + mCurrentLayer = mLayerRange.low(); + } + else + { + done(); } return value; @@ -155,7 +225,7 @@ ImageIndex ImageIndexIterator::next() ImageIndex ImageIndexIterator::current() const { - ImageIndex value(mType, mCurrentMip, mCurrentLayer); + ImageIndex value(mType, mCurrentMip, mCurrentLayer, 1); if (mType == GL_TEXTURE_CUBE_MAP) { @@ -167,7 +237,13 @@ ImageIndex ImageIndexIterator::current() const bool ImageIndexIterator::hasNext() const { - return (mCurrentMip < mMipRange.end || mCurrentLayer < maxLayer()); + return (mCurrentMip < mMipRange.high() || mCurrentLayer < maxLayer()); } +void ImageIndexIterator::done() +{ + mCurrentMip = mMipRange.high(); + mCurrentLayer = maxLayer(); } + +} // namespace gl |