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 "GrVkTexture.h" | |
9 #include "GrVkGpu.h" | |
10 #include "GrVkImageView.h" | |
11 #include "GrVkUtil.h" | |
12 | |
13 #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X) | |
14 | |
15 // Because this class is virtually derived from GrSurface we must explicitly cal
l its constructor. | |
16 GrVkTexture::GrVkTexture(GrVkGpu* gpu, | |
17 const GrSurfaceDesc& desc, | |
18 GrGpuResource::LifeCycle lifeCycle, | |
19 const GrVkImage::Resource* imageResource, | |
20 const GrVkImageView* view) | |
21 : GrSurface(gpu, lifeCycle, desc) | |
22 , GrVkImage(imageResource) | |
23 , INHERITED(gpu, lifeCycle, desc) | |
24 , fTextureView(view) { | |
25 this->registerWithCache(); | |
26 } | |
27 | |
28 // Because this class is virtually derived from GrSurface we must explicitly cal
l its constructor. | |
29 GrVkTexture::GrVkTexture(GrVkGpu* gpu, | |
30 const GrSurfaceDesc& desc, | |
31 GrGpuResource::LifeCycle lifeCycle, | |
32 const GrVkImage::Resource* imageResource, | |
33 const GrVkImageView* view, | |
34 Derived) | |
35 : GrSurface(gpu, lifeCycle, desc) | |
36 , GrVkImage(imageResource) | |
37 , INHERITED(gpu, lifeCycle, desc) | |
38 , fTextureView(view) {} | |
39 | |
40 | |
41 GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu, | |
42 const GrSurfaceDesc& desc, | |
43 GrGpuResource::LifeCycle lifeCycle, | |
44 VkFormat format, | |
45 const GrVkImage::Resource* imageResource) { | |
46 VkImage image = imageResource->fImage; | |
47 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format, | |
48 GrVkImageView::kColor
_Type); | |
49 if (!imageView) { | |
50 return nullptr; | |
51 } | |
52 | |
53 return new GrVkTexture(gpu, desc, lifeCycle, imageResource, imageView); | |
54 } | |
55 | |
56 GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, const GrSurfaceDesc& de
sc, | |
57 GrGpuResource::LifeCycle lifeCycle, | |
58 const GrVkImage::ImageDesc& imageDesc
) { | |
59 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT); | |
60 | |
61 const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, im
ageDesc); | |
62 if (!imageResource) { | |
63 return nullptr; | |
64 } | |
65 | |
66 GrVkTexture* texture = Create(gpu, desc, lifeCycle, imageDesc.fFormat, image
Resource); | |
67 // Create() will increment the refCount of the image resource if it succeeds | |
68 imageResource->unref(gpu); | |
69 | |
70 return texture; | |
71 } | |
72 | |
73 GrVkTexture* GrVkTexture::CreateWrappedTexture(GrVkGpu* gpu, const GrSurfaceDesc
& desc, | |
74 GrGpuResource::LifeCycle lifeCycl
e, | |
75 VkFormat format, | |
76 const GrVkImage::Resource* imageR
esource) { | |
77 SkASSERT(imageResource); | |
78 | |
79 // Note: we assume the caller will unref the imageResource | |
80 // Create() will increment the refCount, and we'll unref when we're done wit
h it | |
81 return Create(gpu, desc, lifeCycle, format, imageResource); | |
82 } | |
83 | |
84 GrVkTexture::~GrVkTexture() { | |
85 // either release or abandon should have been called by the owner of this ob
ject. | |
86 SkASSERT(!fTextureView); | |
87 } | |
88 | |
89 void GrVkTexture::onRelease() { | |
90 // we create this and don't hand it off, so we should always destroy it | |
91 if (fTextureView) { | |
92 fTextureView->unref(this->getVkGpu()); | |
93 fTextureView = nullptr; | |
94 } | |
95 | |
96 if (this->shouldFreeResources()) { | |
97 this->releaseImage(this->getVkGpu()); | |
98 } else { | |
99 this->abandonImage(); | |
100 } | |
101 | |
102 INHERITED::onRelease(); | |
103 } | |
104 | |
105 void GrVkTexture::onAbandon() { | |
106 if (fTextureView) { | |
107 fTextureView->unrefAndAbandon(); | |
108 fTextureView = nullptr; | |
109 } | |
110 | |
111 this->abandonImage(); | |
112 INHERITED::onAbandon(); | |
113 } | |
114 | |
115 GrBackendObject GrVkTexture::getTextureHandle() const { | |
116 // Currently just passing back the pointer to the Resource as the handle | |
117 return (GrBackendObject)&fResource; | |
118 } | |
119 | |
120 GrVkGpu* GrVkTexture::getVkGpu() const { | |
121 SkASSERT(!this->wasDestroyed()); | |
122 return static_cast<GrVkGpu*>(this->getGpu()); | |
123 } | |
124 | |
OLD | NEW |