blob: 5e90aa04b626e9d3c4a293afb835c009f97ac05f [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 GrVkTextureRenderTarget_DEFINED
10#define GrVkTextureRenderTarget_DEFINED
11
12#include "GrVkTexture.h"
13#include "GrVkRenderTarget.h"
Greg Daniel487132b2018-12-20 14:09:36 -050014#include "vk/GrVkTypes.h"
Greg Daniel6ecc9112017-06-16 16:17:03 +000015
16class GrVkGpu;
Greg Daniel164a9f02016-02-22 09:56:40 -050017
18#ifdef SK_BUILD_FOR_WIN
19// Windows gives bogus warnings about inheriting asTexture/asRenderTarget via dominance.
20#pragma warning(push)
21#pragma warning(disable: 4250)
22#endif
23
24class GrVkImageView;
egdanielb2df0c22016-05-13 11:30:37 -070025struct GrVkImageInfo;
Greg Daniel164a9f02016-02-22 09:56:40 -050026
27class GrVkTextureRenderTarget: public GrVkTexture, public GrVkRenderTarget {
28public:
Greg Daniel475eb702018-09-28 14:16:50 -040029 static sk_sp<GrVkTextureRenderTarget> MakeNewTextureRenderTarget(GrVkGpu*, SkBudgeted,
30 const GrSurfaceDesc&,
31 const GrVkImage::ImageDesc&,
32 GrMipMapsStatus);
Greg Daniel164a9f02016-02-22 09:56:40 -050033
bungeman6bd52842016-10-27 09:30:08 -070034 static sk_sp<GrVkTextureRenderTarget> MakeWrappedTextureRenderTarget(GrVkGpu*,
35 const GrSurfaceDesc&,
36 GrWrapOwnership,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050037 GrWrapCacheable,
Greg Daniel52e16d92018-04-10 09:34:07 -040038 const GrVkImageInfo&,
39 sk_sp<GrVkImageLayout>);
Greg Daniel164a9f02016-02-22 09:56:40 -050040
Greg Daniel4065d452018-11-16 15:43:41 -050041 GrBackendFormat backendFormat() const override { return this->getBackendFormat(); }
42
Greg Daniel164a9f02016-02-22 09:56:40 -050043protected:
44 void onAbandon() override {
Brian Salomon9bc76d92019-01-24 12:18:33 -050045 // In order to correctly handle calling texture idle procs, GrVkTexture must go first.
Greg Daniel164a9f02016-02-22 09:56:40 -050046 GrVkTexture::onAbandon();
Brian Salomon9bc76d92019-01-24 12:18:33 -050047 GrVkRenderTarget::onAbandon();
Greg Daniel164a9f02016-02-22 09:56:40 -050048 }
49
50 void onRelease() override {
Brian Salomon9bc76d92019-01-24 12:18:33 -050051 // In order to correctly handle calling texture idle procs, GrVkTexture must go first.
Greg Daniel164a9f02016-02-22 09:56:40 -050052 GrVkTexture::onRelease();
Brian Salomon9bc76d92019-01-24 12:18:33 -050053 GrVkRenderTarget::onRelease();
Greg Daniel164a9f02016-02-22 09:56:40 -050054 }
55
56private:
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050057 // MSAA, not-wrapped
Greg Daniel164a9f02016-02-22 09:56:40 -050058 GrVkTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -070059 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -050060 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070061 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040062 sk_sp<GrVkImageLayout> layout,
Greg Daniel164a9f02016-02-22 09:56:40 -050063 const GrVkImageView* texView,
egdanielb2df0c22016-05-13 11:30:37 -070064 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040065 sk_sp<GrVkImageLayout> msaaLayout,
Greg Daniel164a9f02016-02-22 09:56:40 -050066 const GrVkImageView* colorAttachmentView,
Greg Daniel1591c382017-08-17 15:37:20 -040067 const GrVkImageView* resolveAttachmentView,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050068 GrMipMapsStatus);
Greg Daniel164a9f02016-02-22 09:56:40 -050069
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050070 // non-MSAA, not-wrapped
Greg Daniel164a9f02016-02-22 09:56:40 -050071 GrVkTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -070072 SkBudgeted budgeted,
Greg Daniel164a9f02016-02-22 09:56:40 -050073 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070074 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040075 sk_sp<GrVkImageLayout> layout,
Greg Daniel164a9f02016-02-22 09:56:40 -050076 const GrVkImageView* texView,
Greg Daniel1591c382017-08-17 15:37:20 -040077 const GrVkImageView* colorAttachmentView,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050078 GrMipMapsStatus);
Greg Daniel6ecc9112017-06-16 16:17:03 +000079
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050080 // MSAA, wrapped
kkinnunen2e6055b2016-04-22 01:48:29 -070081 GrVkTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -070082 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070083 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040084 sk_sp<GrVkImageLayout> layout,
kkinnunen2e6055b2016-04-22 01:48:29 -070085 const GrVkImageView* texView,
egdanielb2df0c22016-05-13 11:30:37 -070086 const GrVkImageInfo& msaaInfo,
Greg Daniel52e16d92018-04-10 09:34:07 -040087 sk_sp<GrVkImageLayout> msaaLayout,
kkinnunen2e6055b2016-04-22 01:48:29 -070088 const GrVkImageView* colorAttachmentView,
egdanielb2df0c22016-05-13 11:30:37 -070089 const GrVkImageView* resolveAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -040090 GrMipMapsStatus,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050091 GrBackendObjectOwnership,
92 GrWrapCacheable);
Greg Daniel164a9f02016-02-22 09:56:40 -050093
Brian Salomonaa6ca0a2019-01-24 16:03:07 -050094 // non-MSAA, wrapped
kkinnunen2e6055b2016-04-22 01:48:29 -070095 GrVkTextureRenderTarget(GrVkGpu* gpu,
kkinnunen2e6055b2016-04-22 01:48:29 -070096 const GrSurfaceDesc& desc,
egdanielb2df0c22016-05-13 11:30:37 -070097 const GrVkImageInfo& info,
Greg Daniel52e16d92018-04-10 09:34:07 -040098 sk_sp<GrVkImageLayout> layout,
kkinnunen2e6055b2016-04-22 01:48:29 -070099 const GrVkImageView* texView,
egdanielb2df0c22016-05-13 11:30:37 -0700100 const GrVkImageView* colorAttachmentView,
Greg Daniel0fc4d2d2017-10-12 11:23:36 -0400101 GrMipMapsStatus,
Brian Salomonaa6ca0a2019-01-24 16:03:07 -0500102 GrBackendObjectOwnership,
103 GrWrapCacheable);
Greg Daniel164a9f02016-02-22 09:56:40 -0500104
105 // GrGLRenderTarget accounts for the texture's memory and any MSAA renderbuffer's memory.
Robert Phillips646e4292017-06-13 12:44:56 -0400106 size_t onGpuMemorySize() const override;
Greg Daniel2d35a1c2019-02-01 14:48:10 -0500107
108 // In Vulkan we call the release proc after we are finished with the underlying
109 // GrVkImage::Resource object (which occurs after the GPU has finished all work on it).
110 void onSetRelease(sk_sp<GrReleaseProcHelper> releaseHelper) override {
111 // Forward the release proc on to GrVkImage
112 this->setResourceRelease(std::move(releaseHelper));
113 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500114};
115
116#endif