From ee8478cdecf6f6d3daa784c8adbc0c65c54a0421 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Wed, 1 Jun 2016 21:55:10 +0200 Subject: [PATCH] Enabled text overlay, code cleanup, refactoring, gl_PerVertex output for shaders --- data/shaders/offscreen/mirror.frag.spv | Bin 2524 -> 2588 bytes data/shaders/offscreen/mirror.vert | 5 + data/shaders/offscreen/mirror.vert.spv | Bin 1776 -> 1440 bytes data/shaders/offscreen/offscreen.frag.spv | Bin 2020 -> 2020 bytes data/shaders/offscreen/offscreen.vert | 5 + data/shaders/offscreen/offscreen.vert.spv | Bin 2164 -> 1828 bytes data/shaders/offscreen/quad.frag.spv | Bin 640 -> 640 bytes data/shaders/offscreen/quad.vert | 5 + data/shaders/offscreen/quad.vert.spv | Bin 1640 -> 1304 bytes offscreen/offscreen.cpp | 271 ++++++++++------------ 10 files changed, 136 insertions(+), 150 deletions(-) diff --git a/data/shaders/offscreen/mirror.frag.spv b/data/shaders/offscreen/mirror.frag.spv index 6ef793288f06a5e83dbdcfee8634730b2246b178..0f9710bb58275808125c0d280e6589036861e703 100644 GIT binary patch literal 2588 zcmZ9NYjcxT5XTQKDIm&4ZX#Y%s(7JR#DZw0wJlOFK`L1A9v{*)q@+nE2{ZbxzHr7@ zei^@jajfYvIUY)&op_|nnq!O7%YnP~T zfEt6XZtin0&Gu@Cbl9bI9NF!4HkUh{-g?2ki0sujT2yUzIDt7{g8MP|kEb`0Kjr#F zdJoypwz{o)Z@JUz^f2=}UmL#|MRVI zBKQ3Qu*cfgJq!H8oc7_c57*WPe<~KB4a}s?5t_)5Q@BL}p z>oR}$Bjv<-Y<*9Fl(rZ2A4J;&^v@NxXOcUC{S>kc{9Lbn2sl};Ka4ciywhYc&ojUp zqlnsP;Q1CJ_Bjl>QABJR-Y;S&(aXEw9_^>R`*2TFNcSOcF6GPM(az3J*wfga;W!N`(?p$AJ7O<~f1;)n_i_P5|?VeG=W6U&yWh6fj2K z^`1{I;!mT?{anO9i!SH;hs~~@4g9P- zi`1`-x|h(+5p^%4%SB!7w}81^tM1z2dmFwrXTf(h5A2=q%@}840mw(a570elr|>VL z%h_+^mx0_8@Xq9}0rL!f!&=v|t>s&dS}W-CQR^dg&la^lMwg3PpP8e=$o*FIY`x%WNaOuol#BQ}y8Vmz2D;n^h?%^P lZqCt}Y+}pDx=nP~%17=8=+=w7X`#y*8+(y^#4q_3@E@Pgz{~&u literal 2524 zcmZ9N+j3M@5Qdit6F`)MoJ2fKh>8kE!~xMrLJ}mXK?8_*!f_`VhQVa^)XY$&ck#k1 zuY4I_!1AFiw2F$~w`aGtWv9Bj`|p2suhpy9WPEIDXG%}-w<~qh=sS?c@Kf58CJMc@ zd~$V?c?N+mK_DnBZ`ytiHRIOd3 z#%^j1H+x0QeRR4jIqC3g=@7ct&+jkhd4IjcUPAXfo$vJ^JUIzQIh>xc?(LWXT zL^_WiWShN>R(~pSqdXzsHUg>A;|MD$y zBKQ3wVvqH$djjzbe-b<5CalKwjoWYe)-|7>zIPM;L0Ix8iyIoPIf6X_R!5G)XGjX) zUf1!xPch{bzT78~l(y!K@4<3!#%D_3Gl?C>e;Qp!{9LcU7jd#&zYi_fyr;=xo@Wtj zR3&O32j`m$?(;ZeRS9k#+%LG3*!9Q6J=#xk_u-zV(C$OrT$2{&7|`2*|U}xsoJi@ASQYKkL}53xzl0zlZIN z#{EYnZXIoNHPG)Oz9sM4ck@1CZ+uU3yz3c6JnDad?K$%@ei2*De#)Oi#C&t!iP$B? zJjSBd0=Bj0k*KwZEgrQlV|&)9^&z%c)VhK#R;{&!ZysYS)W3@U2)Tq9yA8Gz{W0SC zjm69^WBc~2;*86`hPXzK`xE;VaYkbHJ}WV~F+XB)o)v7*vqjDm=o^UGbtLXy%o&Tj z_ugXtO>BD~>p#a9i}l9Dsxx{L-}MdjZN%R$ef#n?;%`;-ddw9#be!FY}blM?l!jdqWAZ(#pK3b L#2)cWd;$3vV;Hp! diff --git a/data/shaders/offscreen/mirror.vert b/data/shaders/offscreen/mirror.vert index 7526b4e5..7e4bb2d8 100644 --- a/data/shaders/offscreen/mirror.vert +++ b/data/shaders/offscreen/mirror.vert @@ -16,6 +16,11 @@ layout (binding = 0) uniform UBO layout (location = 0) out vec2 outUV; layout (location = 1) out vec4 outPos; +out gl_PerVertex +{ + vec4 gl_Position; +}; + void main() { outUV = inUV; diff --git a/data/shaders/offscreen/mirror.vert.spv b/data/shaders/offscreen/mirror.vert.spv index d883995335976f35b9a0ac4cff7100340e4afef3..e7b7d46ea8ce2c3a5a4bd33f14f8f721150f2a5c 100644 GIT binary patch delta 279 zcmeysyMUXQnMs+Qfq@YSIT&;&@|vo1Gk^dK5a%Xl=7HFpKnxP)2V!|3)&ydmiG}YO z)h8!1iW{l}xge096CaRYoLQ2YpU1$;zzkLf5@!WM9Uz^V=a*lUo0!8eS(E9pCQKK^ zItB)Jpbn526A-%ttq19l17haQ6Pc44P354{yg(rZptJ@^3Wz~ktf736yFg+fK1i$1 p=BcdOj0RdjCdlcIKzHx~X>A||DHR1`JD>&-AEf3lFbph!7y#R$97X^D delta 622 zcmX|9%}T>S7~D;otx}=~?Lm-O^q@9sYeWzPL5$Q~L=e16C_xs|RBHtBl4mG=0et{Z zeIy@1UqEmso4Cuc-^@3=JNbEU{kX1eZ8e3EmK^x8!O;LlvCdd;04<;gECS2G z9&iW*Q~kZxMe&f{-z1Z}WRfSZph97GXHRmaP@*a5kd^D8T>b<1tf6ozi8G&awn2e^g>+xh1r?tj-NadMKQ3#t7ff1w3ToQ$|5BXIv z9tWS2;|kt7GBrl8HAbbzShdEQ8sFLg9qy%X0EN*!fF5$jqSvW75~)&9^G|Cii#9yl z=yd=Nzv4TnnPVM%7pnrOd8l|FzZ*67hz@){R^H40X~p^FsF5=l^YL8z`$BA%WVJFt oCHq)$ diff --git a/data/shaders/offscreen/offscreen.frag.spv b/data/shaders/offscreen/offscreen.frag.spv index b266f832e41b847244567d7554f9d55b9c56ca86..672e1f82feac4b32f56d9e013624a2e270269195 100644 GIT binary patch delta 40 ocmaFD|Ac=+h%7e)1A_n%3j?tY5IX>|00T1v3y@~tSXj&s0D>q5OaK4? delta 40 mcmaFD|Ac=+h^#OJ1A_w)a|5ve5Zi!hW(F1@&9Sktm>mFv{RK?` diff --git a/data/shaders/offscreen/offscreen.vert b/data/shaders/offscreen/offscreen.vert index 0322e2c8..5f802b0d 100644 --- a/data/shaders/offscreen/offscreen.vert +++ b/data/shaders/offscreen/offscreen.vert @@ -19,6 +19,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/offscreen/offscreen.vert.spv b/data/shaders/offscreen/offscreen.vert.spv index 4d051c82198e8d26cacc21f966931489103fdf84..05e10191b4a8878ace24c6a635fa9f6221786589 100644 GIT binary patch literal 1828 zcmZ9L+fEZv6oxmnMHB=PIe5ZCJ)>9=5Mwj~A@!mW)X42*XeVW~%rw&>(K{2LKp)Ac z^2Wsf+q1V+H(BiU|LeHdnwExZXN(!r->7+JiZf+~g^d|ABld1I-#1tKd3$ATy^hC( zDOpE+Ce3-Pm-YWRj1$0F$(RJogk)N>B)KCYK}mnZx_>G`S>BCiu=Q>`=tsRU3-c)G zABF8G3(~`nQ7iBN>myT~bb@Y}bWXxf6s)b*dtvL7sVLK64;3-=k)Gsl((E|wN{6Gb zIQdIijy~nLlXlZgs<^W4J5CC!qB%^7?{tIxC_9L%%;c({@C!q%auIy56zRS8#4pZr6JJ&cVjJ%H- z>n*!qqEn8Ui))hRAZnS0;+V~Xgac+SU^WY8CSZC3vqv!fyjC6N!6A;*P$XPoFWcVX zD-!(uyK9g-gPcA&95n~yz{I_h_&B)JxFSEb@%t*FA3s0(XJ$(hj>n4yv>4mq zJeZ?@FaFFB%zUQxN@^_%fzfBBjp(jQ=HyRrVC+@lQK!Q{cbFY``#I_UP1wQA7S8*# z6a2lMonWUP^P?WWfdzT73pi?D)J+^5v0#3aa5KV}bXO(hT6TCwI%i&ZRyVnd+{LWn zJWq{zVdlWhsR3r@aM-Unofu!^x^!w{UvxTkhzBn@4*MeQrpH|Dim@R3*g0<3ryy2{ZXFAMi~{RRT|LW^`M^ZmCayVElaTyVC!! zeNP;`uXA7eV4Y=QeBj@z4&T`W2|UMh52eEm4R9-tW8V9UWVVka#N&^hKG`KaeX^@3 z68dC^zOOaM@9Eb>o^=Tv!l5p8@W;L(A@4Wk1V5D!13&J1*_2M)t^_;1@EyVbmSt1& E2j`G^2mk;8 literal 2164 zcmZ9NYflqV5QbN13kqHkxu}Q*yrYN+h$1Mr6p}_zB43-OY|84g+qBz6{bb@V(4XY5 z@{5V@v%6D@ry0(?@64H*Gjld{cTM#;&N=;hoi|Rp2AnQo$LVtl$zCe&muH&s(aik9 zEFPDf?!*zF%lff$k`vbt(eFwwN%|z`B^M=+B+n(ok`>9Sq+7o(?Y|W$C(ly3vi4!U z()8+X!;QU4^VmJ|8kOkqlUI$KXMJSy!&)V9!&=L&d6oIO*}7Z(?Bo@xvzELVYKU6# zyQp#E2GZfE%@5mD!cnLEHliSENEMe$?%{_il~+HmiLV8fJ+E=#HDd1zeua!j#}+mH z*pEW7J&8YkN_anv_x*1kerDtTvTX!@ebaBoZdmo&HoAy3zxQG(cf!c)UZbmVb=^CfrS*N$UVEH#NYroD9-NzWy7^uyFh&zPb5v-QIDJIU70I?D;YZ%i zb70QBl~^pe({pKja^v@1LOsNS#-%Y^i-8TH?jh~u#7)#mU~+I|G6KFgSR|Sq<7|-5yl7pz4GuzpGx3a z#?4BHqsPWQ%Q*VIr<3${PQrQou~R3rho??vyC|VfW^Q%8$oO4-xx`tLz#%O1k_Uh6 iFD1nNp_t%T63)Q)XSFO#=iHVAJGJoc;Qz|9B>4wUGn;Av diff --git a/data/shaders/offscreen/quad.frag.spv b/data/shaders/offscreen/quad.frag.spv index 7b84c35a4493e11e6cb62293935c2fbbcb5dd23d..38044a2e5d55eb3c06d38cca6ebfbb5129257050 100644 GIT binary patch delta 28 gcmZo*ZD5@cBFM?Wz#s_30u0OyEI^ulW2!V006F6WYXATM delta 28 gcmZo*ZD5@cA}Gkfz`zN_0u0OyEI^uLW2!V006GW*YybcN diff --git a/data/shaders/offscreen/quad.vert b/data/shaders/offscreen/quad.vert index fe704c9c..f6d023e8 100644 --- a/data/shaders/offscreen/quad.vert +++ b/data/shaders/offscreen/quad.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/offscreen/quad.vert.spv b/data/shaders/offscreen/quad.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!7 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/plane.obj", &meshes.plane, vertexLayout, 0.4f); @@ -746,8 +683,7 @@ public: poolSizes.data(), 5); - VkResult vkRes = vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool); - assert(!vkRes); + VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool)); } void setupDescriptorSetLayout() @@ -777,20 +713,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.quad); - assert(!err); + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.quad)); // Offscreen pipeline layout - err = vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.offscreen); - assert(!err); + VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pPipelineLayoutCreateInfo, nullptr, &pipelineLayouts.offscreen)); } void setupDescriptorSet() @@ -802,8 +735,7 @@ public: &descriptorSetLayout, 1); - VkResult vkRes = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.mirror); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.mirror)); // Image descriptor for the offscreen mirror texture VkDescriptorImageInfo texDescriptorMirror = @@ -845,8 +777,7 @@ public: // Model // No texture - vkRes = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.model); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.model)); std::vector modelWriteDescriptorSets = { @@ -860,8 +791,7 @@ public: vkUpdateDescriptorSets(device, modelWriteDescriptorSets.size(), modelWriteDescriptorSets.data(), 0, NULL); // Offscreen - vkRes = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.offscreen); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.offscreen)); std::vector offScreenWriteDescriptorSets = { @@ -875,8 +805,7 @@ public: vkUpdateDescriptorSets(device, offScreenWriteDescriptorSets.size(), offScreenWriteDescriptorSets.data(), 0, NULL); // Debug quad - vkRes = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.debugQuad); - assert(!vkRes); + VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.debugQuad)); std::vector debugQuadWriteDescriptorSets = { @@ -969,15 +898,13 @@ public: pipelineCreateInfo.stageCount = shaderStages.size(); pipelineCreateInfo.pStages = shaderStages.data(); - VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.debug); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.debug)); // Mirror shaderStages[0] = loadShader(getAssetPath() + "shaders/offscreen/mirror.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); shaderStages[1] = loadShader(getAssetPath() + "shaders/offscreen/mirror.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.mirror); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.mirror)); // Solid shading pipeline shaderStages[0] = loadShader(getAssetPath() + "shaders/offscreen/offscreen.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); @@ -985,8 +912,7 @@ public: pipelineCreateInfo.layout = pipelineLayouts.offscreen; - err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.shaded); - assert(!err); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.shaded)); } // Prepare and initialize uniform buffer containing shader uniforms @@ -995,6 +921,7 @@ public: // Mesh vertex shader uniform buffer block createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.vsShared), nullptr, &uniformData.vsShared.buffer, @@ -1004,6 +931,7 @@ public: // Mirror plane vertex shader uniform buffer block createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.vsShared), nullptr, &uniformData.vsMirror.buffer, @@ -1013,6 +941,7 @@ public: // Offscreen vertex shader uniform buffer block createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.vsShared), nullptr, &uniformData.vsOffScreen.buffer, @@ -1022,6 +951,7 @@ public: // Debug quad vertex shader uniform buffer block createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(ubos.vsShared), nullptr, &uniformData.vsDebugQuad.buffer, @@ -1038,7 +968,7 @@ public: ubos.vsShared.projection = glm::perspective(glm::radians(60.0f), (float)width / (float)height, 0.1f, 256.0f); glm::mat4 viewMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, zoom)); - ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), glm::vec3(0, 0, 0)); + ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); @@ -1046,28 +976,25 @@ public: ubos.vsShared.model = glm::translate(ubos.vsShared.model, meshPos); uint8_t *pData; - VkResult err = vkMapMemory(device, uniformData.vsShared.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsShared.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData)); memcpy(pData, &ubos.vsShared, sizeof(ubos.vsShared)); vkUnmapMemory(device, uniformData.vsShared.memory); // Mirror - ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), glm::vec3(0, 0, 0)); + ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - err = vkMapMemory(device, uniformData.vsMirror.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsMirror.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData)); memcpy(pData, &ubos.vsShared, sizeof(ubos.vsShared)); vkUnmapMemory(device, uniformData.vsMirror.memory); // Debug quad - ubos.vsShared.projection = glm::ortho(0.0f, 4.0f, 0.0f, 4.0f*(float)height / (float)width, -1.0f, 1.0f); + ubos.vsShared.projection = glm::ortho(4.0f, 0.0f, 0.0f, 4.0f*(float)height / (float)width, -1.0f, 1.0f); ubos.vsShared.model = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 0.0f)); - err = vkMapMemory(device, uniformData.vsDebugQuad.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsDebugQuad.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData)); memcpy(pData, &ubos.vsShared, sizeof(ubos.vsShared)); vkUnmapMemory(device, uniformData.vsDebugQuad.memory); } @@ -1077,7 +1004,7 @@ public: ubos.vsShared.projection = glm::perspective(glm::radians(60.0f), (float)width / (float)height, 0.1f, 256.0f); glm::mat4 viewMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, zoom)); - ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), glm::vec3(0, 0, 0)); + ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); @@ -1086,12 +1013,30 @@ public: ubos.vsShared.model = glm::translate(ubos.vsShared.model, meshPos); uint8_t *pData; - VkResult err = vkMapMemory(device, uniformData.vsOffScreen.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData); - assert(!err); + VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsOffScreen.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData)); memcpy(pData, &ubos.vsShared, sizeof(ubos.vsShared)); vkUnmapMemory(device, uniformData.vsOffScreen.memory); } + void draw() + { + VulkanExampleBase::prepareFrame(); + + // Submit offscreen rendering command buffer + // todo : use event to ensure that offscreen result is finished bfore render command buffer is started + std::vector submitCmdBuffers = { + offScreenCmdBuffer, + drawCmdBuffers[currentBuffer], + }; + 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(); @@ -1131,6 +1076,32 @@ public: updateUniformBuffers(); updateUniformBufferOffscreen(); } + + virtual void keyPressed(uint32_t keyCode) + { + switch (keyCode) + { + case 0x44: + case GAMEPAD_BUTTON_A: + toggleDebugDisplay(); + break; + } + } + + virtual void getOverlayText(VulkanTextOverlay *textOverlay) + { +#if defined(__ANDROID__) + textOverlay->addText("Press \"Button A\" to display offscreen target", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); +#else + textOverlay->addText("Press \"d\" to display offscreen target", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); +#endif + } + + void toggleDebugDisplay() + { + debugDisplay = !debugDisplay; + reBuildCommandBuffers(); + } }; VulkanExample *vulkanExample;