OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrVkGpu.h" | 8 #include "GrVkGpu.h" |
9 | 9 |
10 #include "GrContextOptions.h" | 10 #include "GrContextOptions.h" |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 VK_IMAGE_ASPECT_COLOR_BIT, | 319 VK_IMAGE_ASPECT_COLOR_BIT, |
320 0, // mipLevel | 320 0, // mipLevel |
321 0, // arraySlice | 321 0, // arraySlice |
322 }; | 322 }; |
323 VkSubresourceLayout layout; | 323 VkSubresourceLayout layout; |
324 VkResult err; | 324 VkResult err; |
325 | 325 |
326 const GrVkInterface* interface = this->vkInterface(); | 326 const GrVkInterface* interface = this->vkInterface(); |
327 | 327 |
328 GR_VK_CALL(interface, GetImageSubresourceLayout(fDevice, | 328 GR_VK_CALL(interface, GetImageSubresourceLayout(fDevice, |
329 tex->textureImage(), | 329 tex->image(), |
330 &subres, | 330 &subres, |
331 &layout)); | 331 &layout)); |
332 | 332 |
333 int texTop = kBottomLeft_GrSurfaceOrigin == desc.fOrigin ? tex->height() - t
op - height : top; | 333 int texTop = kBottomLeft_GrSurfaceOrigin == desc.fOrigin ? tex->height() - t
op - height : top; |
334 VkDeviceSize offset = texTop*layout.rowPitch + left*bpp; | 334 VkDeviceSize offset = texTop*layout.rowPitch + left*bpp; |
335 VkDeviceSize size = height*layout.rowPitch; | 335 VkDeviceSize size = height*layout.rowPitch; |
336 void* mapPtr; | 336 void* mapPtr; |
337 err = GR_VK_CALL(interface, MapMemory(fDevice, tex->textureMemory(), offset,
size, 0, | 337 err = GR_VK_CALL(interface, MapMemory(fDevice, tex->memory(), offset, size,
0, &mapPtr)); |
338 &mapPtr)); | |
339 if (err) { | 338 if (err) { |
340 return false; | 339 return false; |
341 } | 340 } |
342 | 341 |
343 if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin) { | 342 if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin) { |
344 // copy into buffer by rows | 343 // copy into buffer by rows |
345 const char* srcRow = reinterpret_cast<const char*>(data); | 344 const char* srcRow = reinterpret_cast<const char*>(data); |
346 char* dstRow = reinterpret_cast<char*>(mapPtr)+(height - 1)*layout.rowPi
tch; | 345 char* dstRow = reinterpret_cast<char*>(mapPtr)+(height - 1)*layout.rowPi
tch; |
347 for (int y = 0; y < height; y++) { | 346 for (int y = 0; y < height; y++) { |
348 memcpy(dstRow, srcRow, trimRowBytes); | 347 memcpy(dstRow, srcRow, trimRowBytes); |
349 srcRow += rowBytes; | 348 srcRow += rowBytes; |
350 dstRow -= layout.rowPitch; | 349 dstRow -= layout.rowPitch; |
351 } | 350 } |
352 } else { | 351 } else { |
353 // If there is no padding on the src (rowBytes) or dst (layout.rowPitch)
we can memcpy | 352 // If there is no padding on the src (rowBytes) or dst (layout.rowPitch)
we can memcpy |
354 if (trimRowBytes == rowBytes && trimRowBytes == layout.rowPitch) { | 353 if (trimRowBytes == rowBytes && trimRowBytes == layout.rowPitch) { |
355 memcpy(mapPtr, data, trimRowBytes * height); | 354 memcpy(mapPtr, data, trimRowBytes * height); |
356 } else { | 355 } else { |
357 SkRectMemcpy(mapPtr, static_cast<size_t>(layout.rowPitch), data, row
Bytes, | 356 SkRectMemcpy(mapPtr, static_cast<size_t>(layout.rowPitch), data, row
Bytes, |
358 trimRowBytes, height); | 357 trimRowBytes, height); |
359 } | 358 } |
360 } | 359 } |
361 | 360 |
362 GR_VK_CALL(interface, UnmapMemory(fDevice, tex->textureMemory())); | 361 GR_VK_CALL(interface, UnmapMemory(fDevice, tex->memory())); |
363 | 362 |
364 return true; | 363 return true; |
365 } | 364 } |
366 | 365 |
367 bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex, | 366 bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex, |
368 int left, int top, int width, int height, | 367 int left, int top, int width, int height, |
369 GrPixelConfig dataConfig, | 368 GrPixelConfig dataConfig, |
370 const SkTArray<GrMipLevel>& texels) { | 369 const SkTArray<GrMipLevel>& texels) { |
371 SkASSERT(!tex->isLinearTiled()); | 370 SkASSERT(!tex->isLinearTiled()); |
372 // The assumption is either that we have no mipmaps, or that our rect is the
entire texture | 371 // The assumption is either that we have no mipmaps, or that our rect is the
entire texture |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 // By default, all textures in Vk use TopLeft | 600 // By default, all textures in Vk use TopLeft |
602 if (kDefault_GrSurfaceOrigin == origin) { | 601 if (kDefault_GrSurfaceOrigin == origin) { |
603 return kTopLeft_GrSurfaceOrigin; | 602 return kTopLeft_GrSurfaceOrigin; |
604 } else { | 603 } else { |
605 return origin; | 604 return origin; |
606 } | 605 } |
607 } | 606 } |
608 | 607 |
609 GrTexture* GrVkGpu::onWrapBackendTexture(const GrBackendTextureDesc& desc, | 608 GrTexture* GrVkGpu::onWrapBackendTexture(const GrBackendTextureDesc& desc, |
610 GrWrapOwnership ownership) { | 609 GrWrapOwnership ownership) { |
611 VkFormat format; | |
612 if (!GrPixelConfigToVkFormat(desc.fConfig, &format)) { | |
613 return nullptr; | |
614 } | |
615 | |
616 if (0 == desc.fTextureHandle) { | 610 if (0 == desc.fTextureHandle) { |
617 return nullptr; | 611 return nullptr; |
618 } | 612 } |
619 | 613 |
620 int maxSize = this->caps()->maxTextureSize(); | 614 int maxSize = this->caps()->maxTextureSize(); |
621 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { | 615 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { |
622 return nullptr; | 616 return nullptr; |
623 } | 617 } |
624 | 618 |
625 const GrVkTextureInfo* info = reinterpret_cast<const GrVkTextureInfo*>(desc.
fTextureHandle); | 619 const GrVkImageInfo* info = reinterpret_cast<const GrVkImageInfo*>(desc.fTex
tureHandle); |
626 if (VK_NULL_HANDLE == info->fImage || VK_NULL_HANDLE == info->fAlloc) { | 620 if (VK_NULL_HANDLE == info->fImage || VK_NULL_HANDLE == info->fAlloc) { |
627 return nullptr; | 621 return nullptr; |
628 } | 622 } |
| 623 #ifdef SK_DEBUG |
| 624 VkFormat format; |
| 625 if (!GrPixelConfigToVkFormat(desc.fConfig, &format)) { |
| 626 return nullptr; |
| 627 } |
| 628 SkASSERT(format == info->fFormat); |
| 629 #endif |
629 | 630 |
630 GrSurfaceDesc surfDesc; | 631 GrSurfaceDesc surfDesc; |
631 // next line relies on GrBackendTextureDesc's flags matching GrTexture's | 632 // next line relies on GrBackendTextureDesc's flags matching GrTexture's |
632 surfDesc.fFlags = (GrSurfaceFlags)desc.fFlags; | 633 surfDesc.fFlags = (GrSurfaceFlags)desc.fFlags; |
633 surfDesc.fWidth = desc.fWidth; | 634 surfDesc.fWidth = desc.fWidth; |
634 surfDesc.fHeight = desc.fHeight; | 635 surfDesc.fHeight = desc.fHeight; |
635 surfDesc.fConfig = desc.fConfig; | 636 surfDesc.fConfig = desc.fConfig; |
636 surfDesc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount()
); | 637 surfDesc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount()
); |
637 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrBackendTextureFla
g); | 638 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrBackendTextureFla
g); |
638 // In GL, Chrome assumes all textures are BottomLeft | 639 // In GL, Chrome assumes all textures are BottomLeft |
639 // In VK, we don't have this restriction | 640 // In VK, we don't have this restriction |
640 surfDesc.fOrigin = resolve_origin(desc.fOrigin); | 641 surfDesc.fOrigin = resolve_origin(desc.fOrigin); |
641 | 642 |
642 GrVkTexture* texture = nullptr; | 643 GrVkTexture* texture = nullptr; |
643 if (renderTarget) { | 644 if (renderTarget) { |
644 texture = GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(this
, surfDesc, | 645 texture = GrVkTextureRenderTarget::CreateWrappedTextureRenderTarget(this
, surfDesc, |
645 owne
rship, format, | 646 owne
rship, info); |
646 info
); | |
647 } else { | 647 } else { |
648 texture = GrVkTexture::CreateWrappedTexture(this, surfDesc, ownership, f
ormat, info); | 648 texture = GrVkTexture::CreateWrappedTexture(this, surfDesc, ownership, i
nfo); |
649 } | 649 } |
650 if (!texture) { | 650 if (!texture) { |
651 return nullptr; | 651 return nullptr; |
652 } | 652 } |
653 | 653 |
654 return texture; | 654 return texture; |
655 } | 655 } |
656 | 656 |
657 GrRenderTarget* GrVkGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDe
sc& wrapDesc, | 657 GrRenderTarget* GrVkGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDe
sc& wrapDesc, |
658 GrWrapOwnership ownership) { | 658 GrWrapOwnership ownership) { |
659 | 659 |
660 const GrVkTextureInfo* info = | 660 const GrVkImageInfo* info = |
661 reinterpret_cast<const GrVkTextureInfo*>(wrapDesc.fRenderTargetHandle); | 661 reinterpret_cast<const GrVkImageInfo*>(wrapDesc.fRenderTargetHandle); |
662 if (VK_NULL_HANDLE == info->fImage || | 662 if (VK_NULL_HANDLE == info->fImage || |
663 (VK_NULL_HANDLE == info->fAlloc && kAdopt_GrWrapOwnership == ownership))
{ | 663 (VK_NULL_HANDLE == info->fAlloc && kAdopt_GrWrapOwnership == ownership))
{ |
664 return nullptr; | 664 return nullptr; |
665 } | 665 } |
666 | 666 |
667 GrSurfaceDesc desc; | 667 GrSurfaceDesc desc; |
668 desc.fConfig = wrapDesc.fConfig; | 668 desc.fConfig = wrapDesc.fConfig; |
669 desc.fFlags = kCheckAllocation_GrSurfaceFlag; | 669 desc.fFlags = kCheckAllocation_GrSurfaceFlag; |
670 desc.fWidth = wrapDesc.fWidth; | 670 desc.fWidth = wrapDesc.fWidth; |
671 desc.fHeight = wrapDesc.fHeight; | 671 desc.fHeight = wrapDesc.fHeight; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
703 if (!caps.configCanBeDstofBlit(tex->config(), false) || | 703 if (!caps.configCanBeDstofBlit(tex->config(), false) || |
704 !caps.configCanBeSrcofBlit(tex->config(), false)) { | 704 !caps.configCanBeSrcofBlit(tex->config(), false)) { |
705 return; | 705 return; |
706 } | 706 } |
707 | 707 |
708 // change the original image's layout | 708 // change the original image's layout |
709 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | 709 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, |
710 VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_
BIT, false); | 710 VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_
BIT, false); |
711 | 711 |
712 // grab handle to the original image resource | 712 // grab handle to the original image resource |
713 const GrVkImage::Resource* oldResource = tex->resource(); | 713 const GrVkResource* oldResource = tex->resource(); |
714 oldResource->ref(); | 714 oldResource->ref(); |
| 715 VkImage oldImage = tex->image(); |
715 | 716 |
716 // SkMipMap doesn't include the base level in the level count so we have to
add 1 | 717 // SkMipMap doesn't include the base level in the level count so we have to
add 1 |
717 uint32_t levelCount = SkMipMap::ComputeLevelCount(tex->width(), tex->height(
)) + 1; | 718 uint32_t levelCount = SkMipMap::ComputeLevelCount(tex->width(), tex->height(
)) + 1; |
718 if (!tex->reallocForMipmap(this, levelCount)) { | 719 if (!tex->reallocForMipmap(this, levelCount)) { |
719 oldResource->unref(this); | 720 oldResource->unref(this); |
720 return; | 721 return; |
721 } | 722 } |
722 | 723 |
723 // change the new image's layout | 724 // change the new image's layout |
724 tex->setImageLayout(this, VK_IMAGE_LAYOUT_GENERAL, | 725 tex->setImageLayout(this, VK_IMAGE_LAYOUT_GENERAL, |
725 VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER
_BIT, false); | 726 VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER
_BIT, false); |
726 | 727 |
727 // Blit original image | 728 // Blit original image |
728 int width = tex->width(); | 729 int width = tex->width(); |
729 int height = tex->height(); | 730 int height = tex->height(); |
730 | 731 |
731 VkImageBlit blitRegion; | 732 VkImageBlit blitRegion; |
732 memset(&blitRegion, 0, sizeof(VkImageBlit)); | 733 memset(&blitRegion, 0, sizeof(VkImageBlit)); |
733 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; | 734 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; |
734 blitRegion.srcOffsets[0] = { 0, 0, 0 }; | 735 blitRegion.srcOffsets[0] = { 0, 0, 0 }; |
735 blitRegion.srcOffsets[1] = { width, height, 0 }; | 736 blitRegion.srcOffsets[1] = { width, height, 0 }; |
736 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; | 737 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; |
737 blitRegion.dstOffsets[0] = { 0, 0, 0 }; | 738 blitRegion.dstOffsets[0] = { 0, 0, 0 }; |
738 blitRegion.dstOffsets[1] = { width, height, 0 }; | 739 blitRegion.dstOffsets[1] = { width, height, 0 }; |
739 | 740 |
740 fCurrentCmdBuffer->blitImage(this, | 741 fCurrentCmdBuffer->blitImage(this, |
741 oldResource, | 742 oldResource, |
| 743 oldImage, |
742 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | 744 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, |
743 tex->resource(), | 745 tex->resource(), |
| 746 tex->image(), |
744 VK_IMAGE_LAYOUT_GENERAL, | 747 VK_IMAGE_LAYOUT_GENERAL, |
745 1, | 748 1, |
746 &blitRegion, | 749 &blitRegion, |
747 VK_FILTER_LINEAR); | 750 VK_FILTER_LINEAR); |
748 | 751 |
749 // setup memory barrier | 752 // setup memory barrier |
750 SkASSERT(GrVkFormatToPixelConfig(tex->resource()->fFormat, nullptr)); | 753 SkASSERT(GrVkFormatToPixelConfig(tex->imageFormat(), nullptr)); |
751 VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; | 754 VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; |
752 VkImageMemoryBarrier imageMemoryBarrier = { | 755 VkImageMemoryBarrier imageMemoryBarrier = { |
753 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType | 756 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType |
754 NULL, // pNext | 757 NULL, // pNext |
755 VK_ACCESS_TRANSFER_WRITE_BIT, // outputMask | 758 VK_ACCESS_TRANSFER_WRITE_BIT, // outputMask |
756 VK_ACCESS_TRANSFER_READ_BIT, // inputMask | 759 VK_ACCESS_TRANSFER_READ_BIT, // inputMask |
757 VK_IMAGE_LAYOUT_GENERAL, // oldLayout | 760 VK_IMAGE_LAYOUT_GENERAL, // oldLayout |
758 VK_IMAGE_LAYOUT_GENERAL, // newLayout | 761 VK_IMAGE_LAYOUT_GENERAL, // newLayout |
759 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex | 762 VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex |
760 VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex | 763 VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex |
761 tex->resource()->fImage, // image | 764 tex->image(), // image |
762 { aspectFlags, 0, 1, 0, 1 } // subresourceRange | 765 { aspectFlags, 0, 1, 0, 1 } // subresourceRange |
763 }; | 766 }; |
764 | 767 |
765 // Blit the miplevels | 768 // Blit the miplevels |
766 uint32_t mipLevel = 1; | 769 uint32_t mipLevel = 1; |
767 while (mipLevel < levelCount) { | 770 while (mipLevel < levelCount) { |
768 int prevWidth = width; | 771 int prevWidth = width; |
769 int prevHeight = height; | 772 int prevHeight = height; |
770 width = SkTMax(1, width / 2); | 773 width = SkTMax(1, width / 2); |
771 height = SkTMax(1, height / 2); | 774 height = SkTMax(1, height / 2); |
772 | 775 |
773 imageMemoryBarrier.subresourceRange.baseMipLevel = mipLevel - 1; | 776 imageMemoryBarrier.subresourceRange.baseMipLevel = mipLevel - 1; |
774 this->addImageMemoryBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_
STAGE_TRANSFER_BIT, | 777 this->addImageMemoryBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_
STAGE_TRANSFER_BIT, |
775 false, &imageMemoryBarrier); | 778 false, &imageMemoryBarrier); |
776 | 779 |
777 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel - 1, 0
, 1 }; | 780 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel - 1, 0
, 1 }; |
778 blitRegion.srcOffsets[0] = { 0, 0, 0 }; | 781 blitRegion.srcOffsets[0] = { 0, 0, 0 }; |
779 blitRegion.srcOffsets[1] = { prevWidth, prevHeight, 0 }; | 782 blitRegion.srcOffsets[1] = { prevWidth, prevHeight, 0 }; |
780 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 0, 1
}; | 783 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 0, 1
}; |
781 blitRegion.dstOffsets[0] = { 0, 0, 0 }; | 784 blitRegion.dstOffsets[0] = { 0, 0, 0 }; |
782 blitRegion.dstOffsets[1] = { width, height, 0 }; | 785 blitRegion.dstOffsets[1] = { width, height, 0 }; |
783 fCurrentCmdBuffer->blitImage(this, | 786 fCurrentCmdBuffer->blitImage(this, |
784 tex->resource(), | 787 *tex, |
785 VK_IMAGE_LAYOUT_GENERAL, | 788 *tex, |
786 tex->resource(), | |
787 VK_IMAGE_LAYOUT_GENERAL, | |
788 1, | 789 1, |
789 &blitRegion, | 790 &blitRegion, |
790 VK_FILTER_LINEAR); | 791 VK_FILTER_LINEAR); |
791 ++mipLevel; | 792 ++mipLevel; |
792 } | 793 } |
793 | 794 |
794 oldResource->unref(this); | 795 oldResource->unref(this); |
795 } | 796 } |
796 | 797 |
797 | 798 |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
940 SkRectMemcpy(mapPtr, static_cast<size_t>(layout.rowPitch), srcDa
ta, rowCopyBytes, | 941 SkRectMemcpy(mapPtr, static_cast<size_t>(layout.rowPitch), srcDa
ta, rowCopyBytes, |
941 rowCopyBytes, h); | 942 rowCopyBytes, h); |
942 } | 943 } |
943 VK_CALL(UnmapMemory(fDevice, alloc)); | 944 VK_CALL(UnmapMemory(fDevice, alloc)); |
944 } else { | 945 } else { |
945 // TODO: Add support for copying to optimal tiling | 946 // TODO: Add support for copying to optimal tiling |
946 SkASSERT(false); | 947 SkASSERT(false); |
947 } | 948 } |
948 } | 949 } |
949 | 950 |
950 GrVkTextureInfo* info = new GrVkTextureInfo; | 951 GrVkImageInfo* info = new GrVkImageInfo; |
951 info->fImage = image; | 952 info->fImage = image; |
952 info->fAlloc = alloc; | 953 info->fAlloc = alloc; |
953 info->fImageTiling = imageTiling; | 954 info->fImageTiling = imageTiling; |
954 info->fImageLayout = initialLayout; | 955 info->fImageLayout = initialLayout; |
955 info->fFormat = pixelFormat; | 956 info->fFormat = pixelFormat; |
956 info->fLevelCount = 1; | 957 info->fLevelCount = 1; |
957 | 958 |
958 return (GrBackendObject)info; | 959 return (GrBackendObject)info; |
959 } | 960 } |
960 | 961 |
961 bool GrVkGpu::isTestingOnlyBackendTexture(GrBackendObject id) const { | 962 bool GrVkGpu::isTestingOnlyBackendTexture(GrBackendObject id) const { |
962 const GrVkTextureInfo* backend = reinterpret_cast<const GrVkTextureInfo*>(id
); | 963 const GrVkImageInfo* backend = reinterpret_cast<const GrVkImageInfo*>(id); |
963 | 964 |
964 if (backend && backend->fImage && backend->fAlloc) { | 965 if (backend && backend->fImage && backend->fAlloc) { |
965 VkMemoryRequirements req; | 966 VkMemoryRequirements req; |
966 memset(&req, 0, sizeof(req)); | 967 memset(&req, 0, sizeof(req)); |
967 GR_VK_CALL(this->vkInterface(), GetImageMemoryRequirements(fDevice, | 968 GR_VK_CALL(this->vkInterface(), GetImageMemoryRequirements(fDevice, |
968 backend->fIma
ge, | 969 backend->fIma
ge, |
969 &req)); | 970 &req)); |
970 // TODO: find a better check | 971 // TODO: find a better check |
971 // This will probably fail with a different driver | 972 // This will probably fail with a different driver |
972 return (req.size > 0) && (req.size <= 8192 * 8192); | 973 return (req.size > 0) && (req.size <= 8192 * 8192); |
973 } | 974 } |
974 | 975 |
975 return false; | 976 return false; |
976 } | 977 } |
977 | 978 |
978 void GrVkGpu::deleteTestingOnlyBackendTexture(GrBackendObject id, bool abandon)
{ | 979 void GrVkGpu::deleteTestingOnlyBackendTexture(GrBackendObject id, bool abandon)
{ |
979 const GrVkTextureInfo* backend = reinterpret_cast<const GrVkTextureInfo*>(id
); | 980 const GrVkImageInfo* backend = reinterpret_cast<const GrVkImageInfo*>(id); |
980 | 981 |
981 if (backend) { | 982 if (backend) { |
982 if (!abandon) { | 983 if (!abandon) { |
983 // something in the command buffer may still be using this, so force
submit | 984 // something in the command buffer may still be using this, so force
submit |
984 this->submitCommandBuffer(kForce_SyncQueue); | 985 this->submitCommandBuffer(kForce_SyncQueue); |
985 | 986 |
986 VK_CALL(FreeMemory(this->device(), backend->fAlloc, nullptr)); | 987 VK_CALL(FreeMemory(this->device(), backend->fAlloc, nullptr)); |
987 VK_CALL(DestroyImage(this->device(), backend->fImage, nullptr)); | 988 VK_CALL(DestroyImage(this->device(), backend->fImage, nullptr)); |
988 } | 989 } |
989 delete backend; | 990 delete backend; |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 VkImageBlit blitRegion; | 1373 VkImageBlit blitRegion; |
1373 memset(&blitRegion, 0, sizeof(VkImageBlit)); | 1374 memset(&blitRegion, 0, sizeof(VkImageBlit)); |
1374 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; | 1375 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; |
1375 blitRegion.srcOffsets[0] = { srcVkRect.fLeft, srcVkRect.fTop, 0 }; | 1376 blitRegion.srcOffsets[0] = { srcVkRect.fLeft, srcVkRect.fTop, 0 }; |
1376 blitRegion.srcOffsets[1] = { srcVkRect.fRight, srcVkRect.fBottom, 0 }; | 1377 blitRegion.srcOffsets[1] = { srcVkRect.fRight, srcVkRect.fBottom, 0 }; |
1377 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; | 1378 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; |
1378 blitRegion.dstOffsets[0] = { dstRect.fLeft, dstRect.fTop, 0 }; | 1379 blitRegion.dstOffsets[0] = { dstRect.fLeft, dstRect.fTop, 0 }; |
1379 blitRegion.dstOffsets[1] = { dstRect.fRight, dstRect.fBottom, 0 }; | 1380 blitRegion.dstOffsets[1] = { dstRect.fRight, dstRect.fBottom, 0 }; |
1380 | 1381 |
1381 fCurrentCmdBuffer->blitImage(this, | 1382 fCurrentCmdBuffer->blitImage(this, |
1382 srcImage->resource(), | 1383 *srcImage, |
1383 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | 1384 *dstImage, |
1384 dstImage->resource(), | |
1385 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | |
1386 1, | 1385 1, |
1387 &blitRegion, | 1386 &blitRegion, |
1388 VK_FILTER_NEAREST); // We never scale so any fi
lter works here | 1387 VK_FILTER_NEAREST); // We never scale so any fi
lter works here |
1389 | 1388 |
1390 this->didWriteToSurface(dst, &dstRect); | 1389 this->didWriteToSurface(dst, &dstRect); |
1391 } | 1390 } |
1392 | 1391 |
1393 inline bool can_copy_as_draw(const GrSurface* dst, | 1392 inline bool can_copy_as_draw(const GrSurface* dst, |
1394 const GrSurface* src, | 1393 const GrSurface* src, |
1395 const GrVkGpu* gpu) { | 1394 const GrVkGpu* gpu) { |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1686 aglSwapBuffers(aglGetCurrentContext()); | 1685 aglSwapBuffers(aglGetCurrentContext()); |
1687 int set_a_break_pt_here = 9; | 1686 int set_a_break_pt_here = 9; |
1688 aglSwapBuffers(aglGetCurrentContext()); | 1687 aglSwapBuffers(aglGetCurrentContext()); |
1689 #elif defined(SK_BUILD_FOR_WIN32) | 1688 #elif defined(SK_BUILD_FOR_WIN32) |
1690 SwapBuf(); | 1689 SwapBuf(); |
1691 int set_a_break_pt_here = 9; | 1690 int set_a_break_pt_here = 9; |
1692 SwapBuf(); | 1691 SwapBuf(); |
1693 #endif | 1692 #endif |
1694 #endif | 1693 #endif |
1695 } | 1694 } |
OLD | NEW |