diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp | 227 |
1 files changed, 202 insertions, 25 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp b/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp index 352a326c23..cf6bd9c264 100644 --- a/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp +++ b/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp @@ -11,17 +11,48 @@ #include "common/utilities.h" #include "libANGLE/Config.h" +#include "libANGLE/Context.h" #include "libANGLE/Renderbuffer.h" #include "libANGLE/Surface.h" #include "libANGLE/Texture.h" #include "libANGLE/formatutils.h" +#include "libANGLE/renderer/FramebufferAttachmentObjectImpl.h" #include "libANGLE/renderer/FramebufferImpl.h" namespace gl { +namespace +{ + +std::vector<Offset> TransformViewportOffsetArrayToVectorOfOffsets(const GLint *viewportOffsets, + GLsizei numViews) +{ + const size_t numViewsAsSizeT = static_cast<size_t>(numViews); + std::vector<Offset> offsetVector; + offsetVector.reserve(numViewsAsSizeT); + for (size_t i = 0u; i < numViewsAsSizeT; ++i) + { + offsetVector.emplace_back(Offset(viewportOffsets[i * 2u], viewportOffsets[i * 2u + 1u], 0)); + } + return offsetVector; +} + +} // namespace + ////// FramebufferAttachment::Target Implementation ////// +const GLsizei FramebufferAttachment::kDefaultNumViews = 1; +const GLenum FramebufferAttachment::kDefaultMultiviewLayout = GL_NONE; +const GLint FramebufferAttachment::kDefaultBaseViewIndex = 0; +const GLint FramebufferAttachment::kDefaultViewportOffsets[2] = {0}; + +std::vector<Offset> FramebufferAttachment::GetDefaultViewportOffsetVector() +{ + return TransformViewportOffsetArrayToVectorOfOffsets( + FramebufferAttachment::kDefaultViewportOffsets, FramebufferAttachment::kDefaultNumViews); +} + FramebufferAttachment::Target::Target() : mBinding(GL_NONE), mTextureIndex(ImageIndex::MakeInvalid()) @@ -50,106 +81,143 @@ FramebufferAttachment::Target &FramebufferAttachment::Target::operator=(const Ta ////// FramebufferAttachment Implementation ////// FramebufferAttachment::FramebufferAttachment() - : mType(GL_NONE), mResource(nullptr) + : mType(GL_NONE), + mResource(nullptr), + mNumViews(kDefaultNumViews), + mMultiviewLayout(kDefaultMultiviewLayout), + mBaseViewIndex(kDefaultBaseViewIndex), + mViewportOffsets(GetDefaultViewportOffsetVector()) { } -FramebufferAttachment::FramebufferAttachment(GLenum type, +FramebufferAttachment::FramebufferAttachment(const Context *context, + GLenum type, GLenum binding, const ImageIndex &textureIndex, FramebufferAttachmentObject *resource) : mResource(nullptr) { - attach(type, binding, textureIndex, resource); + attach(context, type, binding, textureIndex, resource, kDefaultNumViews, kDefaultBaseViewIndex, + kDefaultMultiviewLayout, kDefaultViewportOffsets); } -FramebufferAttachment::FramebufferAttachment(const FramebufferAttachment &other) - : mResource(nullptr) +FramebufferAttachment::FramebufferAttachment(FramebufferAttachment &&other) + : FramebufferAttachment() { - attach(other.mType, other.mTarget.binding(), other.mTarget.textureIndex(), other.mResource); + *this = std::move(other); } -FramebufferAttachment &FramebufferAttachment::operator=(const FramebufferAttachment &other) +FramebufferAttachment &FramebufferAttachment::operator=(FramebufferAttachment &&other) { - attach(other.mType, other.mTarget.binding(), other.mTarget.textureIndex(), other.mResource); + std::swap(mType, other.mType); + std::swap(mTarget, other.mTarget); + std::swap(mResource, other.mResource); + std::swap(mNumViews, other.mNumViews); + std::swap(mMultiviewLayout, other.mMultiviewLayout); + std::swap(mBaseViewIndex, other.mBaseViewIndex); + std::swap(mViewportOffsets, other.mViewportOffsets); return *this; } FramebufferAttachment::~FramebufferAttachment() { - detach(); + ASSERT(!isAttached()); } -void FramebufferAttachment::detach() +void FramebufferAttachment::detach(const Context *context) { mType = GL_NONE; if (mResource != nullptr) { - mResource->onDetach(); + mResource->onDetach(context); mResource = nullptr; } + mNumViews = kDefaultNumViews; + mMultiviewLayout = kDefaultMultiviewLayout; + mBaseViewIndex = kDefaultBaseViewIndex; + mViewportOffsets = GetDefaultViewportOffsetVector(); // not technically necessary, could omit for performance mTarget = Target(); } -void FramebufferAttachment::attach(GLenum type, +void FramebufferAttachment::attach(const Context *context, + GLenum type, GLenum binding, const ImageIndex &textureIndex, - FramebufferAttachmentObject *resource) + FramebufferAttachmentObject *resource, + GLsizei numViews, + GLuint baseViewIndex, + GLenum multiviewLayout, + const GLint *viewportOffsets) { + if (resource == nullptr) + { + detach(context); + return; + } + mType = type; mTarget = Target(binding, textureIndex); - - if (resource) + mNumViews = numViews; + mBaseViewIndex = baseViewIndex; + mMultiviewLayout = multiviewLayout; + if (multiviewLayout == GL_FRAMEBUFFER_MULTIVIEW_SIDE_BY_SIDE_ANGLE) { - resource->onAttach(); + mViewportOffsets = TransformViewportOffsetArrayToVectorOfOffsets(viewportOffsets, numViews); } + else + { + mViewportOffsets = GetDefaultViewportOffsetVector(); + } + resource->onAttach(context); + if (mResource != nullptr) { - mResource->onDetach(); + mResource->onDetach(context); } + mResource = resource; } GLuint FramebufferAttachment::getRedSize() const { - return GetInternalFormatInfo(getInternalFormat()).redBits; + return getFormat().info->redBits; } GLuint FramebufferAttachment::getGreenSize() const { - return GetInternalFormatInfo(getInternalFormat()).greenBits; + return getFormat().info->greenBits; } GLuint FramebufferAttachment::getBlueSize() const { - return GetInternalFormatInfo(getInternalFormat()).blueBits; + return getFormat().info->blueBits; } GLuint FramebufferAttachment::getAlphaSize() const { - return GetInternalFormatInfo(getInternalFormat()).alphaBits; + return getFormat().info->alphaBits; } GLuint FramebufferAttachment::getDepthSize() const { - return GetInternalFormatInfo(getInternalFormat()).depthBits; + return getFormat().info->depthBits; } GLuint FramebufferAttachment::getStencilSize() const { - return GetInternalFormatInfo(getInternalFormat()).stencilBits; + return getFormat().info->stencilBits; } GLenum FramebufferAttachment::getComponentType() const { - return GetInternalFormatInfo(getInternalFormat()).componentType; + return getFormat().info->componentType; } GLenum FramebufferAttachment::getColorEncoding() const { - return GetInternalFormatInfo(getInternalFormat()).colorEncoding; + return getFormat().info->colorEncoding; } GLuint FramebufferAttachment::id() const @@ -190,6 +258,26 @@ GLint FramebufferAttachment::layer() const return 0; } +GLsizei FramebufferAttachment::getNumViews() const +{ + return mNumViews; +} + +GLenum FramebufferAttachment::getMultiviewLayout() const +{ + return mMultiviewLayout; +} + +GLint FramebufferAttachment::getBaseViewIndex() const +{ + return mBaseViewIndex; +} + +const std::vector<Offset> &FramebufferAttachment::getMultiviewViewportOffsets() const +{ + return mViewportOffsets; +} + Texture *FramebufferAttachment::getTexture() const { return rx::GetAs<Texture>(mResource); @@ -205,4 +293,93 @@ const egl::Surface *FramebufferAttachment::getSurface() const return rx::GetAs<egl::Surface>(mResource); } +FramebufferAttachmentObject *FramebufferAttachment::getResource() const +{ + return mResource; } + +bool FramebufferAttachment::operator==(const FramebufferAttachment &other) const +{ + if (mResource != other.mResource || mType != other.mType || mNumViews != other.mNumViews || + mMultiviewLayout != other.mMultiviewLayout || mBaseViewIndex != other.mBaseViewIndex || + mViewportOffsets != other.mViewportOffsets) + { + return false; + } + + if (mType == GL_TEXTURE && getTextureImageIndex() != other.getTextureImageIndex()) + { + return false; + } + + return true; +} + +bool FramebufferAttachment::operator!=(const FramebufferAttachment &other) const +{ + return !(*this == other); +} + +InitState FramebufferAttachment::initState() const +{ + return mResource ? mResource->initState(mTarget.textureIndex()) : InitState::Initialized; +} + +Error FramebufferAttachment::initializeContents(const Context *context) +{ + ASSERT(mResource); + ANGLE_TRY(mResource->initializeContents(context, mTarget.textureIndex())); + setInitState(InitState::Initialized); + return NoError(); +} + +void FramebufferAttachment::setInitState(InitState initState) const +{ + ASSERT(mResource); + mResource->setInitState(mTarget.textureIndex(), initState); +} + +////// FramebufferAttachmentObject Implementation ////// + +FramebufferAttachmentObject::FramebufferAttachmentObject() +{ +} + +FramebufferAttachmentObject::~FramebufferAttachmentObject() +{ +} + +Error FramebufferAttachmentObject::getAttachmentRenderTarget( + const Context *context, + GLenum binding, + const ImageIndex &imageIndex, + rx::FramebufferAttachmentRenderTarget **rtOut) const +{ + return getAttachmentImpl()->getAttachmentRenderTarget(context, binding, imageIndex, rtOut); +} + +OnAttachmentDirtyChannel *FramebufferAttachmentObject::getDirtyChannel() +{ + return &mDirtyChannel; +} + +Error FramebufferAttachmentObject::initializeContents(const Context *context, + const ImageIndex &imageIndex) +{ + ASSERT(context->isRobustResourceInitEnabled()); + + // Because gl::Texture cannot support tracking individual layer dirtiness, we only handle + // initializing entire mip levels for 2D array textures. + if (imageIndex.type == GL_TEXTURE_2D_ARRAY && imageIndex.hasLayer()) + { + ImageIndex fullMipIndex = imageIndex; + fullMipIndex.layerIndex = ImageIndex::ENTIRE_LEVEL; + return getAttachmentImpl()->initializeContents(context, fullMipIndex); + } + else + { + return getAttachmentImpl()->initializeContents(context, imageIndex); + } +} + +} // namespace gl |