| 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 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 imageDesc.fLevels = 1; | 513 imageDesc.fLevels = 1; |
| 514 imageDesc.fSamples = 1; | 514 imageDesc.fSamples = 1; |
| 515 imageDesc.fImageTiling = linearTiling ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TI
LING_OPTIMAL; | 515 imageDesc.fImageTiling = linearTiling ? VK_IMAGE_TILING_LINEAR : VK_IMAGE_TI
LING_OPTIMAL; |
| 516 imageDesc.fUsageFlags = usageFlags; | 516 imageDesc.fUsageFlags = usageFlags; |
| 517 imageDesc.fMemProps = memProps; | 517 imageDesc.fMemProps = memProps; |
| 518 | 518 |
| 519 GrVkTexture* tex; | 519 GrVkTexture* tex; |
| 520 if (renderTarget) { | 520 if (renderTarget) { |
| 521 tex = GrVkTextureRenderTarget::CreateNewTextureRenderTarget(this, desc,
lifeCycle, | 521 tex = GrVkTextureRenderTarget::CreateNewTextureRenderTarget(this, desc,
lifeCycle, |
| 522 imageDesc); | 522 imageDesc); |
| 523 #if 0 |
| 524 // This clear can be included to fix warning described in htttps://bugs.
skia.org/5045 |
| 525 // Obviously we do not want to be clearling needlessly every time we cre
ate a render target. |
| 526 SkIRect rect = SkIRect::MakeWH(tex->width(), tex->height()); |
| 527 this->clear(rect, GrColor_TRANSPARENT_BLACK, tex->asRenderTarget()); |
| 528 #endif |
| 523 } else { | 529 } else { |
| 524 tex = GrVkTexture::CreateNewTexture(this, desc, lifeCycle, imageDesc); | 530 tex = GrVkTexture::CreateNewTexture(this, desc, lifeCycle, imageDesc); |
| 525 } | 531 } |
| 526 | 532 |
| 527 if (!tex) { | 533 if (!tex) { |
| 528 return nullptr; | 534 return nullptr; |
| 529 } | 535 } |
| 530 | 536 |
| 531 if (srcData) { | 537 if (srcData) { |
| 532 if (!this->uploadTexData(tex, 0, 0, desc.fWidth, desc.fHeight, desc.fCon
fig, srcData, | 538 if (!this->uploadTexData(tex, 0, 0, desc.fWidth, desc.fHeight, desc.fCon
fig, srcData, |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 875 byRegion, | 881 byRegion, |
| 876 GrVkCommandBuffer::kImageMemory_BarrierTy
pe, | 882 GrVkCommandBuffer::kImageMemory_BarrierTy
pe, |
| 877 barrier); | 883 barrier); |
| 878 } | 884 } |
| 879 | 885 |
| 880 void GrVkGpu::finishDrawTarget() { | 886 void GrVkGpu::finishDrawTarget() { |
| 881 // Submit the current command buffer to the Queue | 887 // Submit the current command buffer to the Queue |
| 882 this->submitCommandBuffer(kSkip_SyncQueue); | 888 this->submitCommandBuffer(kSkip_SyncQueue); |
| 883 } | 889 } |
| 884 | 890 |
| 891 void GrVkGpu::clearStencil(GrRenderTarget* target) { |
| 892 if (nullptr == target) { |
| 893 return; |
| 894 } |
| 895 GrStencilAttachment* stencil = target->renderTargetPriv().getStencilAttachme
nt(); |
| 896 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil; |
| 897 |
| 898 |
| 899 VkClearDepthStencilValue vkStencilColor; |
| 900 memset(&vkStencilColor, 0, sizeof(VkClearDepthStencilValue)); |
| 901 |
| 902 VkImageLayout origDstLayout = vkStencil->currentLayout(); |
| 903 |
| 904 VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(o
rigDstLayout); |
| 905 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; |
| 906 |
| 907 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayou
t);; |
| 908 VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; |
| 909 |
| 910 vkStencil->setImageLayout(this, |
| 911 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, |
| 912 srcAccessMask, |
| 913 dstAccessMask, |
| 914 srcStageMask, |
| 915 dstStageMask, |
| 916 false); |
| 917 |
| 918 |
| 919 VkImageSubresourceRange subRange; |
| 920 memset(&subRange, 0, sizeof(VkImageSubresourceRange)); |
| 921 subRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; |
| 922 subRange.baseMipLevel = 0; |
| 923 subRange.levelCount = 1; |
| 924 subRange.baseArrayLayer = 0; |
| 925 subRange.layerCount = 1; |
| 926 |
| 927 // TODO: I imagine that most times we want to clear a stencil it will be at
the beginning of a |
| 928 // draw. Thus we should look into using the load op functions on the render
pass to clear out |
| 929 // the stencil there. |
| 930 fCurrentCmdBuffer->clearDepthStencilImage(this, vkStencil, &vkStencilColor,
1, &subRange); |
| 931 } |
| 932 |
| 933 void GrVkGpu::onClearStencilClip(GrRenderTarget* target, const SkIRect& rect, bo
ol insideClip) { |
| 934 SkASSERT(target); |
| 935 |
| 936 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target); |
| 937 GrStencilAttachment* sb = target->renderTargetPriv().getStencilAttachment(); |
| 938 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)sb; |
| 939 |
| 940 // this should only be called internally when we know we have a |
| 941 // stencil buffer. |
| 942 SkASSERT(sb); |
| 943 int stencilBitCount = sb->bits(); |
| 944 |
| 945 // The contract with the callers does not guarantee that we preserve all bit
s in the stencil |
| 946 // during this clear. Thus we will clear the entire stencil to the desired v
alue. |
| 947 |
| 948 VkClearDepthStencilValue vkStencilColor; |
| 949 memset(&vkStencilColor, 0, sizeof(VkClearDepthStencilValue)); |
| 950 if (insideClip) { |
| 951 vkStencilColor.stencil = (1 << (stencilBitCount - 1)); |
| 952 } else { |
| 953 vkStencilColor.stencil = 0; |
| 954 } |
| 955 |
| 956 VkImageLayout origDstLayout = vkStencil->currentLayout(); |
| 957 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayou
t); |
| 958 VkAccessFlags dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; |
| 959 VkPipelineStageFlags srcStageMask = |
| 960 GrVkMemory::LayoutToPipelineStageFlags(origDstLayout); |
| 961 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; |
| 962 vkStencil->setImageLayout(this, |
| 963 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, |
| 964 srcAccessMask, |
| 965 dstAccessMask, |
| 966 srcStageMask, |
| 967 dstStageMask, |
| 968 false); |
| 969 |
| 970 VkClearRect clearRect; |
| 971 // Flip rect if necessary |
| 972 SkIRect vkRect = rect; |
| 973 |
| 974 if (kBottomLeft_GrSurfaceOrigin == vkRT->origin()) { |
| 975 vkRect.fTop = vkRT->height() - rect.fBottom; |
| 976 vkRect.fBottom = vkRT->height() - rect.fTop; |
| 977 } |
| 978 |
| 979 clearRect.rect.offset = { vkRect.fLeft, vkRect.fTop }; |
| 980 clearRect.rect.extent = { (uint32_t)vkRect.width(), (uint32_t)vkRect.height(
) }; |
| 981 |
| 982 clearRect.baseArrayLayer = 0; |
| 983 clearRect.layerCount = 1; |
| 984 |
| 985 const GrVkRenderPass* renderPass = vkRT->simpleRenderPass(); |
| 986 SkASSERT(renderPass); |
| 987 fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT); |
| 988 |
| 989 uint32_t stencilIndex; |
| 990 SkAssertResult(renderPass->stencilAttachmentIndex(&stencilIndex)); |
| 991 |
| 992 VkClearAttachment attachment; |
| 993 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; |
| 994 attachment.colorAttachment = 0; // this value shouldn't matter |
| 995 attachment.clearValue.depthStencil = vkStencilColor; |
| 996 |
| 997 fCurrentCmdBuffer->clearAttachments(this, 1, &attachment, 1, &clearRect); |
| 998 fCurrentCmdBuffer->endRenderPass(this); |
| 999 |
| 1000 return; |
| 1001 } |
| 1002 |
| 885 void GrVkGpu::onClear(GrRenderTarget* target, const SkIRect& rect, GrColor color
) { | 1003 void GrVkGpu::onClear(GrRenderTarget* target, const SkIRect& rect, GrColor color
) { |
| 886 // parent class should never let us get here with no RT | 1004 // parent class should never let us get here with no RT |
| 887 SkASSERT(target); | 1005 SkASSERT(target); |
| 888 | 1006 |
| 889 VkClearColorValue vkColor; | 1007 VkClearColorValue vkColor; |
| 890 GrColorToRGBAFloat(color, vkColor.float32); | 1008 GrColorToRGBAFloat(color, vkColor.float32); |
| 891 | 1009 |
| 892 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target); | 1010 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target); |
| 893 VkImageLayout origDstLayout = vkRT->currentLayout(); | 1011 VkImageLayout origDstLayout = vkRT->currentLayout(); |
| 894 | 1012 |
| 895 if (rect.width() != target->width() || rect.height() != target->height()) { | 1013 if (rect.width() != target->width() || rect.height() != target->height()) { |
| 896 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstL
ayout); | 1014 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstL
ayout); |
| 897 VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; | 1015 VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 898 VkPipelineStageFlags srcStageMask = | 1016 VkPipelineStageFlags srcStageMask = |
| 899 GrVkMemory::LayoutToPipelineStageFlags(vkRT->currentLayout()); | 1017 GrVkMemory::LayoutToPipelineStageFlags(origDstLayout); |
| 900 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; | 1018 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; |
| 901 vkRT->setImageLayout(this, | 1019 vkRT->setImageLayout(this, |
| 902 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | 1020 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, |
| 903 srcAccessMask, | 1021 srcAccessMask, |
| 904 dstAccessMask, | 1022 dstAccessMask, |
| 905 srcStageMask, | 1023 srcStageMask, |
| 906 dstStageMask, | 1024 dstStageMask, |
| 907 false); | 1025 false); |
| 908 | 1026 |
| 909 VkClearRect clearRect; | 1027 VkClearRect clearRect; |
| 910 clearRect.rect.offset = { rect.fLeft, rect.fTop }; | 1028 // Flip rect if necessary |
| 911 clearRect.rect.extent = { (uint32_t)rect.width(), (uint32_t)rect.height(
) }; | 1029 SkIRect vkRect = rect; |
| 912 clearRect.baseArrayLayer = 0; | 1030 if (kBottomLeft_GrSurfaceOrigin == vkRT->origin()) { |
| 913 clearRect.layerCount = 1; | 1031 vkRect.fTop = vkRT->height() - rect.fBottom; |
| 914 | 1032 vkRect.fBottom = vkRT->height() - rect.fTop; |
| 915 | 1033 } |
| 1034 clearRect.rect.offset = { vkRect.fLeft, vkRect.fTop }; |
| 1035 clearRect.rect.extent = { (uint32_t)vkRect.width(), (uint32_t)vkRect.hei
ght() }; |
| 916 | 1036 |
| 917 const GrVkRenderPass* renderPass = vkRT->simpleRenderPass(); | 1037 const GrVkRenderPass* renderPass = vkRT->simpleRenderPass(); |
| 918 SkASSERT(renderPass); | 1038 SkASSERT(renderPass); |
| 919 fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT); | 1039 fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT); |
| 920 | 1040 |
| 921 uint32_t colorIndex; | 1041 uint32_t colorIndex; |
| 922 SkAssertResult(renderPass->colorAttachmentIndex(&colorIndex)); | 1042 SkAssertResult(renderPass->colorAttachmentIndex(&colorIndex)); |
| 923 | 1043 |
| 924 VkClearAttachment attachment; | 1044 VkClearAttachment attachment; |
| 925 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | 1045 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 | 1314 |
| 1195 return true; | 1315 return true; |
| 1196 } | 1316 } |
| 1197 | 1317 |
| 1198 void GrVkGpu::onDraw(const DrawArgs& args, const GrNonInstancedVertices& vertice
s) { | 1318 void GrVkGpu::onDraw(const DrawArgs& args, const GrNonInstancedVertices& vertice
s) { |
| 1199 GrRenderTarget* rt = args.fPipeline->getRenderTarget(); | 1319 GrRenderTarget* rt = args.fPipeline->getRenderTarget(); |
| 1200 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(rt); | 1320 GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(rt); |
| 1201 const GrVkRenderPass* renderPass = vkRT->simpleRenderPass(); | 1321 const GrVkRenderPass* renderPass = vkRT->simpleRenderPass(); |
| 1202 SkASSERT(renderPass); | 1322 SkASSERT(renderPass); |
| 1203 | 1323 |
| 1204 | |
| 1205 GrVkProgram* program = GrVkProgramBuilder::CreateProgram(this, args, | 1324 GrVkProgram* program = GrVkProgramBuilder::CreateProgram(this, args, |
| 1206 vertices.primitiveT
ype(), | 1325 vertices.primitiveT
ype(), |
| 1207 *renderPass); | 1326 *renderPass); |
| 1208 | 1327 |
| 1209 if (!program) { | 1328 if (!program) { |
| 1210 return; | 1329 return; |
| 1211 } | 1330 } |
| 1212 | 1331 |
| 1213 program->setData(this, *args.fPrimitiveProcessor, *args.fPipeline); | 1332 program->setData(this, *args.fPrimitiveProcessor, *args.fPipeline); |
| 1214 | 1333 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1227 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout); | 1346 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout); |
| 1228 VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; | 1347 VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
| 1229 vkRT->setImageLayout(this, | 1348 vkRT->setImageLayout(this, |
| 1230 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, | 1349 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, |
| 1231 srcAccessMask, | 1350 srcAccessMask, |
| 1232 dstAccessMask, | 1351 dstAccessMask, |
| 1233 srcStageMask, | 1352 srcStageMask, |
| 1234 dstStageMask, | 1353 dstStageMask, |
| 1235 false); | 1354 false); |
| 1236 | 1355 |
| 1356 // If we are using a stencil attachment we also need to update its layout |
| 1357 if (!args.fPipeline->getStencil().isDisabled()) { |
| 1358 GrStencilAttachment* stencil = vkRT->renderTargetPriv().getStencilAttach
ment(); |
| 1359 GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil; |
| 1360 VkImageLayout origDstLayout = vkStencil->currentLayout(); |
| 1361 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstL
ayout); |
| 1362 VkAccessFlags dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_B
IT | |
| 1363 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BI
T; |
| 1364 VkPipelineStageFlags srcStageMask = |
| 1365 GrVkMemory::LayoutToPipelineStageFlags(origDstLayout); |
| 1366 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; |
| 1367 vkStencil->setImageLayout(this, |
| 1368 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIM
AL, |
| 1369 srcAccessMask, |
| 1370 dstAccessMask, |
| 1371 srcStageMask, |
| 1372 dstStageMask, |
| 1373 false); |
| 1374 } |
| 1375 |
| 1237 if (vertices.isIndexed()) { | 1376 if (vertices.isIndexed()) { |
| 1238 fCurrentCmdBuffer->drawIndexed(this, | 1377 fCurrentCmdBuffer->drawIndexed(this, |
| 1239 vertices.indexCount(), | 1378 vertices.indexCount(), |
| 1240 1, | 1379 1, |
| 1241 vertices.startIndex(), | 1380 vertices.startIndex(), |
| 1242 vertices.startVertex(), | 1381 vertices.startVertex(), |
| 1243 0); | 1382 0); |
| 1244 } else { | 1383 } else { |
| 1245 fCurrentCmdBuffer->draw(this, vertices.vertexCount(), 1, vertices.startV
ertex(), 0); | 1384 fCurrentCmdBuffer->draw(this, vertices.vertexCount(), 1, vertices.startV
ertex(), 0); |
| 1246 } | 1385 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1263 int set_a_break_pt_here = 9; | 1402 int set_a_break_pt_here = 9; |
| 1264 aglSwapBuffers(aglGetCurrentContext()); | 1403 aglSwapBuffers(aglGetCurrentContext()); |
| 1265 #elif defined(SK_BUILD_FOR_WIN32) | 1404 #elif defined(SK_BUILD_FOR_WIN32) |
| 1266 SwapBuf(); | 1405 SwapBuf(); |
| 1267 int set_a_break_pt_here = 9; | 1406 int set_a_break_pt_here = 9; |
| 1268 SwapBuf(); | 1407 SwapBuf(); |
| 1269 #endif | 1408 #endif |
| 1270 #endif | 1409 #endif |
| 1271 } | 1410 } |
| 1272 | 1411 |
| OLD | NEW |