blob: 272998e31785d60f0decca81fe21164d6f2559e0 [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&,
bungeman6bd52842016-10-27 09:30:08 -070038 const GrVkImageInfo*);
Greg Daniel164a9f02016-02-22 09:56:40 -050039
40 ~GrVkRenderTarget() override;
41
42 const GrVkFramebuffer* framebuffer() const { return fFramebuffer; }
43 const GrVkImageView* colorAttachmentView() const { return fColorAttachmentView; }
egdanielb2df0c22016-05-13 11:30:37 -070044 const GrVkResource* msaaImageResource() const {
45 if (fMSAAImage) {
46 return fMSAAImage->fResource;
47 }
48 return nullptr;
49 }
Greg Daniel2db32322017-04-03 10:29:43 -040050 GrVkImage* msaaImage() { return fMSAAImage.get(); }
Greg Daniel164a9f02016-02-22 09:56:40 -050051 const GrVkImageView* resolveAttachmentView() const { return fResolveAttachmentView; }
egdanielb2df0c22016-05-13 11:30:37 -070052 const GrVkResource* stencilImageResource() const;
Greg Daniel164a9f02016-02-22 09:56:40 -050053 const GrVkImageView* stencilAttachmentView() const;
54
55 const GrVkRenderPass* simpleRenderPass() const { return fCachedSimpleRenderPass; }
egdaniel066df7c2016-06-08 14:02:27 -070056 GrVkResourceProvider::CompatibleRPHandle compatibleRenderPassHandle() const {
57 return fCompatibleRPHandle;
58 }
Greg Daniel164a9f02016-02-22 09:56:40 -050059
60 // override of GrRenderTarget
61 ResolveType getResolveType() const override {
egdaniel66933552016-08-24 07:22:19 -070062 if (this->numColorSamples() > 1) {
63 return kCanResolve_ResolveType;
64 }
65 return kAutoResolves_ResolveType;
Greg Daniel164a9f02016-02-22 09:56:40 -050066 }
67
68 bool canAttemptStencilAttachment() const override {
69 return true;
70 }
71
72 GrBackendObject getRenderTargetHandle() const override;
73
Greg Daniel164a9f02016-02-22 09:56:40 -050074 void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
75 GrVkRenderPass::AttachmentFlags* flags) const;
halcanary9d524f22016-03-29 09:03:52 -070076
Greg Daniel164a9f02016-02-22 09:56:40 -050077 void addResources(GrVkCommandBuffer& commandBuffer) const;
78
79protected:
Greg Daniel164a9f02016-02-22 09:56:40 -050080 GrVkRenderTarget(GrVkGpu* gpu,
81 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070082 const GrVkImageInfo& info,
83 const GrVkImageInfo& msaaInfo,
Greg Daniel164a9f02016-02-22 09:56:40 -050084 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070085 const GrVkImageView* resolveAttachmentView,
86 GrVkImage::Wrapped wrapped);
Greg Daniel164a9f02016-02-22 09:56:40 -050087
88 GrVkRenderTarget(GrVkGpu* gpu,
89 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070090 const GrVkImageInfo& info,
Greg Daniel164a9f02016-02-22 09:56:40 -050091 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070092 GrVkImage::Wrapped wrapped);
Greg Daniel164a9f02016-02-22 09:56:40 -050093
94 GrVkGpu* getVkGpu() const;
95
96 void onAbandon() override;
97 void onRelease() override;
98
99 // This accounts for the texture's memory and any MSAA renderbuffer's memory.
100 size_t onGpuMemorySize() const override {
Robert Phillips29e52f12016-11-03 10:19:14 -0400101 // The plus 1 is to account for the resolve texture.
Robert Phillipsd6214d42016-11-07 08:23:48 -0500102 // TODO: is this still correct?
Brian Salomonbb5711a2017-05-17 13:49:59 -0400103 int numColorSamples = this->numColorSamples() + 1;
104 return GrSurface::ComputeSize(this->config(), this->width(), this->height(),
105 numColorSamples, false);
Greg Daniel164a9f02016-02-22 09:56:40 -0500106 }
107
egdaniel50ead532016-07-13 14:23:26 -0700108 void createFramebuffer(GrVkGpu* gpu);
109
110 const GrVkImageView* fColorAttachmentView;
Greg Daniel2db32322017-04-03 10:29:43 -0400111 std::unique_ptr<GrVkImage> fMSAAImage;
egdaniel50ead532016-07-13 14:23:26 -0700112 const GrVkImageView* fResolveAttachmentView;
113
Greg Daniel164a9f02016-02-22 09:56:40 -0500114private:
egdanielb2df0c22016-05-13 11:30:37 -0700115 GrVkRenderTarget(GrVkGpu* gpu,
116 SkBudgeted,
117 const GrSurfaceDesc& desc,
118 const GrVkImageInfo& info,
119 const GrVkImageInfo& msaaInfo,
120 const GrVkImageView* colorAttachmentView,
121 const GrVkImageView* resolveAttachmentView,
122 GrVkImage::Wrapped wrapped);
123
124 GrVkRenderTarget(GrVkGpu* gpu,
125 SkBudgeted,
126 const GrSurfaceDesc& desc,
127 const GrVkImageInfo& info,
128 const GrVkImageView* colorAttachmentView,
129 GrVkImage::Wrapped wrapped);
130
131 static GrVkRenderTarget* Create(GrVkGpu*, SkBudgeted, const GrSurfaceDesc&,
132 const GrVkImageInfo&, GrVkImage::Wrapped wrapped);
133
Greg Daniel164a9f02016-02-22 09:56:40 -0500134 bool completeStencilAttachment() override;
135
Greg Daniel164a9f02016-02-22 09:56:40 -0500136 void releaseInternalObjects();
137 void abandonInternalObjects();
138
139 const GrVkFramebuffer* fFramebuffer;
halcanary9d524f22016-03-29 09:03:52 -0700140
Greg Daniel164a9f02016-02-22 09:56:40 -0500141 // This is a cached pointer to a simple render pass. The render target should unref it
142 // once it is done with it.
143 const GrVkRenderPass* fCachedSimpleRenderPass;
egdanield62e28b2016-06-07 08:43:30 -0700144 // This is a handle to be used to quickly get compatible GrVkRenderPasses for this render target
145 GrVkResourceProvider::CompatibleRPHandle fCompatibleRPHandle;
Greg Daniel164a9f02016-02-22 09:56:40 -0500146};
147
148#endif