blob: 64be0b78e47407d7a011238007d47880349b5215 [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8
9#ifndef GrVkRenderTarget_DEFINED
10#define GrVkRenderTarget_DEFINED
11
12#include "GrVkImage.h"
13#include "GrRenderTarget.h"
14
15#include "GrVkRenderPass.h"
egdanield62e28b2016-06-07 08:43:30 -070016#include "GrVkResourceProvider.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050017
18class GrVkCommandBuffer;
19class GrVkFramebuffer;
20class GrVkGpu;
21class GrVkImageView;
22class GrVkStencilAttachment;
23
egdanielb2df0c22016-05-13 11:30:37 -070024struct GrVkImageInfo;
jvanverthfd359ca2016-03-18 11:57:24 -070025
Greg Daniel164a9f02016-02-22 09:56:40 -050026#ifdef SK_BUILD_FOR_WIN
27// Windows gives bogus warnings about inheriting asTexture/asRenderTarget via dominance.
28#pragma warning(push)
29#pragma warning(disable: 4250)
30#endif
31
32class GrVkRenderTarget: public GrRenderTarget, public virtual GrVkImage {
33public:
kkinnunen2e6055b2016-04-22 01:48:29 -070034 static GrVkRenderTarget* CreateNewRenderTarget(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&,
Greg Daniel164a9f02016-02-22 09:56:40 -050035 const GrVkImage::ImageDesc&);
36
bungeman6bd52842016-10-27 09:30:08 -070037 static sk_sp<GrVkRenderTarget> MakeWrappedRenderTarget(GrVkGpu*, const GrSurfaceDesc&,
Greg Daniel52e16d92018-04-10 09:34:07 -040038 const GrVkImageInfo&,
39 sk_sp<GrVkImageLayout>);
Greg Daniel164a9f02016-02-22 09:56:40 -050040
41 ~GrVkRenderTarget() override;
42
43 const GrVkFramebuffer* framebuffer() const { return fFramebuffer; }
44 const GrVkImageView* colorAttachmentView() const { return fColorAttachmentView; }
egdanielb2df0c22016-05-13 11:30:37 -070045 const GrVkResource* msaaImageResource() const {
46 if (fMSAAImage) {
47 return fMSAAImage->fResource;
48 }
49 return nullptr;
50 }
Greg Daniel2db32322017-04-03 10:29:43 -040051 GrVkImage* msaaImage() { return fMSAAImage.get(); }
Greg Daniel164a9f02016-02-22 09:56:40 -050052 const GrVkImageView* resolveAttachmentView() const { return fResolveAttachmentView; }
egdanielb2df0c22016-05-13 11:30:37 -070053 const GrVkResource* stencilImageResource() const;
Greg Daniel164a9f02016-02-22 09:56:40 -050054 const GrVkImageView* stencilAttachmentView() const;
55
56 const GrVkRenderPass* simpleRenderPass() const { return fCachedSimpleRenderPass; }
egdaniel066df7c2016-06-08 14:02:27 -070057 GrVkResourceProvider::CompatibleRPHandle compatibleRenderPassHandle() const {
58 return fCompatibleRPHandle;
59 }
Greg Daniel164a9f02016-02-22 09:56:40 -050060
61 // override of GrRenderTarget
62 ResolveType getResolveType() const override {
egdaniel66933552016-08-24 07:22:19 -070063 if (this->numColorSamples() > 1) {
64 return kCanResolve_ResolveType;
65 }
66 return kAutoResolves_ResolveType;
Greg Daniel164a9f02016-02-22 09:56:40 -050067 }
68
69 bool canAttemptStencilAttachment() const override {
70 return true;
71 }
72
73 GrBackendObject getRenderTargetHandle() const override;
Robert Phillipsb67821d2017-12-13 15:00:45 -050074 GrBackendRenderTarget getBackendRenderTarget() const override;
Greg Daniel164a9f02016-02-22 09:56:40 -050075
Greg Daniel164a9f02016-02-22 09:56:40 -050076 void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
77 GrVkRenderPass::AttachmentFlags* flags) const;
halcanary9d524f22016-03-29 09:03:52 -070078
Greg Daniel164a9f02016-02-22 09:56:40 -050079 void addResources(GrVkCommandBuffer& commandBuffer) const;
80
81protected:
Greg Daniel164a9f02016-02-22 09:56:40 -050082 GrVkRenderTarget(GrVkGpu* gpu,
83 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070084 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040085 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -070086 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040087 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050088 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070089 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040090 GrBackendObjectOwnership);
Greg Daniel164a9f02016-02-22 09:56:40 -050091
92 GrVkRenderTarget(GrVkGpu* gpu,
93 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070094 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040095 sk_sp<GrVkImageLayout> layout,
Greg Daniel164a9f02016-02-22 09:56:40 -050096 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040097 GrBackendObjectOwnership);
Greg Daniel164a9f02016-02-22 09:56:40 -050098
99 GrVkGpu* getVkGpu() const;
100
101 void onAbandon() override;
102 void onRelease() override;
103
104 // This accounts for the texture's memory and any MSAA renderbuffer's memory.
105 size_t onGpuMemorySize() const override {
Brian Salomonbdecacf2018-02-02 20:32:49 -0500106 int numColorSamples = this->numColorSamples();
107 if (numColorSamples > 1) {
108 // Add one to account for the resolved VkImage.
109 numColorSamples += 1;
110 }
Brian Salomonbb5711a2017-05-17 13:49:59 -0400111 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
Greg Daniele252f082017-10-23 16:05:23 -0400112 numColorSamples, GrMipMapped::kNo);
Greg Daniel164a9f02016-02-22 09:56:40 -0500113 }
114
egdaniel50ead532016-07-13 14:23:26 -0700115 void createFramebuffer(GrVkGpu* gpu);
116
117 const GrVkImageView* fColorAttachmentView;
Greg Daniel2db32322017-04-03 10:29:43 -0400118 std::unique_ptr<GrVkImage> fMSAAImage;
egdaniel50ead532016-07-13 14:23:26 -0700119 const GrVkImageView* fResolveAttachmentView;
120
Greg Daniel164a9f02016-02-22 09:56:40 -0500121private:
egdanielb2df0c22016-05-13 11:30:37 -0700122 GrVkRenderTarget(GrVkGpu* gpu,
123 SkBudgeted,
124 const GrSurfaceDesc& desc,
125 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -0400126 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -0700127 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -0400128 sk_sp<GrVkImageLayout> msaaLayout,
egdanielb2df0c22016-05-13 11:30:37 -0700129 const GrVkImageView* colorAttachmentView,
130 const GrVkImageView* resolveAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400131 GrBackendObjectOwnership);
egdanielb2df0c22016-05-13 11:30:37 -0700132
133 GrVkRenderTarget(GrVkGpu* gpu,
134 SkBudgeted,
135 const GrSurfaceDesc& desc,
136 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -0400137 sk_sp<GrVkImageLayout> layout,
egdanielb2df0c22016-05-13 11:30:37 -0700138 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -0400139 GrBackendObjectOwnership);
egdanielb2df0c22016-05-13 11:30:37 -0700140
141 static GrVkRenderTarget* Create(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&,
Greg Daniel52e16d92018-04-10 09:34:07 -0400142 const GrVkImageInfo&, sk_sp<GrVkImageLayout>,
143 GrBackendObjectOwnership);
egdanielb2df0c22016-05-13 11:30:37 -0700144
Greg Daniel164a9f02016-02-22 09:56:40 -0500145 bool completeStencilAttachment() override;
146
Greg Daniel164a9f02016-02-22 09:56:40 -0500147 void releaseInternalObjects();
148 void abandonInternalObjects();
149
150 const GrVkFramebuffer* fFramebuffer;
halcanary9d524f22016-03-29 09:03:52 -0700151
Greg Daniel164a9f02016-02-22 09:56:40 -0500152 // This is a cached pointer to a simple render pass. The render target should unref it
153 // once it is done with it.
154 const GrVkRenderPass* fCachedSimpleRenderPass;
egdanield62e28b2016-06-07 08:43:30 -0700155 // This is a handle to be used to quickly get compatible GrVkRenderPasses for this render target
156 GrVkResourceProvider::CompatibleRPHandle fCompatibleRPHandle;
Greg Daniel164a9f02016-02-22 09:56:40 -0500157};
158
159#endif