From 4377972315becdda76684a6e26d63ba4d2d2b589 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Tue, 22 Nov 2022 10:09:52 +0800 Subject: [PATCH] Added functionality for graphics system to render to swapchain image - Added functionality for graphics system to render to swapchain image when SHEDITOR is disabled. This is done via rendering a simple quad on screen and using an input attachment as a texture to the shader. --- Assets/Fonts/ALGER.shfont | Bin 698700 -> 698700 bytes Assets/Fonts/SegoeUI.shfont | Bin 559876 -> 559876 bytes Assets/Shaders/ToSwapchain_VS.glsl | 2 +- Assets/Shaders/ToSwapchain_VS.shshaderb | Bin 1597 -> 1633 bytes .../src/Application/SBApplication.cpp | 4 ++-- .../Graphics/RenderGraph/SHRenderGraph.cpp | 4 +++- .../src/Graphics/RenderGraph/SHSubpass.cpp | 22 ++++++++++++++---- .../src/Graphics/RenderGraph/SHSubpass.h | 8 +++++-- 8 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Assets/Fonts/ALGER.shfont b/Assets/Fonts/ALGER.shfont index 738af82d86df84ae1df6bf24a46f82732e7c7bf1..1acab9da4e7191479536fae42fe4d0181cc87dae 100644 GIT binary patch delta 1272 zcmYk*FH=H66b0}HD1Q_c6%}R-27|*82!svt9>G8`5R3+cAHcZXpwXFEj7Fo)7ySSx zK7o-)+~_%H-(?6JezWiF-n|!o7lYr$;A>TBCdo&dB;za(6<6Xl&0Uq~WZLmU4|vG( zLbwE`$OvP=Wx1;{Gs0;&zzbi%BQl!^LV=x6+_S~Z3JAyuPryf-7Xm*^(mV)rV2;c- zGi5nm=*9{P;Rm1bJwg*ZfU7e@TxYo#n88jV@TIrN2<`ZpYcNCLGcPd19tb?`4jF;9 zb#PCU89rf%jIacH$OtO{j|-bSuEoqBc6g6acC-*~V+BEA^m2Bd{TSk1#AV z!g++-Wv1Nm!d00OK4S$z;Iny8n;92B^Mc(YSZxApLj`V+8D5G5{2HuHU@C7_sASD^8{cdUYG*BN0`N(AXsf3X5R5qW&|G1nQra`f#odm zdpl$%0e&XA7hZ9|2)|LmdLY<*j+n9e2-Y`&JwTyBu=yM_Q|@@ddLY<*gfHo8tOqB|*nHMt-vm~``3N?jQ)YNH=Ob8cg3U*;`J6Fh^AT)5g3U*;+Ir0J uAI$j(f0H<$&7C0dpLLNwyZ(#oSFoyBHLNYHZLB(01FMPE`gZ-D?%O}!iTsHG delta 1272 zcmYk*KWNlY90%~;_0Oe$Y-=yIJrwOA9F#5&;)6?a2o;?!f`|pTr{gUmqyYzq7Hczz z5~MCUQ5-vXQ-f!66z;&GF4w^;MF&B;WGI3)P*A@wzj&|18$SHHLY6*eq-_R{wN{L2L0s1KAf*UOX-U{%j#Souij0ixB1 z>1=?xFhRS;0H4X1EuJ%6Hi4e)du93#0G^wqaePsEpi?CVEWVb`Hi^f!CY#g))VeQp z%2ZS~W~dS;m60H7J;Q9L#RQkbcBQJhHlQ{(0>|rWt`Eq3fN1e?n$Oh9d=mW62ax#y zGM_vuy?g+f4o65b8FBN!RDW8E^|s+dgg) zO&7w4t~X(cigkSwE>XEaMz|=5+suTrfe8!Xq3u(tpe-OHL{x5Z&XAcoupIX$aGbZu z2rJ+k86o&NJIrt#Ol?9gNb3q`6DnlRyFTu2W`uvppe?O|w!8)^agP~qGl8?!$Osbv zx03}9Iz*;ohJ()A-UP2CffvHrge$atM&=1K@5`Vj@Ov;$5^7YK5#E%x_>`GHrOku~ z&j@T|M&Jg#gJ;Z4JtO=AaEVFqtIC3J9Y@Se$_6I*1W7pca|E9{K4<0(75pwHjLHT{ zU>j!>9^dB$GaQs}D!lWI@U0*V{4M!CFPS+iuuUZ42IqXiIl>aSMy6)QD<<%tj z%z-H~g12QMc;<*1zRw65fo(t%c)ge)3w~%kX2xLx{{v=(1;C8(8#u*mubA8!0yF>s delta 1238 zcmXZbYe-Z<6bEqDSF>uGX{(V$FO$OZTINo=clJv@5Tb_#K~IPtvJqD^D3U1JluQu1 zVXzgFQkJna6_%iTuh0Xmh$MShVlT@OV=sl|hqC@Vb3e?7ALpK#GiT2AH!tuvFW}!D zWOvRSlgy7{y5*pRpV-P0auiipqA1BdR>pF>$5mYe1|Pj*~diKgW8p}Hcmfd=%oInBz}Gpf#ku20!ULJn7T3m8ecp*H4~;G7srTw6vw4T}RF zT?2|!y=Ibo$fI)+$qfzeNyj-r-#_8VJv zIhd}*QL>`sy`2LLe*Gvv<3MrhIVL`{fH#5LGNMewZcTm(4QNsH!1$&{!+3*^=s z(AeK$=KvEglS750nV22mW{1-dgQU!$Wc@#vAtD;!-geR$Yj44uMj~E+h|KqUbPEV} z?o|60CgV+0u$z8FKD`F?wXHX1?@q+O05p7?kP!>;{=Ft6%FM`I&npz;q5%Wp+f3#F z(FtX&vek*&fWZExJpxK9CFe#HP0<|<$POrxzY*sE?x7}C<^Xq}RvR)W4Np?K&YQz~ zF>gRqZHFPiBawEqM^s<|L%dZUs?3T+en@CQRa=TFbAX9oz4m>8wKbV$IP@DmaA7Fs z8cd!8JeYpE=h^aZ^bM#eA7%m;Q1d)X6;RSq&ZRr{IY4=3mHdnY-Q#0L@_m5oEqTlr uT!nujgOXNfy!}2veqL8(DAZFtqn>9tu%fV{v0|`dvEs0%-RBu(Q}ut-FUd&& diff --git a/Assets/Shaders/ToSwapchain_VS.glsl b/Assets/Shaders/ToSwapchain_VS.glsl index b230301f..eee22015 100644 --- a/Assets/Shaders/ToSwapchain_VS.glsl +++ b/Assets/Shaders/ToSwapchain_VS.glsl @@ -10,6 +10,6 @@ vec2 CreateQuad(in uint vertexID) void main() { - vec2 vertexPos = CreateQuad(gl_VertexIndex) - vec2(0.5f); + vec2 vertexPos = 2 * (CreateQuad(gl_VertexIndex) - vec2(0.5f)); gl_Position = vec4 (vertexPos, 0.0f, 1.0f); } \ No newline at end of file diff --git a/Assets/Shaders/ToSwapchain_VS.shshaderb b/Assets/Shaders/ToSwapchain_VS.shshaderb index 1868d251be4744e6adef0a130d2b456d86c6cdc9..4c3157f98268ef9a629bdd8d60286af9c8b449a9 100644 GIT binary patch literal 1633 zcmYk6YflqF6o!Z1KoJqSc|j~15e2I#R}rcKvzj!agv9u5Q`?Q%WZ5?DmZ0&2iQoMn z#(!Z<{7Zh(_&&Qkb*DL;Iq!Mr%$av*7yMyZH2IhbXWVGHMnQJc@I&VJWSg?QemVIcA{MlRQ*)ieL#OuAZFV|t zFZvL8Zs3QW+w!|!GxAS8cq18}A2x%2D@!Pfk=?7P9xrH*{jS%DyrX`jwbWnTF{Y^B zsPI#-8+m814>T2$SMSEWi|0kND4*o(?Ou$P;@;l}?we#;*z(R;S1>EecN*QsNy=N7 z7q9Mh6RJXWQZnESa_ycU`R!2XaEzl@jQe49?0?j0S(D_@NxA*N?;QBOs1Y{3K@PRa z^@CuL<1A>*aMT}~bKd*1SL)dI0miUc@?H7j|1tK4$3B+F91N`;WvB;lQh)Ia!r(BU z7K`gtmNCkTxfK}rjF=-aZp^H5=QJly>TokmjKQbYxO`bgkIQL%DHBt3O2+==iDzYu zDOJ5956&Lf05xoUJ&rzC?YbL^>4%>0$kPL{<=@p@<2m^yP3VdKcG4K#ZJ+E{k!e&{ z^bM%qrpp}So}4x^V1dCpIsUWk)7m(-=lEg1v; zt~`8dZKyZ2rw0c3Zy`l_YN5lT3@wQ9+<*M8Vrp~GIQu8X=)as|d#VPPcsteLf#$qX z@GmLGKN4{C`I=&@nuDV`b?5<%J<)Po26iMq8a+)hxdEo9AM?<&u8ukHGZ|cR+z0N! z3)MiAJsG;86?+oH|D!LmB||Irrhf)^byGaF;C-Omn7q}A|1VZ2beWLB`>8tUc3H+< z2DjQxra1evo|rSUep&|hOY4beWZZr5@4~q2S7qS5fp21=&72IJvvOuzZ(j3ky_<@8 f1K_q^S#$7gy#>YKwq8Be<(4q^BL7!f5Tn~ad3$}2 literal 1597 zcmYk6TTc^F6on7Hfg%EO^MY73B3i7Xtz_br&)pj}X2e`J6J{@g%(Te~F=pJ9Vqb5Z zHmd!oU9D|Ag>u#8V{n$Qvb;Vy`5z({bVI%2)Q^wrjn_`A+jaWU z$G~#}KlGfo-}73Lf9}B>%kccL6%5*0LQ#zDT}AbHMRy$bJU8-A25x(Gu)b?dQJ-<) z=Uy-JF5Vt#DsMi)KYW$u~Rw7%RoSe+Zm+$+58QU2v{oD#~}=o_m(^p395Z z^m++Zp*krUa2B~v-;exGD0DQ&(JRLNFgo==X$)=3gEynU_+?>m*w2Z@ zb1KVNWyQP-418Y9u^2aILAguX6DM_e879WyQ)^PbEThLt8c$_nYR<~IpFHt`j5VvO z*X6;v<0hb%jc>)#mwkKgwqp9B=lk;XVB-hc(*ynNDo>2gwlC^GmTB#;NpsFsWndVy z@`Hhgj`q%V?WwUS^qD+)uq91`&h`vBjNWSU%uAkLh?Cz~QkNb#Wi0sm3B-JAZK^l4 zrUw>vehVqeQ;WG*WXw*CucYywVroB>G5cr5=*>F=d!=e{iFZ;B*0kq03H~+3o@ft_ zKAhn`FzTb*mJIAfeDv5(F}WeOlVWJsRF};5LI#%{-!E&ttjuidEoq;vcSkYr8{F0_YY(2Sx2zc4)@!D^ P+!e-M(); SHSystemManager::CreateSystem(); - std::system("FontCompiler.exe ../../Assets/Fonts/SegoeUI.ttf"); - std::system("FontCompiler.exe ../../Assets/Fonts/ALGER.ttf"); + //std::system("FontCompiler.exe ../../Assets/Fonts/SegoeUI.ttf"); + //std::system("FontCompiler.exe ../../Assets/Fonts/ALGER.ttf"); SHSystemManager::CreateSystem(); SHGraphicsSystem* graphicsSystem = static_cast(SHSystemManager::GetSystem()); diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp index 0580d650..2ffd6d13 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp @@ -565,8 +565,10 @@ namespace SHADE { cmdBuffer->BindPipeline(renderToSwapchainImageSystem->GetPipeline()); + newSubpass->BindDescriptorInputDescriptorSets (cmdBuffer, frameIndex); + // draw a quad. - cmdBuffer->DrawIndexed(4, 0, 0); + cmdBuffer->DrawArrays(4, 1, 0, 0); }); } } diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp index 0900852c..c1d53632 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp @@ -40,7 +40,7 @@ namespace SHADE , inputReferences{} , name { name } , graphStorage{ renderGraphStorage } - , inputImageDescriptors {SHGraphicsConstants::NUM_FRAME_BUFFERS} + , inputImageDescriptorSets{} { } @@ -67,7 +67,7 @@ namespace SHADE , exteriorDrawCalls{ std::move(rhs.exteriorDrawCalls) } , graphStorage{ rhs.graphStorage } , inputNames{ std::move(rhs.inputNames) } - , inputImageDescriptors{ std::move(rhs.inputImageDescriptors) } + , inputImageDescriptorSets{ std::move(rhs.inputImageDescriptorSets) } , inputDescriptorLayout{ rhs.inputDescriptorLayout } , inputSamplers{ rhs.inputSamplers } , name { rhs.name } @@ -102,7 +102,7 @@ namespace SHADE exteriorDrawCalls = std::move(rhs.exteriorDrawCalls); graphStorage = rhs.graphStorage; inputNames = std::move(rhs.inputNames); - inputImageDescriptors = std::move(rhs.inputImageDescriptors); + inputImageDescriptorSets = std::move(rhs.inputImageDescriptorSets); inputDescriptorLayout = rhs.inputDescriptorLayout; inputSamplers = rhs.inputSamplers; name = std::move(rhs.name); @@ -202,6 +202,8 @@ namespace SHADE void SHSubpass::Execute(Handle& commandBuffer, Handle descPool, uint32_t frameIndex) noexcept { commandBuffer->BeginLabeledSegment(name); + + // Ensure correct transforms are provided superBatch->UpdateBuffers(frameIndex, descPool); @@ -221,6 +223,14 @@ namespace SHADE UpdateWriteDescriptors(); } + void SHSubpass::BindDescriptorInputDescriptorSets(Handle cmdBuffer, uint32_t frameIndex) const noexcept + { + if (!inputImageDescriptorSets.empty()) + { + cmdBuffer->BindDescriptorSet(inputImageDescriptorSets[frameIndex], SH_PIPELINE_TYPE::GRAPHICS, SHGraphicsConstants::DescriptorSetIndex::RENDERGRAPH_RESOURCE, { }); + } + } + void SHSubpass::AddExteriorDrawCalls(std::function&, uint32_t)> const& newDrawCall) noexcept { exteriorDrawCalls.push_back(newDrawCall); @@ -237,6 +247,8 @@ namespace SHADE if (inputNames.empty()) return; + inputImageDescriptorSets.resize(SHGraphicsConstants::NUM_FRAME_BUFFERS); + std::vector bindings{}; for (auto& input : inputReferences) @@ -280,7 +292,7 @@ namespace SHADE } } - //// maybe do this in handle resize? + // maybe do this in handle resize? UpdateWriteDescriptors(); } @@ -296,7 +308,7 @@ namespace SHADE // For every frame's descriptor set - for (auto& group : inputImageDescriptors) + for (auto& group : inputImageDescriptorSets) { if (group) group.Free(); diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h index c28ff919..69b8fd56 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h @@ -55,8 +55,11 @@ namespace SHADE //! For getting attachment reference indices using handles std::unordered_map const* resourceAttachmentMapping; - //! Descriptor set group to hold the images for input - std::vector> inputImageDescriptors; + //! Descriptor set group to hold the images for input. We have 3 here just in case + //! one of the images is a swapchain image. Practically speaking its not likely not + //! swapchain images will end up being images used in descriptor sets, but this is + //! to have the support for it. The cost is not much. + std::vector> inputImageDescriptorSets; //! Descriptor set layout for allocating descriptor set for inputs Handle inputDescriptorLayout; @@ -104,6 +107,7 @@ namespace SHADE // Runtime functions void Execute(Handle& commandBuffer, Handle descPool, uint32_t frameIndex) noexcept; void HandleResize (void) noexcept; + void BindDescriptorInputDescriptorSets (Handle cmdBuffer, uint32_t frameIndex) const noexcept; void Init(SHResourceHub& resourceManager) noexcept;