Commit 623d0443 by Jamie Madill Committed by Commit Bot

Revert "Vulkan: Forward RenderBuffer/Surface dirty messages."

This reverts commit 3fb33ade. Reason for revert: Causing WebGL test failures on GLES/ANGLE/Android. Bug: chromium:1072739 Original change's description: > Vulkan: Forward RenderBuffer/Surface dirty messages. > > Previously we were only forwarding Texture staging changes to the > Framebuffer for re-sync. We could miss out on clears that were staged > in Surfaces and Renderbuffer attachments. Complete the chain by making > the SurfaceVk and RenderbufferVk forward notifications from the > VkImage. > > Bug: angleproject:4517 > Change-Id: I15f36c225517e915f656d0c2464a99631ef9f945 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2150699 > Reviewed-by: Cody Northrop <cnorthrop@google.com> > Commit-Queue: Jamie Madill <jmadill@chromium.org> TBR=cnorthrop@google.com,timvp@google.com,jmadill@chromium.org # Not skipping CQ checks because original CL landed > 1 day ago. Bug: angleproject:4517 Change-Id: I4fd4d79dc11da0ba86065d3a80975de4c791a2a0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2159288Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 293c36c0
...@@ -195,7 +195,7 @@ class FramebufferAttachment final ...@@ -195,7 +195,7 @@ class FramebufferAttachment final
}; };
// A base class for objects that FBO Attachments may point to. // A base class for objects that FBO Attachments may point to.
class FramebufferAttachmentObject : public angle::Subject, public angle::ObserverInterface class FramebufferAttachmentObject : public angle::Subject
{ {
public: public:
FramebufferAttachmentObject(); FramebufferAttachmentObject();
......
...@@ -49,8 +49,6 @@ const Display *DisplayFromContext(const gl::Context *context) ...@@ -49,8 +49,6 @@ const Display *DisplayFromContext(const gl::Context *context)
{ {
return (context ? context->getDisplay() : nullptr); return (context ? context->getDisplay() : nullptr);
} }
angle::SubjectIndex kExternalImageImplSubjectIndex = 0;
} // anonymous namespace } // anonymous namespace
ImageSibling::ImageSibling() : FramebufferAttachmentObject(), mSourcesOf(), mTargetOf() {} ImageSibling::ImageSibling() : FramebufferAttachmentObject(), mSourcesOf(), mTargetOf() {}
...@@ -147,11 +145,8 @@ ExternalImageSibling::ExternalImageSibling(rx::EGLImplFactory *factory, ...@@ -147,11 +145,8 @@ ExternalImageSibling::ExternalImageSibling(rx::EGLImplFactory *factory,
EGLenum target, EGLenum target,
EGLClientBuffer buffer, EGLClientBuffer buffer,
const AttributeMap &attribs) const AttributeMap &attribs)
: mImplementation(factory->createExternalImageSibling(context, target, buffer, attribs)), : mImplementation(factory->createExternalImageSibling(context, target, buffer, attribs))
mImplObserverBinding(this, kExternalImageImplSubjectIndex) {}
{
mImplObserverBinding.bind(mImplementation.get());
}
ExternalImageSibling::~ExternalImageSibling() = default; ExternalImageSibling::~ExternalImageSibling() = default;
...@@ -216,14 +211,6 @@ rx::ExternalImageSiblingImpl *ExternalImageSibling::getImplementation() const ...@@ -216,14 +211,6 @@ rx::ExternalImageSiblingImpl *ExternalImageSibling::getImplementation() const
return mImplementation.get(); return mImplementation.get();
} }
void ExternalImageSibling::onSubjectStateChange(angle::SubjectIndex index,
angle::SubjectMessage message)
{
ASSERT(message == angle::SubjectMessage::SubjectChanged &&
index == kExternalImageImplSubjectIndex);
onStateChange(angle::SubjectMessage::ContentsChanged);
}
rx::FramebufferAttachmentObjectImpl *ExternalImageSibling::getAttachmentImpl() const rx::FramebufferAttachmentObjectImpl *ExternalImageSibling::getAttachmentImpl() const
{ {
return mImplementation.get(); return mImplementation.get();
......
...@@ -38,7 +38,7 @@ class Display; ...@@ -38,7 +38,7 @@ class Display;
// Only currently Renderbuffers and Textures can be bound with images. This makes the relationship // Only currently Renderbuffers and Textures can be bound with images. This makes the relationship
// explicit, and also ensures that an image sibling can determine if it's been initialized or not, // explicit, and also ensures that an image sibling can determine if it's been initialized or not,
// which is important for the robust resource init extension with Textures and EGLImages. // which is important for the robust resource init extension with Textures and EGLImages.
class ImageSibling : public gl::FramebufferAttachmentObject class ImageSibling : public gl::FramebufferAttachmentObject, public angle::ObserverInterface
{ {
public: public:
ImageSibling(); ImageSibling();
...@@ -52,6 +52,12 @@ class ImageSibling : public gl::FramebufferAttachmentObject ...@@ -52,6 +52,12 @@ class ImageSibling : public gl::FramebufferAttachmentObject
GLenum binding, GLenum binding,
const gl::ImageIndex &imageIndex) const override; const gl::ImageIndex &imageIndex) const override;
// ObserverInterface implementation
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override
{
// default to no-op.
}
protected: protected:
// Set the image target of this sibling // Set the image target of this sibling
void setTargetImage(const gl::Context *context, egl::Image *imageTarget); void setTargetImage(const gl::Context *context, egl::Image *imageTarget);
...@@ -111,11 +117,7 @@ class ExternalImageSibling : public ImageSibling ...@@ -111,11 +117,7 @@ class ExternalImageSibling : public ImageSibling
rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override; rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override;
private: private:
// ObserverInterface implementation.
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
std::unique_ptr<rx::ExternalImageSiblingImpl> mImplementation; std::unique_ptr<rx::ExternalImageSiblingImpl> mImplementation;
angle::ObserverBinding mImplObserverBinding;
}; };
struct ImageState : private angle::NonCopyable struct ImageState : private angle::NonCopyable
......
...@@ -22,11 +22,6 @@ ...@@ -22,11 +22,6 @@
namespace gl namespace gl
{ {
namespace
{
angle::SubjectIndex kRenderbufferImplSubjectIndex = 0;
} // namespace
// RenderbufferState implementation. // RenderbufferState implementation.
RenderbufferState::RenderbufferState() RenderbufferState::RenderbufferState()
: mWidth(0), mHeight(0), mFormat(GL_RGBA4), mSamples(0), mInitState(InitState::MayNeedInit) : mWidth(0), mHeight(0), mFormat(GL_RGBA4), mSamples(0), mInitState(InitState::MayNeedInit)
...@@ -72,11 +67,8 @@ Renderbuffer::Renderbuffer(rx::GLImplFactory *implFactory, RenderbufferID id) ...@@ -72,11 +67,8 @@ Renderbuffer::Renderbuffer(rx::GLImplFactory *implFactory, RenderbufferID id)
: RefCountObject(implFactory->generateSerial(), id), : RefCountObject(implFactory->generateSerial(), id),
mState(), mState(),
mImplementation(implFactory->createRenderbuffer(mState)), mImplementation(implFactory->createRenderbuffer(mState)),
mLabel(), mLabel()
mImplObserverBinding(this, kRenderbufferImplSubjectIndex) {}
{
mImplObserverBinding.bind(mImplementation.get());
}
void Renderbuffer::onDestroy(const Context *context) void Renderbuffer::onDestroy(const Context *context)
{ {
...@@ -313,10 +305,4 @@ angle::Result Renderbuffer::getRenderbufferImage(const Context *context, ...@@ -313,10 +305,4 @@ angle::Result Renderbuffer::getRenderbufferImage(const Context *context,
return mImplementation->getRenderbufferImage(context, packState, packBuffer, format, type, return mImplementation->getRenderbufferImage(context, packState, packBuffer, format, type,
pixels); pixels);
} }
void Renderbuffer::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
{
ASSERT(message == angle::SubjectMessage::SubjectChanged);
onStateChange(angle::SubjectMessage::ContentsChanged);
}
} // namespace gl } // namespace gl
...@@ -127,16 +127,12 @@ class Renderbuffer final : public RefCountObject<RenderbufferID>, ...@@ -127,16 +127,12 @@ class Renderbuffer final : public RefCountObject<RenderbufferID>,
void *pixels) const; void *pixels) const;
private: private:
// ObserverInterface implementation.
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override; rx::FramebufferAttachmentObjectImpl *getAttachmentImpl() const override;
RenderbufferState mState; RenderbufferState mState;
std::unique_ptr<rx::RenderbufferImpl> mImplementation; std::unique_ptr<rx::RenderbufferImpl> mImplementation;
std::string mLabel; std::string mLabel;
angle::ObserverBinding mImplObserverBinding;
}; };
} // namespace gl } // namespace gl
......
...@@ -24,10 +24,6 @@ ...@@ -24,10 +24,6 @@
namespace egl namespace egl
{ {
namespace
{
angle::SubjectIndex kSurfaceImplSubjectIndex = 0;
} // namespace
SurfaceState::SurfaceState(const egl::Config *configIn, const AttributeMap &attributesIn) SurfaceState::SurfaceState(const egl::Config *configIn, const AttributeMap &attributesIn)
: label(nullptr), : label(nullptr),
...@@ -78,8 +74,7 @@ Surface::Surface(EGLint surfaceType, ...@@ -78,8 +74,7 @@ Surface::Surface(EGLint surfaceType,
mTexture(nullptr), mTexture(nullptr),
mColorFormat(config->renderTargetFormat), mColorFormat(config->renderTargetFormat),
mDSFormat(config->depthStencilFormat), mDSFormat(config->depthStencilFormat),
mInitState(gl::InitState::Initialized), mInitState(gl::InitState::Initialized)
mImplObserverBinding(this, kSurfaceImplSubjectIndex)
{ {
mPostSubBufferRequested = mPostSubBufferRequested =
(attributes.get(EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_FALSE) == EGL_TRUE); (attributes.get(EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_FALSE) == EGL_TRUE);
...@@ -210,8 +205,6 @@ Error Surface::initialize(const Display *display) ...@@ -210,8 +205,6 @@ Error Surface::initialize(const Display *display)
mState.supportedTimestamps = mImplementation->getSupportedTimestamps(); mState.supportedTimestamps = mImplementation->getSupportedTimestamps();
} }
mImplObserverBinding.bind(mImplementation);
return NoError(); return NoError();
} }
...@@ -586,12 +579,6 @@ Error Surface::getFrameTimestamps(EGLuint64KHR frameId, ...@@ -586,12 +579,6 @@ Error Surface::getFrameTimestamps(EGLuint64KHR frameId,
return mImplementation->getFrameTimestamps(frameId, numTimestamps, timestamps, values); return mImplementation->getFrameTimestamps(frameId, numTimestamps, timestamps, values);
} }
void Surface::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
{
ASSERT(message == angle::SubjectMessage::SubjectChanged && index == kSurfaceImplSubjectIndex);
onStateChange(angle::SubjectMessage::ContentsChanged);
}
WindowSurface::WindowSurface(rx::EGLImplFactory *implFactory, WindowSurface::WindowSurface(rx::EGLImplFactory *implFactory,
const egl::Config *config, const egl::Config *config,
EGLNativeWindowType window, EGLNativeWindowType window,
......
...@@ -232,11 +232,7 @@ class Surface : public LabeledObject, public gl::FramebufferAttachmentObject ...@@ -232,11 +232,7 @@ class Surface : public LabeledObject, public gl::FramebufferAttachmentObject
void postSwap(const gl::Context *context); void postSwap(const gl::Context *context);
Error releaseRef(const Display *display); Error releaseRef(const Display *display);
// ObserverInterface implementation.
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
gl::InitState mInitState; gl::InitState mInitState;
angle::ObserverBinding mImplObserverBinding;
}; };
class WindowSurface final : public Surface class WindowSurface final : public Surface
......
...@@ -23,11 +23,11 @@ namespace rx ...@@ -23,11 +23,11 @@ namespace rx
{ {
class FramebufferAttachmentRenderTarget; class FramebufferAttachmentRenderTarget;
class FramebufferAttachmentObjectImpl : public angle::Subject class FramebufferAttachmentObjectImpl : angle::NonCopyable
{ {
public: public:
FramebufferAttachmentObjectImpl() {} FramebufferAttachmentObjectImpl() {}
~FramebufferAttachmentObjectImpl() override {} virtual ~FramebufferAttachmentObjectImpl() {}
virtual angle::Result getAttachmentRenderTarget(const gl::Context *context, virtual angle::Result getAttachmentRenderTarget(const gl::Context *context,
GLenum binding, GLenum binding,
......
...@@ -41,7 +41,7 @@ namespace rx ...@@ -41,7 +41,7 @@ namespace rx
{ {
class ContextImpl; class ContextImpl;
class TextureImpl : public FramebufferAttachmentObjectImpl class TextureImpl : public FramebufferAttachmentObjectImpl, public angle::Subject
{ {
public: public:
TextureImpl(const gl::TextureState &state); TextureImpl(const gl::TextureState &state);
......
...@@ -17,16 +17,8 @@ ...@@ -17,16 +17,8 @@
namespace rx namespace rx
{ {
namespace
{
angle::SubjectIndex kRenderbufferImageSubjectIndex = 0;
} // namespace
RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state) RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
: RenderbufferImpl(state), : RenderbufferImpl(state), mOwnsImage(false), mImage(nullptr)
mOwnsImage(false),
mImage(nullptr),
mImageObserverBinding(this, kRenderbufferImageSubjectIndex)
{} {}
RenderbufferVk::~RenderbufferVk() {} RenderbufferVk::~RenderbufferVk() {}
...@@ -69,7 +61,6 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context, ...@@ -69,7 +61,6 @@ angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
{ {
mImage = new vk::ImageHelper(); mImage = new vk::ImageHelper();
mOwnsImage = true; mOwnsImage = true;
mImageObserverBinding.bind(mImage);
} }
const angle::Format &textureFormat = vkFormat.actualImageFormat(); const angle::Format &textureFormat = vkFormat.actualImageFormat();
...@@ -121,7 +112,6 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex ...@@ -121,7 +112,6 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex
ImageVk *imageVk = vk::GetImpl(image); ImageVk *imageVk = vk::GetImpl(image);
mImage = imageVk->getImage(); mImage = imageVk->getImage();
mOwnsImage = false; mOwnsImage = false;
mImageObserverBinding.bind(mImage);
const vk::Format &vkFormat = renderer->getFormat(image->getFormat().info->sizedInternalFormat); const vk::Format &vkFormat = renderer->getFormat(image->getFormat().info->sizedInternalFormat);
const angle::Format &textureFormat = vkFormat.actualImageFormat(); const angle::Format &textureFormat = vkFormat.actualImageFormat();
...@@ -183,7 +173,6 @@ void RenderbufferVk::releaseAndDeleteImage(ContextVk *contextVk) ...@@ -183,7 +173,6 @@ void RenderbufferVk::releaseAndDeleteImage(ContextVk *contextVk)
{ {
releaseImage(contextVk); releaseImage(contextVk);
SafeDelete(mImage); SafeDelete(mImage);
mImageObserverBinding.bind(nullptr);
} }
void RenderbufferVk::releaseImage(ContextVk *contextVk) void RenderbufferVk::releaseImage(ContextVk *contextVk)
...@@ -198,7 +187,6 @@ void RenderbufferVk::releaseImage(ContextVk *contextVk) ...@@ -198,7 +187,6 @@ void RenderbufferVk::releaseImage(ContextVk *contextVk)
else else
{ {
mImage = nullptr; mImage = nullptr;
mImageObserverBinding.bind(nullptr);
} }
mImageViews.release(renderer); mImageViews.release(renderer);
...@@ -238,13 +226,4 @@ angle::Result RenderbufferVk::getRenderbufferImage(const gl::Context *context, ...@@ -238,13 +226,4 @@ angle::Result RenderbufferVk::getRenderbufferImage(const gl::Context *context,
return mImage->readPixelsForGetImage(contextVk, packState, packBuffer, 0, 0, format, type, return mImage->readPixelsForGetImage(contextVk, packState, packBuffer, 0, 0, format, type,
pixels); pixels);
} }
void RenderbufferVk::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
{
ASSERT(index == kRenderbufferImageSubjectIndex &&
message == angle::SubjectMessage::SubjectChanged);
// Forward the notification to the parent class that the staging buffer changed.
onStateChange(angle::SubjectMessage::SubjectChanged);
}
} // namespace rx } // namespace rx
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
namespace rx namespace rx
{ {
class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface class RenderbufferVk : public RenderbufferImpl
{ {
public: public:
RenderbufferVk(const gl::RenderbufferState &state); RenderbufferVk(const gl::RenderbufferState &state);
...@@ -70,15 +70,10 @@ class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface ...@@ -70,15 +70,10 @@ class RenderbufferVk : public RenderbufferImpl, public angle::ObserverInterface
const gl::InternalFormat &getImplementationSizedFormat() const; const gl::InternalFormat &getImplementationSizedFormat() const;
// We monitor the staging buffer for changes. This handles staged data from outside this class.
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
bool mOwnsImage; bool mOwnsImage;
vk::ImageHelper *mImage; vk::ImageHelper *mImage;
vk::ImageViewHelper mImageViews; vk::ImageViewHelper mImageViews;
RenderTargetVk mRenderTarget; RenderTargetVk mRenderTarget;
angle::ObserverBinding mImageObserverBinding;
}; };
} // namespace rx } // namespace rx
......
...@@ -27,8 +27,6 @@ namespace rx ...@@ -27,8 +27,6 @@ namespace rx
namespace namespace
{ {
angle::SubjectIndex kAnySurfaceImageSubjectIndex = 0;
GLint GetSampleCount(const egl::Config *config) GLint GetSampleCount(const egl::Config *config)
{ {
GLint samples = 1; GLint samples = 1;
...@@ -139,17 +137,7 @@ angle::Result SurfaceVk::getAttachmentRenderTarget(const gl::Context *context, ...@@ -139,17 +137,7 @@ angle::Result SurfaceVk::getAttachmentRenderTarget(const gl::Context *context,
return angle::Result::Continue; return angle::Result::Continue;
} }
void SurfaceVk::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) OffscreenSurfaceVk::AttachmentImage::AttachmentImage() {}
{
// Forward the notification to parent class that the staging buffer changed.
onStateChange(angle::SubjectMessage::SubjectChanged);
}
OffscreenSurfaceVk::AttachmentImage::AttachmentImage(SurfaceVk *surfaceVk)
: imageObserverBinding(surfaceVk, kAnySurfaceImageSubjectIndex)
{
imageObserverBinding.bind(&image);
}
OffscreenSurfaceVk::AttachmentImage::~AttachmentImage() = default; OffscreenSurfaceVk::AttachmentImage::~AttachmentImage() = default;
...@@ -229,9 +217,7 @@ void OffscreenSurfaceVk::AttachmentImage::destroy(const egl::Display *display) ...@@ -229,9 +217,7 @@ void OffscreenSurfaceVk::AttachmentImage::destroy(const egl::Display *display)
OffscreenSurfaceVk::OffscreenSurfaceVk(const egl::SurfaceState &surfaceState) OffscreenSurfaceVk::OffscreenSurfaceVk(const egl::SurfaceState &surfaceState)
: SurfaceVk(surfaceState), : SurfaceVk(surfaceState),
mWidth(mState.attributes.getAsInt(EGL_WIDTH, 0)), mWidth(mState.attributes.getAsInt(EGL_WIDTH, 0)),
mHeight(mState.attributes.getAsInt(EGL_HEIGHT, 0)), mHeight(mState.attributes.getAsInt(EGL_HEIGHT, 0))
mColorAttachment(this),
mDepthStencilAttachment(this)
{ {
mColorRenderTarget.init(&mColorAttachment.image, &mColorAttachment.imageViews, 0, 0); mColorRenderTarget.init(&mColorAttachment.image, &mColorAttachment.imageViews, 0, 0);
mDepthStencilRenderTarget.init(&mDepthStencilAttachment.image, mDepthStencilRenderTarget.init(&mDepthStencilAttachment.image,
...@@ -465,16 +451,12 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState, EGLNativ ...@@ -465,16 +451,12 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState, EGLNativ
mPreTransform(VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR), mPreTransform(VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR),
mCompositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR), mCompositeAlpha(VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR),
mCurrentSwapHistoryIndex(0), mCurrentSwapHistoryIndex(0),
mCurrentSwapchainImageIndex(0), mCurrentSwapchainImageIndex(0)
mDepthStencilImageBinding(this, kAnySurfaceImageSubjectIndex),
mColorImageMSBinding(this, kAnySurfaceImageSubjectIndex)
{ {
// Initialize the color render target with the multisampled targets. If not multisampled, the // Initialize the color render target with the multisampled targets. If not multisampled, the
// render target will be updated to refer to a swapchain image on every acquire. // render target will be updated to refer to a swapchain image on every acquire.
mColorRenderTarget.init(&mColorImageMS, &mColorImageMSViews, 0, 0); mColorRenderTarget.init(&mColorImageMS, &mColorImageMSViews, 0, 0);
mDepthStencilRenderTarget.init(&mDepthStencilImage, &mDepthStencilImageViews, 0, 0); mDepthStencilRenderTarget.init(&mDepthStencilImage, &mDepthStencilImageViews, 0, 0);
mDepthStencilImageBinding.bind(&mDepthStencilImage);
mColorImageMSBinding.bind(&mColorImageMS);
} }
WindowSurfaceVk::~WindowSurfaceVk() WindowSurfaceVk::~WindowSurfaceVk()
...@@ -799,25 +781,7 @@ static VkColorSpaceKHR MapEglColorSpaceToVkColorSpace(EGLenum EGLColorspace) ...@@ -799,25 +781,7 @@ static VkColorSpaceKHR MapEglColorSpaceToVkColorSpace(EGLenum EGLColorspace)
angle::Result WindowSurfaceVk::resizeSwapchainImages(vk::Context *context, uint32_t imageCount) angle::Result WindowSurfaceVk::resizeSwapchainImages(vk::Context *context, uint32_t imageCount)
{ {
if (static_cast<size_t>(imageCount) != mSwapchainImages.size()) mSwapchainImages.resize(imageCount);
{
mSwapchainImageBindings.clear();
mSwapchainImages.resize(imageCount);
// Update the image bindings. Because the observer binding class uses raw pointers we
// need to first ensure the entire image vector is fully allocated before binding the
// subject and observer together.
for (uint32_t index = 0; index < imageCount; ++index)
{
mSwapchainImageBindings.push_back(
angle::ObserverBinding(this, kAnySurfaceImageSubjectIndex));
}
for (uint32_t index = 0; index < imageCount; ++index)
{
mSwapchainImageBindings[index].bind(&mSwapchainImages[index].image);
}
}
// At this point, if there was a previous swapchain, the previous present semaphores have all // At this point, if there was a previous swapchain, the previous present semaphores have all
// been moved to mOldSwapchains to be scheduled for destruction, so all semaphore handles in // been moved to mOldSwapchains to be scheduled for destruction, so all semaphore handles in
...@@ -1032,8 +996,6 @@ void WindowSurfaceVk::releaseSwapchainImages(ContextVk *contextVk) ...@@ -1032,8 +996,6 @@ void WindowSurfaceVk::releaseSwapchainImages(ContextVk *contextVk)
contextVk->addGarbage(&mFramebufferMS); contextVk->addGarbage(&mFramebufferMS);
} }
mSwapchainImageBindings.clear();
for (SwapchainImage &swapchainImage : mSwapchainImages) for (SwapchainImage &swapchainImage : mSwapchainImages)
{ {
// We don't own the swapchain image handles, so we just remove our reference to it. // We don't own the swapchain image handles, so we just remove our reference to it.
......
...@@ -20,7 +20,7 @@ namespace rx ...@@ -20,7 +20,7 @@ namespace rx
{ {
class RendererVk; class RendererVk;
class SurfaceVk : public SurfaceImpl, public angle::ObserverInterface class SurfaceVk : public SurfaceImpl
{ {
public: public:
angle::Result getAttachmentRenderTarget(const gl::Context *context, angle::Result getAttachmentRenderTarget(const gl::Context *context,
...@@ -33,9 +33,6 @@ class SurfaceVk : public SurfaceImpl, public angle::ObserverInterface ...@@ -33,9 +33,6 @@ class SurfaceVk : public SurfaceImpl, public angle::ObserverInterface
SurfaceVk(const egl::SurfaceState &surfaceState); SurfaceVk(const egl::SurfaceState &surfaceState);
~SurfaceVk() override; ~SurfaceVk() override;
// We monitor the staging buffer for changes. This handles staged data from outside this class.
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
RenderTargetVk mColorRenderTarget; RenderTargetVk mColorRenderTarget;
RenderTargetVk mDepthStencilRenderTarget; RenderTargetVk mDepthStencilRenderTarget;
}; };
...@@ -81,7 +78,7 @@ class OffscreenSurfaceVk : public SurfaceVk ...@@ -81,7 +78,7 @@ class OffscreenSurfaceVk : public SurfaceVk
protected: protected:
struct AttachmentImage final : angle::NonCopyable struct AttachmentImage final : angle::NonCopyable
{ {
AttachmentImage(SurfaceVk *surfaceVk); AttachmentImage();
~AttachmentImage(); ~AttachmentImage();
angle::Result initialize(DisplayVk *displayVk, angle::Result initialize(DisplayVk *displayVk,
...@@ -101,7 +98,6 @@ class OffscreenSurfaceVk : public SurfaceVk ...@@ -101,7 +98,6 @@ class OffscreenSurfaceVk : public SurfaceVk
vk::ImageHelper image; vk::ImageHelper image;
vk::ImageViewHelper imageViews; vk::ImageViewHelper imageViews;
angle::ObserverBinding imageObserverBinding;
}; };
virtual angle::Result initializeImpl(DisplayVk *displayVk); virtual angle::Result initializeImpl(DisplayVk *displayVk);
...@@ -297,7 +293,6 @@ class WindowSurfaceVk : public SurfaceVk ...@@ -297,7 +293,6 @@ class WindowSurfaceVk : public SurfaceVk
std::vector<impl::SwapchainCleanupData> mOldSwapchains; std::vector<impl::SwapchainCleanupData> mOldSwapchains;
std::vector<impl::SwapchainImage> mSwapchainImages; std::vector<impl::SwapchainImage> mSwapchainImages;
std::vector<angle::ObserverBinding> mSwapchainImageBindings;
vk::Semaphore mAcquireImageSemaphore; vk::Semaphore mAcquireImageSemaphore;
uint32_t mCurrentSwapchainImageIndex; uint32_t mCurrentSwapchainImageIndex;
...@@ -306,12 +301,10 @@ class WindowSurfaceVk : public SurfaceVk ...@@ -306,12 +301,10 @@ class WindowSurfaceVk : public SurfaceVk
// Depth/stencil image. Possibly multisampled. // Depth/stencil image. Possibly multisampled.
vk::ImageHelper mDepthStencilImage; vk::ImageHelper mDepthStencilImage;
vk::ImageViewHelper mDepthStencilImageViews; vk::ImageViewHelper mDepthStencilImageViews;
angle::ObserverBinding mDepthStencilImageBinding;
// Multisample color image, view and framebuffer, if multisampling enabled. // Multisample color image, view and framebuffer, if multisampling enabled.
vk::ImageHelper mColorImageMS; vk::ImageHelper mColorImageMS;
vk::ImageViewHelper mColorImageMSViews; vk::ImageViewHelper mColorImageMSViews;
angle::ObserverBinding mColorImageMSBinding;
vk::Framebuffer mFramebufferMS; vk::Framebuffer mFramebufferMS;
}; };
......
...@@ -40,7 +40,7 @@ constexpr VkImageUsageFlags kTransferStagingImageFlags = ...@@ -40,7 +40,7 @@ constexpr VkImageUsageFlags kTransferStagingImageFlags =
constexpr VkFormatFeatureFlags kBlitFeatureFlags = constexpr VkFormatFeatureFlags kBlitFeatureFlags =
VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
constexpr angle::SubjectIndex kTextureImageSubjectIndex = 0; constexpr angle::SubjectIndex kStagingBufferSubjectIndex = 0;
bool CanCopyWithTransfer(RendererVk *renderer, bool CanCopyWithTransfer(RendererVk *renderer,
const vk::Format &srcFormat, const vk::Format &srcFormat,
...@@ -115,7 +115,7 @@ TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer) ...@@ -115,7 +115,7 @@ TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer)
mImage(nullptr), mImage(nullptr),
mStagingBufferInitialSize(vk::kStagingBufferSize), mStagingBufferInitialSize(vk::kStagingBufferSize),
mImageUsageFlags(0), mImageUsageFlags(0),
mImageObserverBinding(this, kTextureImageSubjectIndex) mStagingBufferObserverBinding(this, kStagingBufferSubjectIndex)
{} {}
TextureVk::~TextureVk() = default; TextureVk::~TextureVk() = default;
...@@ -879,7 +879,7 @@ void TextureVk::releaseAndDeleteImage(ContextVk *contextVk) ...@@ -879,7 +879,7 @@ void TextureVk::releaseAndDeleteImage(ContextVk *contextVk)
{ {
releaseImage(contextVk); releaseImage(contextVk);
releaseStagingBuffer(contextVk); releaseStagingBuffer(contextVk);
mImageObserverBinding.bind(nullptr); mStagingBufferObserverBinding.bind(nullptr);
SafeDelete(mImage); SafeDelete(mImage);
} }
} }
...@@ -924,7 +924,7 @@ void TextureVk::setImageHelper(ContextVk *contextVk, ...@@ -924,7 +924,7 @@ void TextureVk::setImageHelper(ContextVk *contextVk,
{ {
ASSERT(mImage == nullptr); ASSERT(mImage == nullptr);
mImageObserverBinding.bind(imageHelper); mStagingBufferObserverBinding.bind(imageHelper);
mOwnsImage = selfOwned; mOwnsImage = selfOwned;
mImageNativeType = imageType; mImageNativeType = imageType;
...@@ -1686,7 +1686,7 @@ void TextureVk::releaseImage(ContextVk *contextVk) ...@@ -1686,7 +1686,7 @@ void TextureVk::releaseImage(ContextVk *contextVk)
} }
else else
{ {
mImageObserverBinding.bind(nullptr); mStagingBufferObserverBinding.bind(nullptr);
mImage = nullptr; mImage = nullptr;
} }
} }
...@@ -1852,9 +1852,9 @@ const vk::Format &TextureVk::getBaseLevelFormat(RendererVk *renderer) const ...@@ -1852,9 +1852,9 @@ const vk::Format &TextureVk::getBaseLevelFormat(RendererVk *renderer) const
void TextureVk::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) void TextureVk::onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message)
{ {
ASSERT(index == kTextureImageSubjectIndex && message == angle::SubjectMessage::SubjectChanged); ASSERT(index == kStagingBufferSubjectIndex && message == angle::SubjectMessage::SubjectChanged);
// Forward the notification to the parent that the staging buffer changed. // Forward the notification to vk::Texture that the staging buffer changed.
onStateChange(angle::SubjectMessage::SubjectChanged); onStateChange(angle::SubjectMessage::SubjectChanged);
} }
} // namespace rx } // namespace rx
...@@ -430,7 +430,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface ...@@ -430,7 +430,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
// The created vkImage usage flag. // The created vkImage usage flag.
VkImageUsageFlags mImageUsageFlags; VkImageUsageFlags mImageUsageFlags;
angle::ObserverBinding mImageObserverBinding; angle::ObserverBinding mStagingBufferObserverBinding;
}; };
} // namespace rx } // namespace rx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment