Index: src/gpu/vk/GrVkTexture.cpp |
diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..24157be6f6d3b42e27a98cca257cef097f987d76 |
--- /dev/null |
+++ b/src/gpu/vk/GrVkTexture.cpp |
@@ -0,0 +1,124 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "GrVkTexture.h" |
+#include "GrVkGpu.h" |
+#include "GrVkImageView.h" |
+#include "GrVkUtil.h" |
+ |
+#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X) |
+ |
+// Because this class is virtually derived from GrSurface we must explicitly call its constructor. |
+GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
+ const GrSurfaceDesc& desc, |
+ GrGpuResource::LifeCycle lifeCycle, |
+ const GrVkImage::Resource* imageResource, |
+ const GrVkImageView* view) |
+ : GrSurface(gpu, lifeCycle, desc) |
+ , GrVkImage(imageResource) |
+ , INHERITED(gpu, lifeCycle, desc) |
+ , fTextureView(view) { |
+ this->registerWithCache(); |
+} |
+ |
+// Because this class is virtually derived from GrSurface we must explicitly call its constructor. |
+GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
+ const GrSurfaceDesc& desc, |
+ GrGpuResource::LifeCycle lifeCycle, |
+ const GrVkImage::Resource* imageResource, |
+ const GrVkImageView* view, |
+ Derived) |
+ : GrSurface(gpu, lifeCycle, desc) |
+ , GrVkImage(imageResource) |
+ , INHERITED(gpu, lifeCycle, desc) |
+ , fTextureView(view) {} |
+ |
+ |
+GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu, |
+ const GrSurfaceDesc& desc, |
+ GrGpuResource::LifeCycle lifeCycle, |
+ VkFormat format, |
+ const GrVkImage::Resource* imageResource) { |
+ VkImage image = imageResource->fImage; |
+ const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format, |
+ GrVkImageView::kColor_Type); |
+ if (!imageView) { |
+ return nullptr; |
+ } |
+ |
+ return new GrVkTexture(gpu, desc, lifeCycle, imageResource, imageView); |
+} |
+ |
+GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, const GrSurfaceDesc& desc, |
+ GrGpuResource::LifeCycle lifeCycle, |
+ const GrVkImage::ImageDesc& imageDesc) { |
+ SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT); |
+ |
+ const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, imageDesc); |
+ if (!imageResource) { |
+ return nullptr; |
+ } |
+ |
+ GrVkTexture* texture = Create(gpu, desc, lifeCycle, imageDesc.fFormat, imageResource); |
+ // Create() will increment the refCount of the image resource if it succeeds |
+ imageResource->unref(gpu); |
+ |
+ return texture; |
+} |
+ |
+GrVkTexture* GrVkTexture::CreateWrappedTexture(GrVkGpu* gpu, const GrSurfaceDesc& desc, |
+ GrGpuResource::LifeCycle lifeCycle, |
+ VkFormat format, |
+ const GrVkImage::Resource* imageResource) { |
+ SkASSERT(imageResource); |
+ |
+ // Note: we assume the caller will unref the imageResource |
+ // Create() will increment the refCount, and we'll unref when we're done with it |
+ return Create(gpu, desc, lifeCycle, format, imageResource); |
+} |
+ |
+GrVkTexture::~GrVkTexture() { |
+ // either release or abandon should have been called by the owner of this object. |
+ SkASSERT(!fTextureView); |
+} |
+ |
+void GrVkTexture::onRelease() { |
+ // we create this and don't hand it off, so we should always destroy it |
+ if (fTextureView) { |
+ fTextureView->unref(this->getVkGpu()); |
+ fTextureView = nullptr; |
+ } |
+ |
+ if (this->shouldFreeResources()) { |
+ this->releaseImage(this->getVkGpu()); |
+ } else { |
+ this->abandonImage(); |
+ } |
+ |
+ INHERITED::onRelease(); |
+} |
+ |
+void GrVkTexture::onAbandon() { |
+ if (fTextureView) { |
+ fTextureView->unrefAndAbandon(); |
+ fTextureView = nullptr; |
+ } |
+ |
+ this->abandonImage(); |
+ INHERITED::onAbandon(); |
+} |
+ |
+GrBackendObject GrVkTexture::getTextureHandle() const { |
+ // Currently just passing back the pointer to the Resource as the handle |
+ return (GrBackendObject)&fResource; |
+} |
+ |
+GrVkGpu* GrVkTexture::getVkGpu() const { |
+ SkASSERT(!this->wasDestroyed()); |
+ return static_cast<GrVkGpu*>(this->getGpu()); |
+} |
+ |