OLD | NEW |
(Empty) | |
| 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 #include "GrVkTextureRenderTarget.h" |
| 9 |
| 10 #include "GrRenderTargetPriv.h" |
| 11 #include "GrVkGpu.h" |
| 12 #include "GrVkImageView.h" |
| 13 #include "GrVkUtil.h" |
| 14 |
| 15 #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X) |
| 16 |
| 17 GrVkTextureRenderTarget* |
| 18 GrVkTextureRenderTarget::Create(GrVkGpu* gpu, |
| 19 const GrSurfaceDesc& desc, |
| 20 GrGpuResource::LifeCycle lifeCycle, |
| 21 VkFormat format, |
| 22 const GrVkImage::Resource* imageResource) { |
| 23 |
| 24 VkImage image = imageResource->fImage; |
| 25 // Create the texture ImageView |
| 26 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format, |
| 27 GrVkImageView::kColor
_Type); |
| 28 if (!imageView) { |
| 29 return nullptr; |
| 30 } |
| 31 |
| 32 VkFormat pixelFormat; |
| 33 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat); |
| 34 |
| 35 VkImage colorImage; |
| 36 |
| 37 // create msaa surface if necessary |
| 38 const GrVkImage::Resource* msaaImageResource = nullptr; |
| 39 const GrVkImageView* resolveAttachmentView = nullptr; |
| 40 if (desc.fSampleCnt) { |
| 41 GrVkImage::ImageDesc msImageDesc; |
| 42 msImageDesc.fImageType = VK_IMAGE_TYPE_2D; |
| 43 msImageDesc.fFormat = pixelFormat; |
| 44 msImageDesc.fWidth = desc.fWidth; |
| 45 msImageDesc.fHeight = desc.fHeight; |
| 46 msImageDesc.fLevels = 1; |
| 47 msImageDesc.fSamples = desc.fSampleCnt; |
| 48 msImageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL; |
| 49 msImageDesc.fUsageFlags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; |
| 50 msImageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; |
| 51 |
| 52 msaaImageResource = GrVkImage::CreateResource(gpu, msImageDesc); |
| 53 |
| 54 if (!msaaImageResource) { |
| 55 imageView->unref(gpu); |
| 56 return nullptr; |
| 57 } |
| 58 |
| 59 // Set color attachment image |
| 60 colorImage = msaaImageResource->fImage; |
| 61 |
| 62 // Create resolve attachment view if necessary. |
| 63 // If the format matches, this is the same as the texture imageView. |
| 64 if (pixelFormat == format) { |
| 65 resolveAttachmentView = imageView; |
| 66 resolveAttachmentView->ref(); |
| 67 } else { |
| 68 resolveAttachmentView = GrVkImageView::Create(gpu, image, pixelForma
t, |
| 69 GrVkImageView::kColor_
Type); |
| 70 if (!resolveAttachmentView) { |
| 71 msaaImageResource->unref(gpu); |
| 72 imageView->unref(gpu); |
| 73 return nullptr; |
| 74 } |
| 75 } |
| 76 } else { |
| 77 // Set color attachment image |
| 78 colorImage = imageResource->fImage; |
| 79 } |
| 80 |
| 81 const GrVkImageView* colorAttachmentView; |
| 82 // Get color attachment view. |
| 83 // If the format matches and there's no multisampling, |
| 84 // this is the same as the texture imageView |
| 85 if (pixelFormat == format && !resolveAttachmentView) { |
| 86 colorAttachmentView = imageView; |
| 87 colorAttachmentView->ref(); |
| 88 } else { |
| 89 colorAttachmentView = GrVkImageView::Create(gpu, colorImage, pixelFormat
, |
| 90 GrVkImageView::kColor_Type); |
| 91 if (!colorAttachmentView) { |
| 92 if (msaaImageResource) { |
| 93 resolveAttachmentView->unref(gpu); |
| 94 msaaImageResource->unref(gpu); |
| 95 } |
| 96 imageView->unref(gpu); |
| 97 return nullptr; |
| 98 } |
| 99 } |
| 100 |
| 101 GrVkTextureRenderTarget* texRT; |
| 102 if (msaaImageResource) { |
| 103 texRT = new GrVkTextureRenderTarget(gpu, desc, lifeCycle, |
| 104 imageResource, imageView, msaaImageR
esource, |
| 105 colorAttachmentView, |
| 106 resolveAttachmentView); |
| 107 msaaImageResource->unref(gpu); |
| 108 } else { |
| 109 texRT = new GrVkTextureRenderTarget(gpu, desc, lifeCycle, |
| 110 imageResource, imageView, |
| 111 colorAttachmentView); |
| 112 } |
| 113 return texRT; |
| 114 } |
| 115 |
| 116 GrVkTextureRenderTarget* |
| 117 GrVkTextureRenderTarget::CreateNewTextureRenderTarget(GrVkGpu* gpu, |
| 118 const GrSurfaceDesc& desc, |
| 119 GrGpuResource::LifeCycle li
feCycle, |
| 120 const GrVkImage::ImageDesc&
imageDesc) { |
| 121 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
| 122 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT); |
| 123 |
| 124 const GrVkImage::Resource* imageRsrc = GrVkImage::CreateResource(gpu, imageD
esc); |
| 125 |
| 126 if (!imageRsrc) { |
| 127 return nullptr; |
| 128 } |
| 129 |
| 130 GrVkTextureRenderTarget* trt = GrVkTextureRenderTarget::Create(gpu, desc, li
feCycle, |
| 131 imageDesc.fFo
rmat, imageRsrc); |
| 132 // Create() will increment the refCount of the image resource if it succeeds |
| 133 imageRsrc->unref(gpu); |
| 134 |
| 135 return trt; |
| 136 } |
| 137 |
| 138 GrVkTextureRenderTarget* |
| 139 GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(GrVkGpu* gpu, |
| 140 const GrSurfaceDesc& d
esc, |
| 141 GrGpuResource::LifeCyc
le lifeCycle, |
| 142 VkFormat format, |
| 143 GrVkImage::Resource* i
mageRsrc) { |
| 144 SkASSERT(imageRsrc); |
| 145 |
| 146 // Note: we assume the caller will unref the imageResource |
| 147 // Create() will increment the refCount, and we'll unref when we're done wit
h it |
| 148 return GrVkTextureRenderTarget::Create(gpu, desc, lifeCycle, format, imageRs
rc); |
| 149 } |
| 150 |
OLD | NEW |