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->clearStencilImage(this, vkStencil, &vkStencilColor, 1, &s ubRange); | |
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 guarrante that we preserve all bit s in the stencil | |
jvanverth1
2016/03/01 18:49:10
guarantee
egdaniel
2016/03/01 20:34:38
Done.
| |
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 |