diff options
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h')
-rw-r--r-- | chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h | 107 |
1 files changed, 90 insertions, 17 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h index 37ba9d671fd..30bb9722654 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h +++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h @@ -44,23 +44,33 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget void init(vk::ImageHelper *image, vk::ImageViewHelper *imageViews, - uint32_t levelIndex, - uint32_t layerIndex); + vk::ImageHelper *resolveImage, + vk::ImageViewHelper *resolveImageViews, + uint32_t levelIndexGL, + uint32_t layerIndex, + bool isImageTransient); void reset(); - // This returns the serial from underlying ImageViewHelper, first assigning one if required - Serial getAssignImageViewSerial(ContextVk *contextVk); + + vk::ImageViewSubresourceSerial getDrawSubresourceSerial() const; + vk::ImageViewSubresourceSerial getResolveSubresourceSerial() const; // Note: RenderTargets should be called in order, with the depth/stencil onRender last. - angle::Result onColorDraw(ContextVk *contextVk); - angle::Result onDepthStencilDraw(ContextVk *contextVk); + void onColorDraw(ContextVk *contextVk); + void onDepthStencilDraw(ContextVk *contextVk); + + vk::ImageHelper &getImageForRenderPass(); + const vk::ImageHelper &getImageForRenderPass() const; - vk::ImageHelper &getImage(); - const vk::ImageHelper &getImage() const; + vk::ImageHelper &getResolveImageForRenderPass(); + const vk::ImageHelper &getResolveImageForRenderPass() const; - vk::ImageHelper *getImageForWrite(ContextVk *contextVk) const; + vk::ImageHelper &getImageForCopy() const; + vk::ImageHelper &getImageForWrite() const; // For cube maps we use single-level single-layer 2D array views. angle::Result getImageView(ContextVk *contextVk, const vk::ImageView **imageViewOut) const; + angle::Result getResolveImageView(ContextVk *contextVk, + const vk::ImageView **imageViewOut) const; // For 3D textures, the 2D view created for render target is invalid to read from. The // following will return a view to the whole image (for all types, including 3D and 2DArray). @@ -69,33 +79,96 @@ class RenderTargetVk final : public FramebufferAttachmentRenderTarget const vk::Format &getImageFormat() const; gl::Extents getExtents() const; - uint32_t getLevelIndex() const { return mLevelIndex; } + uint32_t getLevelIndex() const { return mLevelIndexGL; } uint32_t getLayerIndex() const { return mLayerIndex; } gl::ImageIndex getImageIndex() const; // Special mutator for Surface RenderTargets. Allows the Framebuffer to keep a single // RenderTargetVk pointer. - void updateSwapchainImage(vk::ImageHelper *image, vk::ImageViewHelper *imageViews); + void updateSwapchainImage(vk::ImageHelper *image, + vk::ImageViewHelper *imageViews, + vk::ImageHelper *resolveImage, + vk::ImageViewHelper *resolveImageViews); angle::Result flushStagedUpdates(ContextVk *contextVk, vk::ClearValuesArray *deferredClears, - uint32_t deferredClearIndex) const; + uint32_t deferredClearIndex); void retainImageViews(ContextVk *contextVk) const; bool hasDefinedContent() const { return mContentDefined; } - // mark content as undefined so that certain optimizations are possible - void invalidateContent() { mContentDefined = false; } + // Mark content as undefined so that certain optimizations are possible such as using DONT_CARE + // as loadOp of the render target in the next renderpass. + void invalidateEntireContent() { mContentDefined = false; } + + // See the description of mIsImageTransient for details of how the following two can + // interact. + bool hasResolveAttachment() const { return mResolveImage != nullptr; } + bool isImageTransient() const { return mIsImageTransient; } private: + angle::Result getImageViewImpl(ContextVk *contextVk, + const vk::ImageHelper &image, + vk::ImageViewHelper *imageViews, + const vk::ImageView **imageViewOut) const; + + vk::ImageViewSubresourceSerial getSubresourceSerialImpl(vk::ImageViewHelper *imageViews) const; + + bool isResolveImageOwnerOfData() const; + + // The color or depth/stencil attachment of the framebuffer and its view. vk::ImageHelper *mImage; vk::ImageViewHelper *mImageViews; - uint32_t mLevelIndex; + + // If present, this is the corresponding resolve attachment and its view. This is used to + // implement GL_EXT_multisampled_render_to_texture, so while the rendering is done on mImage + // during the renderpass, the resolved image is the one that actually holds the data. This + // means that data uploads and blit are done on this image, copies are done out of this image + // etc. This means that if there is no clear, and hasDefinedContent(), the contents of + // mResolveImage must be copied to mImage since the loadOp of the attachment must be set to + // LOAD. + vk::ImageHelper *mResolveImage; + vk::ImageViewHelper *mResolveImageViews; + + // Which subresource of the image is used as render target. + uint32_t mLevelIndexGL; uint32_t mLayerIndex; - // Right now we are only tracking depth/stencil buffer. We could expand it to cover color - // buffers if needed in future. + + // Whether the render target has been invalidated. If so, DONT_CARE is used instead of LOAD for + // loadOp of this attachment. bool mContentDefined; + + // If resolve attachment exists, |mIsImageTransient| is true if the multisampled results need to + // be discarded. + // + // - GL_EXT_multisampled_render_to_texture: this is true for render targets created for this + // extension's usage. Only color attachments use this optimization at the moment. + // - GL_EXT_multisampled_render_to_texture2: this is true for depth/stencil textures per this + // extension, even though a resolve attachment is not even provided. + // - Multisampled swapchain: TODO(syoussefi) this is true for the multisampled color attachment. + // http://anglebug.com/4836 + // + // Based on the above, we have: + // + // mResolveImage == nullptr | mResolveImage != nullptr + // | + // Normal rendering | Invalid + // !IsTransient No resolve | + // storeOp = STORE | + // Owner of data: mImage | + // | + // ---------------------------------------------+--------------------------------------- + // | + // EXT_multisampled_render_to_texture2 | GL_EXT_multisampled_render_to_texture + // | or multisampled Swapchain optimization + // IsTransient No resolve | Resolve + // storeOp = DONT_CARE | storeOp = DONT_CARE + // Owner of data: None (not stored) | Owner of data: mResolveImage + // + // In the above, storeOp of the resolve attachment is always STORE. if !IsTransient, storeOp is + // affected by a framebuffer invalidate call. + bool mIsImageTransient; }; // A vector of rendertargets |