| 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 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 } else { | 480 } else { |
| 481 // If there is no padding on the src (rowBytes) or dst (layout.rowPitch)
we can memcpy | 481 // If there is no padding on the src (rowBytes) or dst (layout.rowPitch)
we can memcpy |
| 482 if (trimRowBytes == rowBytes && trimRowBytes == layout.rowPitch) { | 482 if (trimRowBytes == rowBytes && trimRowBytes == layout.rowPitch) { |
| 483 memcpy(mapPtr, data, trimRowBytes * height); | 483 memcpy(mapPtr, data, trimRowBytes * height); |
| 484 } else { | 484 } else { |
| 485 SkRectMemcpy(mapPtr, static_cast<size_t>(layout.rowPitch), data, row
Bytes, trimRowBytes, | 485 SkRectMemcpy(mapPtr, static_cast<size_t>(layout.rowPitch), data, row
Bytes, trimRowBytes, |
| 486 height); | 486 height); |
| 487 } | 487 } |
| 488 } | 488 } |
| 489 | 489 |
| 490 GrVkMemory::FlushMappedAlloc(this, alloc); |
| 490 GR_VK_CALL(interface, UnmapMemory(fDevice, alloc.fMemory)); | 491 GR_VK_CALL(interface, UnmapMemory(fDevice, alloc.fMemory)); |
| 491 | 492 |
| 492 return true; | 493 return true; |
| 493 } | 494 } |
| 494 | 495 |
| 495 bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex, | 496 bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex, |
| 496 int left, int top, int width, int height, | 497 int left, int top, int width, int height, |
| 497 GrPixelConfig dataConfig, | 498 GrPixelConfig dataConfig, |
| 498 const SkTArray<GrMipLevel>& texels) { | 499 const SkTArray<GrMipLevel>& texels) { |
| 499 SkASSERT(!tex->isLinearTiled()); | 500 SkASSERT(!tex->isLinearTiled()); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 592 region.bufferRowLength = currentWidth; | 593 region.bufferRowLength = currentWidth; |
| 593 region.bufferImageHeight = currentHeight; | 594 region.bufferImageHeight = currentHeight; |
| 594 region.imageSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, SkToU32(currentMi
pLevel), 0, 1 }; | 595 region.imageSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, SkToU32(currentMi
pLevel), 0, 1 }; |
| 595 region.imageOffset = { left, flipY ? tex->height() - top - currentHeight
: top, 0 }; | 596 region.imageOffset = { left, flipY ? tex->height() - top - currentHeight
: top, 0 }; |
| 596 region.imageExtent = { (uint32_t)currentWidth, (uint32_t)currentHeight,
1 }; | 597 region.imageExtent = { (uint32_t)currentWidth, (uint32_t)currentHeight,
1 }; |
| 597 | 598 |
| 598 currentWidth = SkTMax(1, currentWidth/2); | 599 currentWidth = SkTMax(1, currentWidth/2); |
| 599 currentHeight = SkTMax(1, currentHeight/2); | 600 currentHeight = SkTMax(1, currentHeight/2); |
| 600 } | 601 } |
| 601 | 602 |
| 603 // no need to flush non-coherent memory, unmap will do that for us |
| 602 transferBuffer->unmap(); | 604 transferBuffer->unmap(); |
| 603 | 605 |
| 604 // make sure the unmap has finished | 606 // make sure the unmap has finished |
| 605 transferBuffer->addMemoryBarrier(this, | 607 transferBuffer->addMemoryBarrier(this, |
| 606 VK_ACCESS_HOST_WRITE_BIT, | 608 VK_ACCESS_HOST_WRITE_BIT, |
| 607 VK_ACCESS_TRANSFER_READ_BIT, | 609 VK_ACCESS_TRANSFER_READ_BIT, |
| 608 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, | 610 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, |
| 609 VK_PIPELINE_STAGE_TRANSFER_BIT, | 611 VK_PIPELINE_STAGE_TRANSFER_BIT, |
| 610 false); | 612 false); |
| 611 | 613 |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 957 width, | 959 width, |
| 958 height, | 960 height, |
| 959 samples, | 961 samples, |
| 960 sFmt)); | 962 sFmt)); |
| 961 fStats.incStencilAttachmentCreates(); | 963 fStats.incStencilAttachmentCreates(); |
| 962 return stencil; | 964 return stencil; |
| 963 } | 965 } |
| 964 | 966 |
| 965 //////////////////////////////////////////////////////////////////////////////// | 967 //////////////////////////////////////////////////////////////////////////////// |
| 966 | 968 |
| 967 bool copy_testing_data(GrVkGpu* gpu, void* srcData, GrVkAlloc* alloc, | 969 bool copy_testing_data(GrVkGpu* gpu, void* srcData, const GrVkAlloc& alloc, |
| 968 size_t srcRowBytes, size_t dstRowBytes, int h) { | 970 size_t srcRowBytes, size_t dstRowBytes, int h) { |
| 969 void* mapPtr; | 971 void* mapPtr; |
| 970 VkResult err = GR_VK_CALL(gpu->vkInterface(), MapMemory(gpu->device(), | 972 VkResult err = GR_VK_CALL(gpu->vkInterface(), MapMemory(gpu->device(), |
| 971 alloc->fMemory, | 973 alloc.fMemory, |
| 972 alloc->fOffset, | 974 alloc.fOffset, |
| 973 dstRowBytes * h, | 975 dstRowBytes * h, |
| 974 0, | 976 0, |
| 975 &mapPtr)); | 977 &mapPtr)); |
| 976 if (err) { | 978 if (err) { |
| 977 return false; | 979 return false; |
| 978 } | 980 } |
| 979 | 981 |
| 980 // If there is no padding on dst we can do a single memcopy. | 982 // If there is no padding on dst we can do a single memcopy. |
| 981 // This assumes the srcData comes in with no padding. | 983 // This assumes the srcData comes in with no padding. |
| 982 if (srcRowBytes == dstRowBytes) { | 984 if (srcRowBytes == dstRowBytes) { |
| 983 memcpy(mapPtr, srcData, srcRowBytes * h); | 985 memcpy(mapPtr, srcData, srcRowBytes * h); |
| 984 } else { | 986 } else { |
| 985 SkRectMemcpy(mapPtr, static_cast<size_t>(dstRowBytes), srcData, srcRowBy
tes, | 987 SkRectMemcpy(mapPtr, static_cast<size_t>(dstRowBytes), srcData, srcRowBy
tes, |
| 986 srcRowBytes, h); | 988 srcRowBytes, h); |
| 987 } | 989 } |
| 988 GR_VK_CALL(gpu->vkInterface(), UnmapMemory(gpu->device(), alloc->fMemory)); | 990 GrVkMemory::FlushMappedAlloc(gpu, alloc); |
| 991 GR_VK_CALL(gpu->vkInterface(), UnmapMemory(gpu->device(), alloc.fMemory)); |
| 989 return true; | 992 return true; |
| 990 } | 993 } |
| 991 | 994 |
| 992 GrBackendObject GrVkGpu::createTestingOnlyBackendTexture(void* srcData, int w, i
nt h, | 995 GrBackendObject GrVkGpu::createTestingOnlyBackendTexture(void* srcData, int w, i
nt h, |
| 993 GrPixelConfig config, | 996 GrPixelConfig config, |
| 994 bool isRenderTarget) { | 997 bool isRenderTarget) { |
| 995 | 998 |
| 996 VkFormat pixelFormat; | 999 VkFormat pixelFormat; |
| 997 if (!GrPixelConfigToVkFormat(config, &pixelFormat)) { | 1000 if (!GrPixelConfigToVkFormat(config, &pixelFormat)) { |
| 998 return 0; | 1001 return 0; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1013 } | 1016 } |
| 1014 | 1017 |
| 1015 VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_SAMPLED_BIT; | 1018 VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_SAMPLED_BIT; |
| 1016 usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; | 1019 usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; |
| 1017 usageFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; | 1020 usageFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; |
| 1018 if (isRenderTarget) { | 1021 if (isRenderTarget) { |
| 1019 usageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; | 1022 usageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; |
| 1020 } | 1023 } |
| 1021 | 1024 |
| 1022 VkImage image = VK_NULL_HANDLE; | 1025 VkImage image = VK_NULL_HANDLE; |
| 1023 GrVkAlloc alloc = { VK_NULL_HANDLE, 0, 0 }; | 1026 GrVkAlloc alloc = { VK_NULL_HANDLE, 0, 0, 0 }; |
| 1024 | 1027 |
| 1025 VkImageTiling imageTiling = linearTiling ? VK_IMAGE_TILING_LINEAR : VK_IMAGE
_TILING_OPTIMAL; | 1028 VkImageTiling imageTiling = linearTiling ? VK_IMAGE_TILING_LINEAR : VK_IMAGE
_TILING_OPTIMAL; |
| 1026 VkImageLayout initialLayout = (VK_IMAGE_TILING_LINEAR == imageTiling) | 1029 VkImageLayout initialLayout = (VK_IMAGE_TILING_LINEAR == imageTiling) |
| 1027 ? VK_IMAGE_LAYOUT_PREINITIALIZED | 1030 ? VK_IMAGE_LAYOUT_PREINITIALIZED |
| 1028 : VK_IMAGE_LAYOUT_UNDEFINED; | 1031 : VK_IMAGE_LAYOUT_UNDEFINED; |
| 1029 | 1032 |
| 1030 // Create Image | 1033 // Create Image |
| 1031 VkSampleCountFlagBits vkSamples; | 1034 VkSampleCountFlagBits vkSamples; |
| 1032 if (!GrSampleCountToVkSampleCount(1, &vkSamples)) { | 1035 if (!GrSampleCountToVkSampleCount(1, &vkSamples)) { |
| 1033 return 0; | 1036 return 0; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1064 if (linearTiling) { | 1067 if (linearTiling) { |
| 1065 const VkImageSubresource subres = { | 1068 const VkImageSubresource subres = { |
| 1066 VK_IMAGE_ASPECT_COLOR_BIT, | 1069 VK_IMAGE_ASPECT_COLOR_BIT, |
| 1067 0, // mipLevel | 1070 0, // mipLevel |
| 1068 0, // arraySlice | 1071 0, // arraySlice |
| 1069 }; | 1072 }; |
| 1070 VkSubresourceLayout layout; | 1073 VkSubresourceLayout layout; |
| 1071 | 1074 |
| 1072 VK_CALL(GetImageSubresourceLayout(fDevice, image, &subres, &layout))
; | 1075 VK_CALL(GetImageSubresourceLayout(fDevice, image, &subres, &layout))
; |
| 1073 | 1076 |
| 1074 if (!copy_testing_data(this, srcData, &alloc, rowCopyBytes, | 1077 if (!copy_testing_data(this, srcData, alloc, rowCopyBytes, |
| 1075 static_cast<size_t>(layout.rowPitch), h)) { | 1078 static_cast<size_t>(layout.rowPitch), h)) { |
| 1076 GrVkMemory::FreeImageMemory(this, linearTiling, alloc); | 1079 GrVkMemory::FreeImageMemory(this, linearTiling, alloc); |
| 1077 VK_CALL(DestroyImage(fDevice, image, nullptr)); | 1080 VK_CALL(DestroyImage(fDevice, image, nullptr)); |
| 1078 return 0; | 1081 return 0; |
| 1079 } | 1082 } |
| 1080 } else { | 1083 } else { |
| 1081 SkASSERT(w && h); | 1084 SkASSERT(w && h); |
| 1082 | 1085 |
| 1083 VkBuffer buffer; | 1086 VkBuffer buffer; |
| 1084 VkBufferCreateInfo bufInfo; | 1087 VkBufferCreateInfo bufInfo; |
| 1085 memset(&bufInfo, 0, sizeof(VkBufferCreateInfo)); | 1088 memset(&bufInfo, 0, sizeof(VkBufferCreateInfo)); |
| 1086 bufInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; | 1089 bufInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; |
| 1087 bufInfo.flags = 0; | 1090 bufInfo.flags = 0; |
| 1088 bufInfo.size = rowCopyBytes * h; | 1091 bufInfo.size = rowCopyBytes * h; |
| 1089 bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; | 1092 bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; |
| 1090 bufInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; | 1093 bufInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; |
| 1091 bufInfo.queueFamilyIndexCount = 0; | 1094 bufInfo.queueFamilyIndexCount = 0; |
| 1092 bufInfo.pQueueFamilyIndices = nullptr; | 1095 bufInfo.pQueueFamilyIndices = nullptr; |
| 1093 VkResult err; | 1096 VkResult err; |
| 1094 err = VK_CALL(CreateBuffer(fDevice, &bufInfo, nullptr, &buffer)); | 1097 err = VK_CALL(CreateBuffer(fDevice, &bufInfo, nullptr, &buffer)); |
| 1095 | 1098 |
| 1096 if (err) { | 1099 if (err) { |
| 1097 GrVkMemory::FreeImageMemory(this, linearTiling, alloc); | 1100 GrVkMemory::FreeImageMemory(this, linearTiling, alloc); |
| 1098 VK_CALL(DestroyImage(fDevice, image, nullptr)); | 1101 VK_CALL(DestroyImage(fDevice, image, nullptr)); |
| 1099 return 0; | 1102 return 0; |
| 1100 } | 1103 } |
| 1101 | 1104 |
| 1102 GrVkAlloc bufferAlloc = { VK_NULL_HANDLE, 0, 0 }; | 1105 GrVkAlloc bufferAlloc = { VK_NULL_HANDLE, 0, 0, 0 }; |
| 1103 if (!GrVkMemory::AllocAndBindBufferMemory(this, buffer, GrVkBuffer::
kCopyRead_Type, | 1106 if (!GrVkMemory::AllocAndBindBufferMemory(this, buffer, GrVkBuffer::
kCopyRead_Type, |
| 1104 true, &bufferAlloc)) { | 1107 true, &bufferAlloc)) { |
| 1105 GrVkMemory::FreeImageMemory(this, linearTiling, alloc); | 1108 GrVkMemory::FreeImageMemory(this, linearTiling, alloc); |
| 1106 VK_CALL(DestroyImage(fDevice, image, nullptr)); | 1109 VK_CALL(DestroyImage(fDevice, image, nullptr)); |
| 1107 VK_CALL(DestroyBuffer(fDevice, buffer, nullptr)); | 1110 VK_CALL(DestroyBuffer(fDevice, buffer, nullptr)); |
| 1108 return 0; | 1111 return 0; |
| 1109 } | 1112 } |
| 1110 | 1113 |
| 1111 if (!copy_testing_data(this, srcData, &bufferAlloc, rowCopyBytes, ro
wCopyBytes, h)) { | 1114 if (!copy_testing_data(this, srcData, bufferAlloc, rowCopyBytes, row
CopyBytes, h)) { |
| 1112 GrVkMemory::FreeImageMemory(this, linearTiling, alloc); | 1115 GrVkMemory::FreeImageMemory(this, linearTiling, alloc); |
| 1113 VK_CALL(DestroyImage(fDevice, image, nullptr)); | 1116 VK_CALL(DestroyImage(fDevice, image, nullptr)); |
| 1114 GrVkMemory::FreeBufferMemory(this, GrVkBuffer::kCopyRead_Type, b
ufferAlloc); | 1117 GrVkMemory::FreeBufferMemory(this, GrVkBuffer::kCopyRead_Type, b
ufferAlloc); |
| 1115 VK_CALL(DestroyBuffer(fDevice, buffer, nullptr)); | 1118 VK_CALL(DestroyBuffer(fDevice, buffer, nullptr)); |
| 1116 return 0; | 1119 return 0; |
| 1117 } | 1120 } |
| 1118 | 1121 |
| 1119 const VkCommandBufferAllocateInfo cmdInfo = { | 1122 const VkCommandBufferAllocateInfo cmdInfo = { |
| 1120 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType | 1123 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType |
| 1121 NULL, // pNext | 1124 NULL, // pNext |
| (...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1750 transferBuffer->addMemoryBarrier(this, | 1753 transferBuffer->addMemoryBarrier(this, |
| 1751 VK_ACCESS_TRANSFER_WRITE_BIT, | 1754 VK_ACCESS_TRANSFER_WRITE_BIT, |
| 1752 VK_ACCESS_HOST_READ_BIT, | 1755 VK_ACCESS_HOST_READ_BIT, |
| 1753 VK_PIPELINE_STAGE_TRANSFER_BIT, | 1756 VK_PIPELINE_STAGE_TRANSFER_BIT, |
| 1754 VK_PIPELINE_STAGE_HOST_BIT, | 1757 VK_PIPELINE_STAGE_HOST_BIT, |
| 1755 false); | 1758 false); |
| 1756 | 1759 |
| 1757 // We need to submit the current command buffer to the Queue and make sure i
t finishes before | 1760 // We need to submit the current command buffer to the Queue and make sure i
t finishes before |
| 1758 // we can copy the data out of the buffer. | 1761 // we can copy the data out of the buffer. |
| 1759 this->submitCommandBuffer(kForce_SyncQueue); | 1762 this->submitCommandBuffer(kForce_SyncQueue); |
| 1760 | 1763 GrVkMemory::InvalidateMappedAlloc(this, transferBuffer->alloc()); |
| 1761 void* mappedMemory = transferBuffer->map(); | 1764 void* mappedMemory = transferBuffer->map(); |
| 1762 | 1765 |
| 1763 if (copyFromOrigin) { | 1766 if (copyFromOrigin) { |
| 1764 uint32_t skipRows = region.imageExtent.height - height; | 1767 uint32_t skipRows = region.imageExtent.height - height; |
| 1765 mappedMemory = (char*)mappedMemory + transBufferRowBytes * skipRows + bp
p * left; | 1768 mappedMemory = (char*)mappedMemory + transBufferRowBytes * skipRows + bp
p * left; |
| 1766 } | 1769 } |
| 1767 | 1770 |
| 1768 if (flipY) { | 1771 if (flipY) { |
| 1769 const char* srcRow = reinterpret_cast<const char*>(mappedMemory); | 1772 const char* srcRow = reinterpret_cast<const char*>(mappedMemory); |
| 1770 char* dstRow = reinterpret_cast<char*>(buffer)+(height - 1) * rowBytes; | 1773 char* dstRow = reinterpret_cast<char*>(buffer)+(height - 1) * rowBytes; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1849 // Currently it is fine for us to always pass in 1 for the clear count even
if no attachment | 1852 // Currently it is fine for us to always pass in 1 for the clear count even
if no attachment |
| 1850 // uses it. In the current state, we also only use the LOAD_OP_CLEAR for the
color attachment | 1853 // uses it. In the current state, we also only use the LOAD_OP_CLEAR for the
color attachment |
| 1851 // which is always at the first attachment. | 1854 // which is always at the first attachment. |
| 1852 fCurrentCmdBuffer->beginRenderPass(this, renderPass, 1, colorClear, *target,
*pBounds, true); | 1855 fCurrentCmdBuffer->beginRenderPass(this, renderPass, 1, colorClear, *target,
*pBounds, true); |
| 1853 fCurrentCmdBuffer->executeCommands(this, buffer); | 1856 fCurrentCmdBuffer->executeCommands(this, buffer); |
| 1854 fCurrentCmdBuffer->endRenderPass(this); | 1857 fCurrentCmdBuffer->endRenderPass(this); |
| 1855 | 1858 |
| 1856 this->didWriteToSurface(target, &bounds); | 1859 this->didWriteToSurface(target, &bounds); |
| 1857 } | 1860 } |
| 1858 | 1861 |
| OLD | NEW |