GrVkStencilAttachment.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. #include "src/gpu/vk/GrVkGpu.h"
  8. #include "src/gpu/vk/GrVkImage.h"
  9. #include "src/gpu/vk/GrVkImageView.h"
  10. #include "src/gpu/vk/GrVkStencilAttachment.h"
  11. #include "src/gpu/vk/GrVkUtil.h"
  12. #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)
  13. GrVkStencilAttachment::GrVkStencilAttachment(GrVkGpu* gpu,
  14. const Format& format,
  15. const GrVkImage::ImageDesc& desc,
  16. const GrVkImageInfo& info,
  17. sk_sp<GrVkImageLayout> layout,
  18. const GrVkImageView* stencilView)
  19. : GrStencilAttachment(gpu, desc.fWidth, desc.fHeight, format.fStencilBits, desc.fSamples)
  20. , GrVkImage(info, std::move(layout), GrBackendObjectOwnership::kOwned)
  21. , fFormat(format)
  22. , fStencilView(stencilView) {
  23. this->registerWithCache(SkBudgeted::kYes);
  24. stencilView->ref();
  25. }
  26. GrVkStencilAttachment* GrVkStencilAttachment::Create(GrVkGpu* gpu,
  27. int width,
  28. int height,
  29. int sampleCnt,
  30. const Format& format) {
  31. GrVkImage::ImageDesc imageDesc;
  32. imageDesc.fImageType = VK_IMAGE_TYPE_2D;
  33. imageDesc.fFormat = format.fInternalFormat;
  34. imageDesc.fWidth = width;
  35. imageDesc.fHeight = height;
  36. imageDesc.fLevels = 1;
  37. imageDesc.fSamples = sampleCnt;
  38. imageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
  39. imageDesc.fUsageFlags = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
  40. VK_IMAGE_USAGE_TRANSFER_DST_BIT;
  41. imageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
  42. GrVkImageInfo info;
  43. if (!GrVkImage::InitImageInfo(gpu, imageDesc, &info)) {
  44. return nullptr;
  45. }
  46. const GrVkImageView* imageView = GrVkImageView::Create(gpu, info.fImage,
  47. format.fInternalFormat,
  48. GrVkImageView::kStencil_Type, 1,
  49. GrVkYcbcrConversionInfo());
  50. if (!imageView) {
  51. GrVkImage::DestroyImageInfo(gpu, &info);
  52. return nullptr;
  53. }
  54. sk_sp<GrVkImageLayout> layout(new GrVkImageLayout(info.fImageLayout));
  55. GrVkStencilAttachment* stencil = new GrVkStencilAttachment(gpu, format, imageDesc,
  56. info, std::move(layout), imageView);
  57. imageView->unref(gpu);
  58. return stencil;
  59. }
  60. GrVkStencilAttachment::~GrVkStencilAttachment() {
  61. // should have been released or abandoned first
  62. SkASSERT(!fStencilView);
  63. }
  64. size_t GrVkStencilAttachment::onGpuMemorySize() const {
  65. uint64_t size = this->width();
  66. size *= this->height();
  67. size *= fFormat.fTotalBits;
  68. size *= this->numSamples();
  69. return static_cast<size_t>(size / 8);
  70. }
  71. void GrVkStencilAttachment::onRelease() {
  72. GrVkGpu* gpu = this->getVkGpu();
  73. this->releaseImage(gpu);
  74. fStencilView->unref(gpu);
  75. fStencilView = nullptr;
  76. GrStencilAttachment::onRelease();
  77. }
  78. void GrVkStencilAttachment::onAbandon() {
  79. this->abandonImage();
  80. fStencilView->unrefAndAbandon();
  81. fStencilView = nullptr;
  82. GrStencilAttachment::onAbandon();
  83. }
  84. GrVkGpu* GrVkStencilAttachment::getVkGpu() const {
  85. SkASSERT(!this->wasDestroyed());
  86. return static_cast<GrVkGpu*>(this->getGpu());
  87. }