summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp')
-rw-r--r--src/3rdparty/angle/src/libANGLE/FramebufferAttachment.cpp227
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