| 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 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 dstAccessMask, | 279 dstAccessMask, |
| 280 srcStageMask, | 280 srcStageMask, |
| 281 dstStageMask, | 281 dstStageMask, |
| 282 false); | 282 false); |
| 283 this->submitCommandBuffer(kForce_SyncQueue); | 283 this->submitCommandBuffer(kForce_SyncQueue); |
| 284 } | 284 } |
| 285 success = this->uploadTexDataLinear(vkTex, left, top, width, height,
config, | 285 success = this->uploadTexDataLinear(vkTex, left, top, width, height,
config, |
| 286 texels.begin()->fPixels, texels.
begin()->fRowBytes); | 286 texels.begin()->fPixels, texels.
begin()->fRowBytes); |
| 287 } else { | 287 } else { |
| 288 int newMipLevels = texels.count(); | 288 int newMipLevels = texels.count(); |
| 289 int currentMipLevels = vkTex->texturePriv().maxMipMapLevel(); | 289 int currentMipLevels = vkTex->texturePriv().maxMipMapLevel() + 1; |
| 290 if ((currentMipLevels || newMipLevels != 1) && newMipLevels != curre
ntMipLevels) { | 290 if (newMipLevels != currentMipLevels) { |
| 291 if (!vkTex->reallocForMipmap(this, newMipLevels)) { | 291 if (!vkTex->reallocForMipmap(this, newMipLevels)) { |
| 292 return false; | 292 return false; |
| 293 } | 293 } |
| 294 } | 294 } |
| 295 success = this->uploadTexDataOptimal(vkTex, left, top, width, height
, config, texels); | 295 success = this->uploadTexDataOptimal(vkTex, left, top, width, height
, config, texels); |
| 296 } | 296 } |
| 297 } | 297 } |
| 298 | 298 |
| 299 return success; | 299 return success; |
| 300 } | 300 } |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 727 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origSrcLayou
t); | 727 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origSrcLayou
t); |
| 728 VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; | 728 VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; |
| 729 | 729 |
| 730 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | 730 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, |
| 731 srcAccessMask, dstAccessMask, srcStageMask, dstStageMask
, false); | 731 srcAccessMask, dstAccessMask, srcStageMask, dstStageMask
, false); |
| 732 | 732 |
| 733 // grab handle to the original image resource | 733 // grab handle to the original image resource |
| 734 const GrVkImage::Resource* oldResource = tex->resource(); | 734 const GrVkImage::Resource* oldResource = tex->resource(); |
| 735 oldResource->ref(); | 735 oldResource->ref(); |
| 736 | 736 |
| 737 uint32_t mipLevels = SkMipMap::ComputeLevelCount(tex->width(), tex->height()
); | 737 // SkMipMap doesn't include the base level in the level count so we have to
add 1 |
| 738 if (!tex->reallocForMipmap(this, mipLevels)) { | 738 uint32_t levelCount = SkMipMap::ComputeLevelCount(tex->width(), tex->height(
)) + 1; |
| 739 if (!tex->reallocForMipmap(this, levelCount)) { |
| 739 oldResource->unref(this); | 740 oldResource->unref(this); |
| 740 return; | 741 return; |
| 741 } | 742 } |
| 742 | 743 |
| 743 // change the new image's layout | 744 // change the new image's layout |
| 744 VkImageLayout origDstLayout = tex->currentLayout(); | 745 VkImageLayout origDstLayout = tex->currentLayout(); |
| 745 | 746 |
| 746 srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout); | 747 srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout); |
| 747 dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; | 748 dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; |
| 748 | 749 |
| 749 srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout); | 750 srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout); |
| 750 dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; | 751 dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; |
| 751 | 752 |
| 752 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | 753 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, |
| 753 srcAccessMask, dstAccessMask, srcStageMask, dstStageMask
, false); | 754 srcAccessMask, dstAccessMask, srcStageMask, dstStageMask
, false); |
| 754 | 755 |
| 755 // Blit original image | 756 // Blit original image |
| 756 int width = tex->width(); | 757 int width = tex->width(); |
| 757 int height = tex->height(); | 758 int height = tex->height(); |
| 758 uint32_t mipLevel = 0; | |
| 759 | 759 |
| 760 VkImageBlit blitRegion; | 760 VkImageBlit blitRegion; |
| 761 memset(&blitRegion, 0, sizeof(VkImageBlit)); | 761 memset(&blitRegion, 0, sizeof(VkImageBlit)); |
| 762 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; | 762 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; |
| 763 blitRegion.srcOffsets[0] = { 0, 0, 0 }; | 763 blitRegion.srcOffsets[0] = { 0, 0, 0 }; |
| 764 blitRegion.srcOffsets[1] = { width, height, 0 }; | 764 blitRegion.srcOffsets[1] = { width, height, 0 }; |
| 765 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 0, 1 }; | 765 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; |
| 766 blitRegion.dstOffsets[0] = { 0, 0, 0 }; | 766 blitRegion.dstOffsets[0] = { 0, 0, 0 }; |
| 767 blitRegion.dstOffsets[1] = { width, height, 0 }; | 767 blitRegion.dstOffsets[1] = { width, height, 0 }; |
| 768 | 768 |
| 769 fCurrentCmdBuffer->blitImage(this, | 769 fCurrentCmdBuffer->blitImage(this, |
| 770 oldResource, | 770 oldResource, |
| 771 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | 771 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, |
| 772 tex->resource(), | 772 tex->resource(), |
| 773 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | 773 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, |
| 774 1, | 774 1, |
| 775 &blitRegion, | 775 &blitRegion, |
| 776 VK_FILTER_LINEAR); | 776 VK_FILTER_LINEAR); |
| 777 // Blit the miplevels | 777 // Blit the miplevels |
| 778 while (width/2 > 0 && height/2 > 0) { | 778 uint32_t mipLevel = 1; |
| 779 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 0, 1
}; | 779 while (mipLevel < levelCount) { |
| 780 int prevWidth = width; |
| 781 int prevHeight = height; |
| 782 width = SkTMax(1, width / 2); |
| 783 height = SkTMax(1, height / 2); |
| 784 |
| 785 blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel-1, 0,
1 }; |
| 780 blitRegion.srcOffsets[0] = { 0, 0, 0 }; | 786 blitRegion.srcOffsets[0] = { 0, 0, 0 }; |
| 781 blitRegion.srcOffsets[1] = { width, height, 0 }; | 787 blitRegion.srcOffsets[1] = { prevWidth, prevHeight, 0 }; |
| 782 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel+1, 0,
1 }; | 788 blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 0, 1
}; |
| 783 blitRegion.dstOffsets[0] = { 0, 0, 0 }; | 789 blitRegion.dstOffsets[0] = { 0, 0, 0 }; |
| 784 blitRegion.dstOffsets[1] = { width/2, height/2, 0 }; | 790 blitRegion.dstOffsets[1] = { width, height, 0 }; |
| 785 | 791 |
| 786 // TODO: insert image barrier to wait on previous blit | 792 tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, |
| 787 // TODO: change layout of src subresource to TRANSFER_SRC_OPTIMAL | 793 srcAccessMask, dstAccessMask, srcStageMask, dstStage
Mask, |
| 794 mipLevel-1, 1, false); |
| 788 | 795 |
| 789 fCurrentCmdBuffer->blitImage(this, | 796 fCurrentCmdBuffer->blitImage(this, |
| 790 tex->resource(), | 797 tex->resource(), |
| 791 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | 798 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, |
| 792 tex->resource(), | 799 tex->resource(), |
| 793 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | 800 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, |
| 794 1, | 801 1, |
| 795 &blitRegion, | 802 &blitRegion, |
| 796 VK_FILTER_LINEAR); | 803 VK_FILTER_LINEAR); |
| 797 | 804 ++mipLevel; |
| 798 width /= 2; | |
| 799 height /= 2; | |
| 800 mipLevel++; | |
| 801 } | 805 } |
| 802 | 806 |
| 803 oldResource->unref(this); | 807 oldResource->unref(this); |
| 804 } | 808 } |
| 805 | 809 |
| 806 | 810 |
| 807 | |
| 808 //////////////////////////////////////////////////////////////////////////////// | 811 //////////////////////////////////////////////////////////////////////////////// |
| 809 | 812 |
| 810 void GrVkGpu::bindGeometry(const GrPrimitiveProcessor& primProc, | 813 void GrVkGpu::bindGeometry(const GrPrimitiveProcessor& primProc, |
| 811 const GrNonInstancedMesh& mesh) { | 814 const GrNonInstancedMesh& mesh) { |
| 812 // There is no need to put any memory barriers to make sure host writes have
finished here. | 815 // There is no need to put any memory barriers to make sure host writes have
finished here. |
| 813 // When a command buffer is submitted to a queue, there is an implicit memor
y barrier that | 816 // When a command buffer is submitted to a queue, there is an implicit memor
y barrier that |
| 814 // occurs for all host writes. Additionally, BufferMemoryBarriers are not al
lowed inside of | 817 // occurs for all host writes. Additionally, BufferMemoryBarriers are not al
lowed inside of |
| 815 // an active RenderPass. | 818 // an active RenderPass. |
| 816 GrVkVertexBuffer* vbuf; | 819 GrVkVertexBuffer* vbuf; |
| 817 vbuf = (GrVkVertexBuffer*)mesh.vertexBuffer(); | 820 vbuf = (GrVkVertexBuffer*)mesh.vertexBuffer(); |
| (...skipping 986 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1804 aglSwapBuffers(aglGetCurrentContext()); | 1807 aglSwapBuffers(aglGetCurrentContext()); |
| 1805 int set_a_break_pt_here = 9; | 1808 int set_a_break_pt_here = 9; |
| 1806 aglSwapBuffers(aglGetCurrentContext()); | 1809 aglSwapBuffers(aglGetCurrentContext()); |
| 1807 #elif defined(SK_BUILD_FOR_WIN32) | 1810 #elif defined(SK_BUILD_FOR_WIN32) |
| 1808 SwapBuf(); | 1811 SwapBuf(); |
| 1809 int set_a_break_pt_here = 9; | 1812 int set_a_break_pt_here = 9; |
| 1810 SwapBuf(); | 1813 SwapBuf(); |
| 1811 #endif | 1814 #endif |
| 1812 #endif | 1815 #endif |
| 1813 } | 1816 } |
| OLD | NEW |