| 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 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |