Edit

kc3-lang/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.h

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2019-10-13 15:05:23
    Hash : 68591eff
    Message : Vulkan: Store ImageView access in the graph. This will ensure we don't destroy the image views when they are still in use by other Contexts. Bug: angleproject:2464 Change-Id: I1d3ba2ad241250e31ea32873446c4cb23971750d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1843236 Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/renderer/vulkan/RenderTargetVk.h
  • //
    // Copyright 2016 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // RenderTargetVk:
    //   Wrapper around a Vulkan renderable resource, using an ImageView.
    //
    
    #ifndef LIBANGLE_RENDERER_VULKAN_RENDERTARGETVK_H_
    #define LIBANGLE_RENDERER_VULKAN_RENDERTARGETVK_H_
    
    #include <vulkan/vulkan.h>
    
    #include "libANGLE/FramebufferAttachment.h"
    #include "libANGLE/renderer/renderer_utils.h"
    #include "libANGLE/renderer/vulkan/vk_helpers.h"
    
    namespace rx
    {
    namespace vk
    {
    struct Format;
    class FramebufferHelper;
    class ImageHelper;
    class ImageView;
    class CommandGraphResource;
    class RenderPassDesc;
    }  // namespace vk
    
    class ContextVk;
    class TextureVk;
    
    // This is a very light-weight class that does not own to the resources it points to.
    // It's meant only to copy across some information from a FramebufferAttachment to the
    // business rendering logic. It stores Images and ImageViews by pointer for performance.
    class RenderTargetVk final : public FramebufferAttachmentRenderTarget
    {
      public:
        RenderTargetVk();
        ~RenderTargetVk() override;
    
        // Used in std::vector initialization.
        RenderTargetVk(RenderTargetVk &&other);
    
        void init(vk::ImageHelper *image,
                  vk::ImageViewHelper *imageViews,
                  uint32_t levelIndex,
                  uint32_t layerIndex);
        void reset();
    
        // Note: RenderTargets should be called in order, with the depth/stencil onRender last.
        angle::Result onColorDraw(ContextVk *contextVk,
                                  vk::FramebufferHelper *framebufferVk,
                                  vk::CommandBuffer *commandBuffer);
        angle::Result onDepthStencilDraw(ContextVk *contextVk,
                                         vk::FramebufferHelper *framebufferVk,
                                         vk::CommandBuffer *commandBuffer);
    
        vk::ImageHelper &getImage();
        const vk::ImageHelper &getImage() const;
    
        // getImageForRead will also transition the resource to the given layout.
        vk::ImageHelper *getImageForRead(ContextVk *contextVk,
                                         vk::CommandGraphResource *readingResource,
                                         vk::ImageLayout layout,
                                         vk::CommandBuffer *commandBuffer);
        vk::ImageHelper *getImageForWrite(ContextVk *contextVk,
                                          vk::CommandGraphResource *writingResource) const;
    
        // For cube maps we use single-level single-layer 2D array views.
        angle::Result getImageView(ContextVk *contextVk, const vk::ImageView **imageViewOut) const;
    
        const vk::Format &getImageFormat() const;
        gl::Extents getExtents() const;
        uint32_t getLevelIndex() const { return mLevelIndex; }
        uint32_t getLayerIndex() const { return mLayerIndex; }
    
        // Special mutator for Surface RenderTargets. Allows the Framebuffer to keep a single
        // RenderTargetVk pointer.
        void updateSwapchainImage(vk::ImageHelper *image, vk::ImageViewHelper *imageViews);
    
        angle::Result flushStagedUpdates(ContextVk *contextVk);
    
        void onImageViewGraphAccess(ContextVk *contextVk) const;
    
      private:
        vk::ImageHelper *mImage;
        vk::ImageViewHelper *mImageViews;
        uint32_t mLevelIndex;
        uint32_t mLayerIndex;
    };
    
    // A vector of rendertargets
    using RenderTargetVector = std::vector<RenderTargetVk>;
    
    }  // namespace rx
    
    #endif  // LIBANGLE_RENDERER_VULKAN_RENDERTARGETVK_H_