1 /* 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 "include/gpu/vk/GrVkTypes.h" 13 #include "src/gpu/vk/GrVkRenderTarget.h" 14 #include "src/gpu/vk/GrVkTexture.h" 15 16 class GrVkGpu; 17 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 24 class GrVkImageView; 25 struct GrVkImageInfo; 26 27 class GrVkTextureRenderTarget: public GrVkTexture, public GrVkRenderTarget { 28 public: 29 static sk_sp<GrVkTextureRenderTarget> MakeNewTextureRenderTarget(GrVkGpu*, SkBudgeted, 30 SkISize dimensions, 31 int sampleCnt, 32 const GrVkImage::ImageDesc&, 33 GrMipMapsStatus); 34 35 static sk_sp<GrVkTextureRenderTarget> MakeWrappedTextureRenderTarget(GrVkGpu*, 36 SkISize dimensions, 37 int sampleCnt, 38 GrWrapOwnership, 39 GrWrapCacheable, 40 const GrVkImageInfo&, 41 sk_sp<GrVkImageLayout>); 42 backendFormat()43 GrBackendFormat backendFormat() const override { return this->getBackendFormat(); } 44 45 protected: onAbandon()46 void onAbandon() override { 47 // In order to correctly handle calling texture idle procs, GrVkTexture must go first. 48 GrVkTexture::onAbandon(); 49 GrVkRenderTarget::onAbandon(); 50 } 51 onRelease()52 void onRelease() override { 53 // In order to correctly handle calling texture idle procs, GrVkTexture must go first. 54 GrVkTexture::onRelease(); 55 GrVkRenderTarget::onRelease(); 56 } 57 58 private: 59 // MSAA, not-wrapped 60 GrVkTextureRenderTarget(GrVkGpu* gpu, 61 SkBudgeted budgeted, 62 SkISize dimensions, 63 int sampleCnt, 64 const GrVkImageInfo& info, 65 sk_sp<GrVkImageLayout> layout, 66 const GrVkImageView* texView, 67 const GrVkImageInfo& msaaInfo, 68 sk_sp<GrVkImageLayout> msaaLayout, 69 const GrVkImageView* colorAttachmentView, 70 const GrVkImageView* resolveAttachmentView, 71 GrMipMapsStatus); 72 73 // non-MSAA, not-wrapped 74 GrVkTextureRenderTarget(GrVkGpu* gpu, 75 SkBudgeted budgeted, 76 SkISize dimensions, 77 const GrVkImageInfo& info, 78 sk_sp<GrVkImageLayout> layout, 79 const GrVkImageView* texView, 80 const GrVkImageView* colorAttachmentView, 81 GrMipMapsStatus); 82 83 // MSAA, wrapped 84 GrVkTextureRenderTarget(GrVkGpu* gpu, 85 SkISize dimensions, 86 int sampleCnt, 87 const GrVkImageInfo& info, 88 sk_sp<GrVkImageLayout> layout, 89 const GrVkImageView* texView, 90 const GrVkImageInfo& msaaInfo, 91 sk_sp<GrVkImageLayout> msaaLayout, 92 const GrVkImageView* colorAttachmentView, 93 const GrVkImageView* resolveAttachmentView, 94 GrMipMapsStatus, 95 GrBackendObjectOwnership, 96 GrWrapCacheable); 97 98 // non-MSAA, wrapped 99 GrVkTextureRenderTarget(GrVkGpu* gpu, 100 SkISize dimensions, 101 const GrVkImageInfo& info, 102 sk_sp<GrVkImageLayout> layout, 103 const GrVkImageView* texView, 104 const GrVkImageView* colorAttachmentView, 105 GrMipMapsStatus, 106 GrBackendObjectOwnership, 107 GrWrapCacheable); 108 109 // GrGLRenderTarget accounts for the texture's memory and any MSAA renderbuffer's memory. 110 size_t onGpuMemorySize() const override; 111 112 // In Vulkan we call the release proc after we are finished with the underlying 113 // GrVkImage::Resource object (which occurs after the GPU has finished all work on it). onSetRelease(sk_sp<GrRefCntedCallback> releaseHelper)114 void onSetRelease(sk_sp<GrRefCntedCallback> releaseHelper) override { 115 // Forward the release proc on to GrVkImage 116 this->setResourceRelease(std::move(releaseHelper)); 117 } 118 }; 119 120 #endif 121