From dfda2d2622c5a01441176c4561c714b95a18cc10 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Tue, 24 May 2016 20:49:15 +0200 Subject: [PATCH] Use Vulkan result check macro, code cleanup, added text overlay --- data/shaders/radialblur/colorpass.frag.spv | Bin 520 -> 520 bytes data/shaders/radialblur/colorpass.vert | 11 +- data/shaders/radialblur/colorpass.vert.spv | Bin 1572 -> 1236 bytes data/shaders/radialblur/phongpass.frag.spv | Bin 2480 -> 2480 bytes data/shaders/radialblur/phongpass.vert | 5 + data/shaders/radialblur/phongpass.vert.spv | Bin 2232 -> 1896 bytes data/shaders/radialblur/radialblur.frag.spv | Bin 2424 -> 2456 bytes data/shaders/radialblur/radialblur.vert | 5 + data/shaders/radialblur/radialblur.vert.spv | Bin 1640 -> 1304 bytes radialblur/radialblur.cpp | 249 ++++++++------------ 10 files changed, 113 insertions(+), 157 deletions(-) diff --git a/data/shaders/radialblur/colorpass.frag.spv b/data/shaders/radialblur/colorpass.frag.spv index ee8e1330ea1558b70fd32704f39dfad0c8683d8c..7fad085dbc6b361978c60ddb7364518ed34fb629 100644 GIT binary patch delta 28 gcmeBR>0p@0p@= 0.9) - { - outColor = ubo.glowColor.rgb; - } - else*/ { outColor = inColor; } diff --git a/data/shaders/radialblur/colorpass.vert.spv b/data/shaders/radialblur/colorpass.vert.spv index dc4b4d3dc6f7a71fcdc9b4a6f45e5ce2c49dac04..3778d638bce584247b73341f77ce1bb181d1a7a2 100644 GIT binary patch literal 1236 zcmY+C%Wl&^6o!W+4uwKXTYBMEl7<~pRaFHcArLK#bP)*zg01B?BV%wqk?p8m@(S=s zJQW)x{%`CNVWN{c|9|es)9s9|8*@#+CG*5IXU%kkjafE*e~%|0C;L@B-9LJEfX9mI zdPjU#%?+>j^na0L1psDQa!2x5($%k{`?=Sh*ylhnpXhX=Fd{F{lCX|ZM`hPrNEzje7QrFtLw$cl!FG|!4~n#b>L z`Pr7Wy~3~G^61!HmDQOm6yNnTz@y*Q{psYL_ebZN6I2M3-rRzA4K-t#r#BMJVY-w~wF zBBux7=R8#%{OEr%4out|Nr;2{7uV#cHh$kF^b_W$e`ej2Z~`7S&|~Hg^KNJgat)P( zmxjJ2t*?6^*;YPkgRu{Ums%bEWs7+a!G2SE=oveh-NBLXwr=wArgjy@F5$?%s+&A; z#DaO-aGSzwx(5<+J#F#2bk2_OhHi2-xtm?V1)dt4!pzCer~zhYaM-t7otRMLzI1A0 zXLsn-As)<5gMCjr{bGNvuS;I~;lTeE!#95=mL1-bu%FkmvPbZ-Jm_ObLT}87KRw-( zzz3fP(($3k;PX&A{7>Z}=8=Rrczl|DH+}z*4|piSZy+HzbBrYHpZfF%#_x}&eIfY^ D=NeV@ literal 1572 zcmY+DYirYB6vv;nO*e0wbMB(fnzr7BF=UD$in~BJC`=ssHe_w6(JU!RisCE3f_@}F zm2U+9za&rBJ>~2<|NlA9xn}iRcixye{T9qqQ=Vm06E^0GX%=^{f70K|^5NFbi)}m> zO}%i$XGvb1hUCl-WAu&$_L5{p@>udjQrEAh`;Q(rWbO66-4A<@#~ zOHRK8gFL(FBU2cUyvUD76MqzVJI}Yr{@|-|6lpfMBZj=mB;QY>B$ZnDP)`__l%u|u zg-4P1K1e?WX&!vXuUYZv*pe*F!z30vU-;8+!H02v68;GAvo`vYZ9fXf2Vs``@gSJm zm=?B46isc8X2EPY=qbB;RU zxUC;=;FyQy(Bar&PZr{pu^ZDlIO6bUMx1VWUEuT)o9mK8MZ%A~v+uyXdnd86;LhKb z@yU(fPYLx93y$8IX-C4bxLv{mW1F27bEY@yz@PsCa8t6PsKjk62QxrllZMTetjnL; zz}Q{kg-VBiU17d;Yribr_JkcwJ~-lC(@i{Py{f;9x?Kt9S%sIR zmChTRodSNE`)5E3&-um!e;X_Z>=bm)<--^QjJS65Ss$A00T1v3y@~tSZL1)0Csc))Bpeg delta 40 ocmdlWyg_(Eh^#3C0|OTj>jJS65UT;P00T1v3y|j6SZL1)0C(90)c^nh diff --git a/data/shaders/radialblur/phongpass.vert b/data/shaders/radialblur/phongpass.vert index 134f6da5..5f744df3 100644 --- a/data/shaders/radialblur/phongpass.vert +++ b/data/shaders/radialblur/phongpass.vert @@ -18,6 +18,11 @@ layout (location = 1) out vec3 outColor; layout (location = 2) out vec3 outEyePos; layout (location = 3) out vec3 outLightVec; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main() { outNormal = inNormal; diff --git a/data/shaders/radialblur/phongpass.vert.spv b/data/shaders/radialblur/phongpass.vert.spv index 154a901012db2681442b15d08bae9f5921433495..fa3a8ddb1b880b609c033df480dba78d4d77d90f 100644 GIT binary patch literal 1896 zcmZ9L-%b-j6vhYIttbd0^2dKzsEP_AAXF3)!H{~<2x{bZv(QahE!}3jBzkA!6X+B8 zD8{Gq#>DS8yJM=;9OiuA`OcZMXNE$5<%}_X`VE*(ldVzHFKo=9DcQYNe_LPdrj5nb zwIvk8reK9=M$CEZ7xnifh}wX&vOyVU;Y!=tqOuSTJ$-Sk^QyLlQkLw|K;sS_N1FrF&)_TY)3kN7lw6(=V_ zOFkTZMeV*to7jY|27*WJPXV`z}zU9S%B#U%>9A6ua~OI99ZPBYRZJm z;zj!%@SY64``!wqRxhWAXD(PS%j3-6JTQ6BWiAiS<#9IkIh$UY*Q|`?@Jt3RCf57y zyhrzK=$RLoS&XSFb!UXY_!II<+RL&@>FEPZyevGB`|uk%<_)^|Ir*-C;$Y?o=k&}U zy^Aw{;+)5NzSxbP+IWf`^Rb387eH6=WuomyG#>^|Ty z>Q8BB2F#oKVCD@+{7UYlclEE!=RD#wxz8EogJ*M&_$~SL>f+3j`++0Aq@B4Er#^F7 zk+B?pXwml{4zF7Ld22zL_sX&b%-h_}4mzds>je zvmAF{K3rc9x0rLxe_xr*_JNFi^u+0NPCGn4cfq~7ejdq(+taO*zb=ErSe!?Fr++M; o{+<4bd^n8d^k4KX)Z36z6WvhW<5T(Qc4frri}wWoTak6yAL4a=BLDyZ literal 2232 zcmZ9NYflqV5QZ0e0R>S+E-GRH?;s);1d&S%q>wa%68YLJWm8tmZqqJ_`pLv!pufPM zV*FKpG4XxQ?rDmrc{wxh%$b=pb2g;9r+XZyOTS)c%Zb;Z(=FX``kbuUOXb7zTq`=6 z%P-F3G2o<(BR*I4W2J>N*AI~I3j;!*a7nl#JP}re5uqRyg_M5X+J7rhTArnHrSPs; zX?YE|=|*0qb?TmY%}RLu!K+5Ci#{^>L9J4EgW9=U^D6m;`G#Bl=wuYBvzCk)Y6#Dx zH(~S4txJZZHa}=nhNDjTZH4u)DN$V7+`|uIDx-ef5MQfT4!q`(*NnVR_+=9w8C%%$ zBR>qp_85QqWOzS_4*f44e%8kQW!tLzjcvabxk1%y+vqa3^Lo8)%cy7ckcE6p`}^X) z&SZ@Y-)M$(j1t6V3{MSb;fWXDKjn-|KR*sl4Cd7cTaq(oPU^wVXHVA<50}?o_iLw7 zOc{<@%C8K4DR6zGY1yuSeC;dj@@#cfg`r%kl}bMC0U3U$4>%T>6l9{NW}fF-IE%8=&rC?c~HxUUa@AIP#2Y&k4jO5BiwE z8k2rgJ8`LNLVuYV93cK}?eq_x_~^_M4*Q)%#^1)zNhTlmdx=aA&Z9GHYkwq}TCJTq zFnc)8ztC>q6!GcFqQJ8HlF@$tvieJ-f8ChXN#ZUGoB{Y^rxtRp2sYQIWa^?v*wG6D zoYjkozND8&59k|<7=Og@9`U8_yg==1(%Jh3-psnZd0Xh##(x{$3pU;ndO^|XFYlh7 zGdKL{^<4qp`b3r= zem3`vEX&PHhGPbnd!BIg|3D|{?SjC0{IOFf z?+6~5S?~^QJ+CCg?duhAepP@2Ebzfmu*n014zyoO)0)aOt+XF!Dl3tYPJ)6iV2p?YDTq1g zq>B&_I_eU-jBY_R2zs7z54b;G)?V-W-D`c@2frVx6bpmph{U%)mcLczD)oryi(+&k z%NwhW)IY}U-OH8NtH@I9i<#E%bTrjlf6~wD4BScJnI=ZP3R2eVo4*R{Y4IXzA2=L^ z7)74I^)iyuB#bzXegHWR3PAgneDBzmH4yQ(b}YJMs`aC5aOD>I6fk01BS&sL>o(-k zzKAS>0ia#o=gQfE6&{0#wOXg6rB=1{s${QYn_o(wQgaK(v#96v(ZNdUqfd$@VhijSp++I?| zb#ysr_AzrexSL4Zhs@pN-UD`R#cf* zvUhi_m5z*|y?L>^zJ{zscg(hbq!X#p{+YhjX5mf)&m1}0HITC1*!y1kl$w_@`@pd% z#Rzhc&?`tvb790e>_f<_pak?^%X;Bg-T)D=>nGzt%(Qp9hE{K4&j2%S>Ey_bXWNE6 z`X3|9U;yaXc3e3-u)-4%u~jcRT58uSFDv#sw)eU6A#F|&XsegNd9cfyIMQh59Q7A5 z7m*i$=MT32VIaTHkm_}E9djHU29EFjHgX-v7xgC4ska#$IbgEmjQH4DO2ibloNx3# zb9HntngZ`KH;sM}=$mAA*DGfsUv3WgYTEASHaL~-ZtBM!43oZap#gV+LGn&?7C8@` z=nN<>x|jL4IqyEUx$-SI*YW_^fIjo&7C;S{H$eSZ%%s6ipi|BSSMw0Knk^EvA7$=1 z(s+GxzgdGTaviRvDA+{*e`impffly^g?LpcKD*sL1tu6&?DHAA(=P!pb)V0Hysu{7 SGB8)(ru-4*{zl?;Q~Uz~V@eGG diff --git a/data/shaders/radialblur/radialblur.vert b/data/shaders/radialblur/radialblur.vert index fe704c9c..f6d023e8 100644 --- a/data/shaders/radialblur/radialblur.vert +++ b/data/shaders/radialblur/radialblur.vert @@ -14,6 +14,11 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec2 outUV; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main() { outUV = inUV; diff --git a/data/shaders/radialblur/radialblur.vert.spv b/data/shaders/radialblur/radialblur.vert.spv index 023de7eb270724be2538dcce9cd49a643f451712..dbaf4b667cef2cf68c1e0119e144d7a8251fc931 100644 GIT binary patch literal 1304 zcmY+C+fEZv6oz+?BA|$zQE^J~gb5)Ajfp{pn{v@a)WGdzpgU!>%rrC8#7kd6AIYck z#)SXdGdrofSzYV@_d4%s)VsHgsp&Ukc1?K}Ok z#Am_Wc6L+$*HN4RVCE$EB!Q%%UtRi-0-Cz*^~0kt$6;>AQ5F?8%&($>&BFBJo4qXZ z|9x~7C&O?QCBsQHwBf<4{c&{p-L#Zxx+a*q>7+P2mj=^AoH!`lR^P@9N8zc>&TUrM zAA({_9-F%~kBc}>s9@3$>xCR7fg;5MbIw?p3_r4ICgm=f8R&T;j+F=)8$Wx9NtHd?B?-t)R>L~ z6ZcW#nO4lU*9?YKL$ahDYe0(EYiehhY#4bpa2aeoezE!vt;YH~{Lavt;zAu}z zF1#d7t}=J|4sZzhSEQMPeUTr`zWi)!m5sm8zbTt~^v>Ss-Ou{Cx`QVlIH)+{@!ggf z^Ya7spUWba9^dGdsY|aM_`hO!`$MtpZ(hRg-s_efgOB7vpX(BOXMX(Yc|!v4eICfh zhZ(%jL)q}Zm4}!|65`0{;ASi$qgteQw#tA literal 1640 zcmY+C*>2NN5Qa~)wQMb=bOB088umh{P(etDrKM6@DH4UMy|vuL3I^AXVn;$;@e1%r zJQX)c{NJ%p2q&7%{Qqoc=D1vH%^EYK-<;Vp`B^k2VPh_sn$?}|QMa9D{r2`V8!~Uo zHjtPFMR6*UGe3;6TN2oFk|jx7@-IZVmn37gJTG>E2-aCgbe*L>kOp!q`ILnpqScMBZUA zItfNu@KsQ3&ST?C(l85?SnRBgXI9IHads4b3y5<*W|Hq+6b|>oH1p$LF!8Y|eB&sZ z_^R3id*NWON+0jOS5D2^@WWBU7Px}gs^z)ES<(+8Y4WZ~k53cX6}$5=*0rs#YIm-_ z`G5y|imBN*5O)ygcNA+(r`T6rHV4eU!1UW!Ci~*#Fa3|h4>ujhF5sBkG4#F^&wp_ao{l{m)A`B%I9xFUTf-U6|bw4_BAPJGdJ75c*z`<_`F|7ntuAjy_kV8xrc$ z2fQrdtO>73QjD-_UvKx zyu2rPM-j|*L&B`=i+E;Sm%zIizByu;*~Q$F4gXVh@;&Bx@WeEwZ%df_gJPKZZox@S zxO)Z1EH3VT!7image); - assert(!err); + VK_CHECK_RESULT(vkCreateImage(device, &imageCreateInfo, nullptr, &tex->image)); vkGetImageMemoryRequirements(device, tex->image, &memReqs); memAllocInfo.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memAllocInfo.memoryTypeIndex); - err = vkAllocateMemory(device, &memAllocInfo, nullptr, &(tex->deviceMemory)); - assert(!err); - err = vkBindImageMemory(device, tex->image, tex->deviceMemory, 0); - assert(!err); + memAllocInfo.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAllocInfo, nullptr, &(tex->deviceMemory))); + VK_CHECK_RESULT(vkBindImageMemory(device, tex->image, tex->deviceMemory, 0)); // Transform image layout to transfer destination tex->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, tex->image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PREINITIALIZED, @@ -239,8 +236,7 @@ public: sampler.minLod = 0.0f; sampler.maxLod = 0.0f; sampler.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; - err = vkCreateSampler(device, &sampler, nullptr, &tex->sampler); - assert(!err); + VK_CHECK_RESULT(vkCreateSampler(device, &sampler, nullptr, &tex->sampler)); // Create image view VkImageViewCreateInfo view = vkTools::initializers::imageViewCreateInfo(); @@ -250,10 +246,9 @@ public: view.components = { VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A }; view.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; view.image = tex->image; - err = vkCreateImageView(device, &view, nullptr, &tex->view); - assert(!err); + VK_CHECK_RESULT(vkCreateImageView(device, &view, nullptr, &tex->view)); - flushSetupCommandBuffer(); + VulkanExampleBase::flushCommandBuffer(cmdBuffer, queue, true); } // Prepare a new framebuffer for offscreen rendering @@ -261,7 +256,7 @@ public: // blitted to our render target void prepareOffscreenFramebuffer() { - createSetupCommandBuffer(); + VkCommandBuffer cmdBuffer = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); offScreenFrameBuf.width = FB_DIM; offScreenFrameBuf.height = FB_DIM; @@ -273,14 +268,13 @@ public: VkBool32 validDepthFormat = vkTools::getSupportedDepthFormat(physicalDevice, &fbDepthFormat); assert(validDepthFormat); - VkResult err; - // Color attachment VkImageCreateInfo image = vkTools::initializers::imageCreateInfo(); image.imageType = VK_IMAGE_TYPE_2D; image.format = fbColorFormat; image.extent.width = offScreenFrameBuf.width; image.extent.height = offScreenFrameBuf.height; + image.extent.depth = 1; image.mipLevels = 1; image.arrayLayers = 1; image.samples = VK_SAMPLE_COUNT_1_BIT; @@ -303,27 +297,22 @@ public: colorImageView.subresourceRange.baseArrayLayer = 0; colorImageView.subresourceRange.layerCount = 1; - err = vkCreateImage(device, &image, nullptr, &offScreenFrameBuf.color.image); - assert(!err); + VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &offScreenFrameBuf.color.image)); vkGetImageMemoryRequirements(device, offScreenFrameBuf.color.image, &memReqs); memAlloc.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memAlloc.memoryTypeIndex); - err = vkAllocateMemory(device, &memAlloc, nullptr, &offScreenFrameBuf.color.mem); - assert(!err); - - err = vkBindImageMemory(device, offScreenFrameBuf.color.image, offScreenFrameBuf.color.mem, 0); - assert(!err); + memAlloc.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &offScreenFrameBuf.color.mem)); + VK_CHECK_RESULT(vkBindImageMemory(device, offScreenFrameBuf.color.image, offScreenFrameBuf.color.mem, 0)); vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, offScreenFrameBuf.color.image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); colorImageView.image = offScreenFrameBuf.color.image; - err = vkCreateImageView(device, &colorImageView, nullptr, &offScreenFrameBuf.color.view); - assert(!err); + VK_CHECK_RESULT(vkCreateImageView(device, &colorImageView, nullptr, &offScreenFrameBuf.color.view)); // Depth stencil attachment image.format = fbDepthFormat; @@ -340,29 +329,22 @@ public: depthStencilView.subresourceRange.baseArrayLayer = 0; depthStencilView.subresourceRange.layerCount = 1; - err = vkCreateImage(device, &image, nullptr, &offScreenFrameBuf.depth.image); - assert(!err); + VK_CHECK_RESULT(vkCreateImage(device, &image, nullptr, &offScreenFrameBuf.depth.image)); vkGetImageMemoryRequirements(device, offScreenFrameBuf.depth.image, &memReqs); memAlloc.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &memAlloc.memoryTypeIndex); - err = vkAllocateMemory(device, &memAlloc, nullptr, &offScreenFrameBuf.depth.mem); - assert(!err); - - err = vkBindImageMemory(device, offScreenFrameBuf.depth.image, offScreenFrameBuf.depth.mem, 0); - assert(!err); + memAlloc.memoryTypeIndex = getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &offScreenFrameBuf.depth.mem)); + VK_CHECK_RESULT(vkBindImageMemory(device, offScreenFrameBuf.depth.image, offScreenFrameBuf.depth.mem, 0)); vkTools::setImageLayout( - setupCmdBuffer, + cmdBuffer, offScreenFrameBuf.depth.image, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); depthStencilView.image = offScreenFrameBuf.depth.image; - err = vkCreateImageView(device, &depthStencilView, nullptr, &offScreenFrameBuf.depth.view); - assert(!err); - - flushSetupCommandBuffer(); + VK_CHECK_RESULT(vkCreateImageView(device, &depthStencilView, nullptr, &offScreenFrameBuf.depth.view)); VkImageView attachments[2]; attachments[0] = offScreenFrameBuf.color.view; @@ -375,9 +357,9 @@ public: fbufCreateInfo.width = offScreenFrameBuf.width; fbufCreateInfo.height = offScreenFrameBuf.height; fbufCreateInfo.layers = 1; + VK_CHECK_RESULT(vkCreateFramebuffer(device, &fbufCreateInfo, nullptr, &offScreenFrameBuf.frameBuffer)); - err = vkCreateFramebuffer(device, &fbufCreateInfo, nullptr, &offScreenFrameBuf.frameBuffer); - assert(!err); + VulkanExampleBase::flushCommandBuffer(cmdBuffer, queue, true); } void createOffscreenCommandBuffer() @@ -386,8 +368,7 @@ public: cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1); - VkResult vkRes = vkAllocateCommandBuffers(device, &cmd, &offScreenCmdBuffer); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmd, &offScreenCmdBuffer)); } // The command buffer to copy for rendering @@ -396,8 +377,6 @@ public: // and gets resubmitted void buildOffscreenCommandBuffer() { - VkResult err; - VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); VkClearValue clearValues[2]; @@ -412,21 +391,12 @@ public: renderPassBeginInfo.clearValueCount = 2; renderPassBeginInfo.pClearValues = clearValues; - err = vkBeginCommandBuffer(offScreenCmdBuffer, &cmdBufInfo); - assert(!err); + VK_CHECK_RESULT(vkBeginCommandBuffer(offScreenCmdBuffer, &cmdBufInfo)); - VkViewport viewport = vkTools::initializers::viewport( - (float)offScreenFrameBuf.width, - (float)offScreenFrameBuf.height, - 0.0f, - 1.0f); + VkViewport viewport = vkTools::initializers::viewport((float)offScreenFrameBuf.width, (float)offScreenFrameBuf.height, 0.0f, 1.0f); vkCmdSetViewport(offScreenCmdBuffer, 0, 1, &viewport); - VkRect2D scissor = vkTools::initializers::rect2D( - offScreenFrameBuf.width, - offScreenFrameBuf.height, - 0, - 0); + VkRect2D scissor = vkTools::initializers::rect2D(offScreenFrameBuf.width, offScreenFrameBuf.height, 0, 0); vkCmdSetScissor(offScreenCmdBuffer, 0, 1, &scissor); vkCmdBeginRenderPass(offScreenCmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); @@ -510,8 +480,7 @@ public: VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - err = vkEndCommandBuffer(offScreenCmdBuffer); - assert(!err); + VK_CHECK_RESULT(vkEndCommandBuffer(offScreenCmdBuffer)); } void reBuildCommandBuffers() @@ -541,30 +510,19 @@ public: renderPassBeginInfo.clearValueCount = 2; renderPassBeginInfo.pClearValues = clearValues; - VkResult err; - for (int32_t i = 0; i < drawCmdBuffers.size(); ++i) { // Set target frame buffer renderPassBeginInfo.framebuffer = frameBuffers[i]; - err = vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo); - assert(!err); + VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo)); vkCmdBeginRenderPass(drawCmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); - VkViewport viewport = vkTools::initializers::viewport( - (float)width, - (float)height, - 0.0f, - 1.0f); + VkViewport viewport = vkTools::initializers::viewport((float)width, (float)height, 0.0f, 1.0f); vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); - VkRect2D scissor = vkTools::initializers::rect2D( - width, - height, - 0, - 0); + VkRect2D scissor = vkTools::initializers::rect2D(width, height, 0, 0); vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); VkDeviceSize offsets[1] = { 0 }; @@ -589,42 +547,10 @@ public: vkCmdEndRenderPass(drawCmdBuffers[i]); - err = vkEndCommandBuffer(drawCmdBuffers[i]); - assert(!err); + VK_CHECK_RESULT(vkEndCommandBuffer(drawCmdBuffers[i])); } } - void draw() - { - VkResult err; - - // Get next image in the swap chain (back/front buffer) - err = swapChain.acquireNextImage(semaphores.presentComplete, ¤tBuffer); - assert(!err); - - submitPostPresentBarrier(swapChain.buffers[currentBuffer].image); - - // Gather command buffers to be sumitted to the queue - std::vector submitCmdBuffers = { - offScreenCmdBuffer, - drawCmdBuffers[currentBuffer], - }; - submitInfo.commandBufferCount = submitCmdBuffers.size(); - submitInfo.pCommandBuffers = submitCmdBuffers.data(); - - // Submit to queue - err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); - assert(!err); - - submitPrePresentBarrier(swapChain.buffers[currentBuffer].image); - - err = swapChain.queuePresent(queue, currentBuffer, semaphores.renderComplete); - assert(!err); - - err = vkQueueWaitIdle(queue); - assert(!err); - } - void loadMeshes() { loadMesh(getAssetPath() + "models/glowsphere.dae", &meshes.example, vertexLayout, 0.05f); @@ -732,8 +658,7 @@ public: poolSizes.data(), 2); - VkResult vkRes = vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool); - assert(!vkRes); + VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool)); } void setupDescriptorSetLayout() @@ -763,20 +688,17 @@ public: setLayoutBindings.data(), setLayoutBindings.size()); - VkResult err = vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout); - assert(!err); + VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorLayout, nullptr, &descriptorSetLayout)); VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = vkTools::initializers::pipelineLayoutCreateInfo( &descriptorSetLayout, 1); - err = vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.radialBlur); - assert(!err); + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.radialBlur)); // Offscreen pipeline layout - err = vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.scene); - assert(!err); + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.scene)); } void setupDescriptorSet() @@ -788,8 +710,7 @@ public: &descriptorSetLayout, 1); - VkResult vkRes = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.quad); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.quad)); // Image descriptor for the color map texture VkDescriptorImageInfo texDescriptor = @@ -823,8 +744,7 @@ public: vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); // Offscreen 3D scene descriptor set - vkRes = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.scene); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.scene)); std::vector offScreenWriteDescriptorSets = { @@ -921,13 +841,11 @@ public: blendAttachmentState.srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; blendAttachmentState.dstAlphaBlendFactor = VK_BLEND_FACTOR_DST_ALPHA; - VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.radialBlur); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.radialBlur)); // No blending (for debug display) blendAttachmentState.blendEnable = VK_FALSE; - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.fullScreenOnly); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.fullScreenOnly)); // Phong pass shaderStages[0] = loadShader(getAssetPath() + "shaders/radialblur/phongpass.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); @@ -937,25 +855,22 @@ public: blendAttachmentState.blendEnable = VK_FALSE; depthStencilState.depthWriteEnable = VK_TRUE; - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.phongPass); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.phongPass)); // Color only pass (offscreen blur base) shaderStages[0] = loadShader(getAssetPath() + "shaders/radialblur/colorpass.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shaderStages[1] = loadShader(getAssetPath() + "shaders/radialblur/colorpass.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.colorPass); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.colorPass)); } // Prepare and initialize uniform buffer containing shader uniforms void prepareUniformBuffers() { - VkResult err; - // Phong and color pass vertex shader uniform buffer createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(uboVS), &uboVS, &uniformData.vsScene.buffer, @@ -965,6 +880,7 @@ public: // Fullscreen quad vertex shader uniform buffer createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(uboVS), &uboVS, &uniformData.vsQuad.buffer, @@ -974,6 +890,7 @@ public: // Fullscreen quad fragment shader uniform buffer createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(uboQuadFS), &uboQuadFS, &uniformData.fsQuad.buffer, @@ -998,8 +915,7 @@ public: uboQuadVS.model = glm::rotate(uboQuadVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); uint8_t *pData; - VkResult err = vkMapMemory(device, uniformData.vsQuad.memory, 0, sizeof(uboQuadVS), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsQuad.memory, 0, sizeof(uboQuadVS), 0, (void **)&pData)); memcpy(pData, &uboQuadVS, sizeof(uboQuadVS)); vkUnmapMemory(device, uniformData.vsQuad.memory); } @@ -1012,18 +928,37 @@ public: uboVS.model = glm::mat4(); uint8_t *pData; - VkResult err = vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); memcpy(pData, &uboVS, sizeof(uboVS)); vkUnmapMemory(device, uniformData.vsScene.memory); // Fragment shader - err = vkMapMemory(device, uniformData.fsQuad.memory, 0, sizeof(uboQuadFS), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsQuad.memory, 0, sizeof(uboQuadFS), 0, (void **)&pData)); memcpy(pData, &uboQuadFS, sizeof(uboQuadFS)); vkUnmapMemory(device, uniformData.fsQuad.memory); } + void draw() + { + VulkanExampleBase::prepareFrame(); + + // Gather command buffers to be sumitted to the queue + std::vector submitCmdBuffers; + // Submit offscreen rendering command buffer + // todo : use event to ensure that offscreen result is finished bfore render command buffer is started + if (blur) + { + submitCmdBuffers.push_back(offScreenCmdBuffer); + } + submitCmdBuffers.push_back(drawCmdBuffers[currentBuffer]); + submitInfo.commandBufferCount = submitCmdBuffers.size(); + submitInfo.pCommandBuffers = submitCmdBuffers.data(); + + VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE)); + + VulkanExampleBase::submitFrame(); + } + void prepare() { VulkanExampleBase::prepare(); @@ -1047,9 +982,7 @@ public: { if (!prepared) return; - vkDeviceWaitIdle(device); draw(); - vkDeviceWaitIdle(device); if (!paused) { updateUniformBuffersScene(); @@ -1062,6 +995,32 @@ public: updateUniformBuffersScreen(); } + virtual void keyPressed(uint32_t keyCode) + { + switch (keyCode) + { + case 0x42: + case GAMEPAD_BUTTON_A: + toggleBlur(); + break; + case 0x54: + case GAMEPAD_BUTTON_X: + toggleTextureDisplay(); + break; + } + } + + virtual void getOverlayText(VulkanTextOverlay *textOverlay) + { +#if defined(__ANDROID__) + textOverlay->addText("Press \"Button A\" to toggle blur", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"Button X\" to display offscreen texture", 5.0f, 105.0f, VulkanTextOverlay::alignLeft); +#else + textOverlay->addText("Press \"B\" to toggle blur", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("Press \"T\" to display offscreen texture", 5.0f, 105.0f, VulkanTextOverlay::alignLeft); +#endif + } + void toggleBlur() { blur = !blur; @@ -1085,18 +1044,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (vulkanExample != NULL) { vulkanExample->handleMessages(hWnd, uMsg, wParam, lParam); - if (uMsg == WM_KEYDOWN) - { - switch (wParam) - { - case 0x42: - vulkanExample->toggleBlur(); - break; - case 0x54: - vulkanExample->toggleTextureDisplay(); - break; - } - } } return (DefWindowProc(hWnd, uMsg, wParam, lParam)); }