Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/gpu/vk/GrVkGpu.cpp

Issue 1943933002: Apply setImageLayout() to all of a VkImage's subresources. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Address comments Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 486 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
487 VK_PIPELINE_STAGE_TRANSFER_BIT, 487 VK_PIPELINE_STAGE_TRANSFER_BIT,
488 false); 488 false);
489 489
490 // Change layout of our target so it can be copied to 490 // Change layout of our target so it can be copied to
491 VkImageLayout layout = tex->currentLayout(); 491 VkImageLayout layout = tex->currentLayout();
492 VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(l ayout); 492 VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(l ayout);
493 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; 493 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
494 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout); 494 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout);
495 VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; 495 VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
496 // TODO: change layout of all the subresources
497 tex->setImageLayout(this, 496 tex->setImageLayout(this,
498 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 497 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
499 srcAccessMask, 498 srcAccessMask,
500 dstAccessMask, 499 dstAccessMask,
501 srcStageMask, 500 srcStageMask,
502 dstStageMask, 501 dstStageMask,
503 false); 502 false);
504 503
505 // Copy the buffer to the image 504 // Copy the buffer to the image
506 fCurrentCmdBuffer->copyBufferToImage(this, 505 fCurrentCmdBuffer->copyBufferToImage(this,
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 } 719 }
721 720
722 // change the original image's layout 721 // change the original image's layout
723 VkImageLayout origSrcLayout = tex->currentLayout(); 722 VkImageLayout origSrcLayout = tex->currentLayout();
724 VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(o rigSrcLayout); 723 VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(o rigSrcLayout);
725 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; 724 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
726 725
727 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origSrcLayou t); 726 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origSrcLayou t);
728 VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; 727 VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
729 728
730 // TODO: change layout of all the subresources
731 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 729 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
732 srcAccessMask, dstAccessMask, srcStageMask, dstStageMask , false); 730 srcAccessMask, dstAccessMask, srcStageMask, dstStageMask , false);
733 731
734 // grab handle to the original image resource 732 // grab handle to the original image resource
735 const GrVkImage::Resource* oldResource = tex->resource(); 733 const GrVkImage::Resource* oldResource = tex->resource();
736 oldResource->ref(); 734 oldResource->ref();
737 735
738 uint32_t mipLevels = SkMipMap::ComputeLevelCount(tex->width(), tex->height() ); 736 uint32_t mipLevels = SkMipMap::ComputeLevelCount(tex->width(), tex->height() );
739 if (!tex->reallocForMipmap(this, mipLevels)) { 737 if (!tex->reallocForMipmap(this, mipLevels)) {
740 oldResource->unref(this); 738 oldResource->unref(this);
741 return; 739 return;
742 } 740 }
743 741
744 // change the new image's layout 742 // change the new image's layout
745 VkImageLayout origDstLayout = tex->currentLayout(); 743 VkImageLayout origDstLayout = tex->currentLayout();
746 744
747 srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout); 745 srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
748 dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; 746 dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
749 747
750 srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout); 748 srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);
751 dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; 749 dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
752 750
753 tex->setImageLayout(this, 751 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
754 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 752 srcAccessMask, dstAccessMask, srcStageMask, dstStageMask , false);
755 srcAccessMask,
756 dstAccessMask,
757 srcStageMask,
758 dstStageMask,
759 false);
760 753
761 // Blit original image 754 // Blit original image
762 int width = tex->width(); 755 int width = tex->width();
763 int height = tex->height(); 756 int height = tex->height();
764 uint32_t mipLevel = 0; 757 uint32_t mipLevel = 0;
765 758
766 VkImageBlit blitRegion; 759 VkImageBlit blitRegion;
767 memset(&blitRegion, 0, sizeof(VkImageBlit)); 760 memset(&blitRegion, 0, sizeof(VkImageBlit));
768 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; 761 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 };
769 blitRegion.srcOffsets[0] = { 0, 0, 0 }; 762 blitRegion.srcOffsets[0] = { 0, 0, 0 };
(...skipping 13 matching lines...) Expand all
783 // Blit the miplevels 776 // Blit the miplevels
784 while (width/2 > 0 && height/2 > 0) { 777 while (width/2 > 0 && height/2 > 0) {
785 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 0, 1 }; 778 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 0, 1 };
786 blitRegion.srcOffsets[0] = { 0, 0, 0 }; 779 blitRegion.srcOffsets[0] = { 0, 0, 0 };
787 blitRegion.srcOffsets[1] = { width, height, 0 }; 780 blitRegion.srcOffsets[1] = { width, height, 0 };
788 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel+1, 0, 1 }; 781 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel+1, 0, 1 };
789 blitRegion.dstOffsets[0] = { 0, 0, 0 }; 782 blitRegion.dstOffsets[0] = { 0, 0, 0 };
790 blitRegion.dstOffsets[1] = { width/2, height/2, 0 }; 783 blitRegion.dstOffsets[1] = { width/2, height/2, 0 };
791 784
792 // TODO: insert image barrier to wait on previous blit 785 // TODO: insert image barrier to wait on previous blit
786 // TODO: change layout of src subresource to TRANSFER_SRC_OPTIMAL
793 787
794 fCurrentCmdBuffer->blitImage(this, 788 fCurrentCmdBuffer->blitImage(this,
795 tex->resource(), 789 tex->resource(),
796 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 790 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
797 tex->resource(), 791 tex->resource(),
798 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 792 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
799 1, 793 1,
800 &blitRegion, 794 &blitRegion,
801 VK_FILTER_LINEAR); 795 VK_FILTER_LINEAR);
802 796
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 SkASSERT(false); 955 SkASSERT(false);
962 } 956 }
963 } 957 }
964 958
965 GrVkTextureInfo* info = new GrVkTextureInfo; 959 GrVkTextureInfo* info = new GrVkTextureInfo;
966 info->fImage = image; 960 info->fImage = image;
967 info->fAlloc = alloc; 961 info->fAlloc = alloc;
968 info->fImageTiling = imageTiling; 962 info->fImageTiling = imageTiling;
969 info->fImageLayout = initialLayout; 963 info->fImageLayout = initialLayout;
970 info->fFormat = pixelFormat; 964 info->fFormat = pixelFormat;
965 info->fLevelCount = 1;
971 966
972 return (GrBackendObject)info; 967 return (GrBackendObject)info;
973 } 968 }
974 969
975 bool GrVkGpu::isTestingOnlyBackendTexture(GrBackendObject id) const { 970 bool GrVkGpu::isTestingOnlyBackendTexture(GrBackendObject id) const {
976 const GrVkTextureInfo* backend = reinterpret_cast<const GrVkTextureInfo*>(id ); 971 const GrVkTextureInfo* backend = reinterpret_cast<const GrVkTextureInfo*>(id );
977 972
978 if (backend && backend->fImage && backend->fAlloc) { 973 if (backend && backend->fImage && backend->fAlloc) {
979 VkMemoryRequirements req; 974 VkMemoryRequirements req;
980 memset(&req, 0, sizeof(req)); 975 memset(&req, 0, sizeof(req));
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after
1808 aglSwapBuffers(aglGetCurrentContext()); 1803 aglSwapBuffers(aglGetCurrentContext());
1809 int set_a_break_pt_here = 9; 1804 int set_a_break_pt_here = 9;
1810 aglSwapBuffers(aglGetCurrentContext()); 1805 aglSwapBuffers(aglGetCurrentContext());
1811 #elif defined(SK_BUILD_FOR_WIN32) 1806 #elif defined(SK_BUILD_FOR_WIN32)
1812 SwapBuf(); 1807 SwapBuf();
1813 int set_a_break_pt_here = 9; 1808 int set_a_break_pt_here = 9;
1814 SwapBuf(); 1809 SwapBuf();
1815 #endif 1810 #endif
1816 #endif 1811 #endif
1817 } 1812 }
OLDNEW
« no previous file with comments | « include/gpu/vk/GrVkTypes.h ('k') | src/gpu/vk/GrVkImage.h » ('j') | src/gpu/vk/GrVkImage.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698