From b26ff924739daaf6535af2ec75981181c35946af Mon Sep 17 00:00:00 2001 From: mklefrancois <38076163+mklefrancois@users.noreply.github.com> Date: Mon, 23 Nov 2020 11:33:51 +0100 Subject: [PATCH] Using final KHR ray tracing extension: VK_KHR_acceleration_structure, VK_KHR_ray_tracing_pipeline and VK_KHR_ray_query --- CMakeLists.txt | 49 +-- docs/Images/resultRasterCube.png | Bin 21566 -> 37884 bytes docs/Images/resultRaytraceShadowMedieval.png | Bin 508717 -> 343784 bytes docs/setup.md | 10 +- docs/vkrt_tuto_manyhits.md.htm | 30 +- docs/vkrt_tutorial.md.htm | 314 ++++++++++-------- ray_tracing__advance/CMakeLists.txt | 104 +++--- ray_tracing__advance/hello_vulkan.cpp | 27 +- ray_tracing__advance/main.cpp | 116 ++++--- ray_tracing__advance/offscreen.cpp | 6 +- ray_tracing__advance/raytrace.cpp | 164 +++++---- ray_tracing__advance/raytrace.hpp | 6 +- ray_tracing__advance/shaders/light_inf.rcall | 2 +- .../shaders/light_point.rcall | 2 +- ray_tracing__advance/shaders/light_spot.rcall | 2 +- ray_tracing__advance/shaders/raytrace.rahit | 4 +- ray_tracing__advance/shaders/raytrace.rchit | 4 +- ray_tracing__advance/shaders/raytrace2.rahit | 4 +- ray_tracing__advance/shaders/raytrace2.rchit | 4 +- ray_tracing__before/CMakeLists.txt | 109 +++--- ray_tracing__before/hello_vulkan.cpp | 16 +- ray_tracing__before/hello_vulkan.h | 8 +- ray_tracing__before/main.cpp | 46 ++- ray_tracing__simple/CMakeLists.txt | 107 +++--- ray_tracing__simple/hello_vulkan.cpp | 126 +++---- ray_tracing__simple/hello_vulkan.h | 18 +- ray_tracing__simple/main.cpp | 49 +-- ray_tracing_animation/CMakeLists.txt | 107 +++--- ray_tracing_animation/README.md | 152 +-------- ray_tracing_animation/hello_vulkan.cpp | 141 ++++---- ray_tracing_animation/hello_vulkan.h | 24 +- ray_tracing_animation/main.cpp | 53 +-- ray_tracing_anyhit/CMakeLists.txt | 107 +++--- ray_tracing_anyhit/README.md | 14 +- ray_tracing_anyhit/hello_vulkan.cpp | 139 ++++---- ray_tracing_anyhit/hello_vulkan.h | 18 +- ray_tracing_anyhit/main.cpp | 53 +-- ray_tracing_anyhit/shaders/raytrace.rahit | 4 +- .../shaders/raytrace_rahit.glsl | 4 +- ray_tracing_callable/CMakeLists.txt | 106 +++--- ray_tracing_callable/README.md | 22 +- ray_tracing_callable/hello_vulkan.cpp | 140 ++++---- ray_tracing_callable/hello_vulkan.h | 18 +- ray_tracing_callable/main.cpp | 82 ++--- ray_tracing_gltf/CMakeLists.txt | 107 +++--- ray_tracing_gltf/README.md | 38 +-- ray_tracing_gltf/hello_vulkan.cpp | 129 +++---- ray_tracing_gltf/hello_vulkan.h | 4 +- ray_tracing_gltf/main.cpp | 45 +-- ray_tracing_instances/CMakeLists.txt | 107 +++--- ray_tracing_instances/README.md | 12 +- ray_tracing_instances/hello_vulkan.cpp | 130 ++++---- ray_tracing_instances/hello_vulkan.h | 18 +- ray_tracing_instances/main.cpp | 49 +-- ray_tracing_intersection/CMakeLists.txt | 106 +++--- ray_tracing_intersection/README.md | 6 +- ray_tracing_intersection/hello_vulkan.cpp | 167 +++++----- ray_tracing_intersection/hello_vulkan.h | 20 +- ray_tracing_intersection/main.cpp | 49 +-- ray_tracing_jitter_cam/CMakeLists.txt | 107 +++--- ray_tracing_jitter_cam/README.md | 40 +-- ray_tracing_jitter_cam/hello_vulkan.cpp | 140 ++++---- ray_tracing_jitter_cam/hello_vulkan.h | 20 +- ray_tracing_jitter_cam/main.cpp | 64 ++-- ray_tracing_manyhits/CMakeLists.txt | 107 +++--- ray_tracing_manyhits/README.md | 14 +- ray_tracing_manyhits/hello_vulkan.cpp | 136 ++++---- ray_tracing_manyhits/hello_vulkan.h | 18 +- ray_tracing_manyhits/main.cpp | 50 +-- ray_tracing_rayquery/CMakeLists.txt | 107 +++--- ray_tracing_rayquery/README.md | 2 +- ray_tracing_rayquery/hello_vulkan.cpp | 58 ++-- ray_tracing_rayquery/hello_vulkan.h | 12 +- ray_tracing_rayquery/main.cpp | 48 +-- ray_tracing_reflections/CMakeLists.txt | 107 +++--- ray_tracing_reflections/README.md | 16 +- ray_tracing_reflections/hello_vulkan.cpp | 128 +++---- ray_tracing_reflections/hello_vulkan.h | 18 +- ray_tracing_reflections/main.cpp | 57 ++-- utilities.cmake | 50 +++ 80 files changed, 2446 insertions(+), 2351 deletions(-) create mode 100644 utilities.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index ee6f590..9484aee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,37 +1,42 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) project(vk_raytracing_tutorial) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # look for shared_sources 1) as a sub-folder 2) at some other locations # this cannot be put anywhere else since we still didn't find CMakeLists_include.txt yet -# -if(NOT BASE_DIRECTORY) # if not defined, it means this cmake file was called as the first entry point and not included - # check if the external repository is outside or inside the project (as a sub-module) - # testing the file CMakeLists_include.txt because when sub-modules are not cloned, the folders are still there... - # we also assume here that if shared_sources is there, shared_external is, too... - SET(BASE_DIRECTORY "" CACHE FILEPATH "folder containing shared_sources") +if(NOT BASE_DIRECTORY) + SET(BASE_DIRECTORY "" CACHE FILEPATH "folder containing shared_sources") SET(ADD_SUBDIR_BELOW 1) - if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/shared_sources/CMakeLists_include.txt) - SET(BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../shared_sources/CMakeLists_include.txt) - SET(BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..) - elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../../shared_sources/CMakeLists_include.txt) - SET(BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../..) - else() - endif() -endif(NOT BASE_DIRECTORY) - -if(EXISTS ${BASE_DIRECTORY}/shared_sources/CMakeLists_include.txt) - INCLUDE(${BASE_DIRECTORY}/shared_sources/CMakeLists_include.txt) -else() - Message(FATAL_ERROR "could not find base directory, please set BASE_DIRECTORY to folder containing shared_sources") + find_path(BASE_DIRECTORY2 + NAMES shared_sources + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/../.. ${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR} + REQUIRED + DOC "Couldn't find shared_source directory'" + ) + SET(BASE_DIRECTORY ${BASE_DIRECTORY2} ) endif() + +## Various functions and macros REQUIRED +include(${BASE_DIRECTORY}/shared_sources/CMakeLists_include.txt) +set(TUTO_KHR_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +# presets and utility functions used in all CMakeLists +include(utilities.cmake) + +#-------------------------------------------------------------------------------------------------- +# Package shared by all projects _add_package_VulkanSDK() _add_package_OpenGL() _add_package_ImGUI() _add_package_ZLIB() _add_shared_sources_lib() +message(STATUS "COPY ${CMAKE_CURRENT_SOURCE_DIR}/media to ${EXECUTABLE_OUTPUT_PATH}") +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/media DESTINATION ${EXECUTABLE_OUTPUT_PATH}) + + +#-------------------------------------------------------------------------------------------------- +# Sub examples add_subdirectory(ray_tracing__advance) add_subdirectory(ray_tracing__before) add_subdirectory(ray_tracing__simple) diff --git a/docs/Images/resultRasterCube.png b/docs/Images/resultRasterCube.png index 69a3f4f0105f8e40125ca628b4817caa8c8ef2d3..7298d3a29077ee6520aa941b61141efee93c4993 100644 GIT binary patch literal 37884 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 z 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�`d=}hOQy6v~bjDJV&dhv<9^*NWif+HkJ|Y=^ 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 literal 21566 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%0A2RNTdR_HPdPx7 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%0DwetO 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

Jzv%dFU*Uzop1mY=_b_0q=1_-9(-;nP~C zu^qDzEW0X}^>)scoHXU{rH1M|%}OMA%q2V?2Om4`Q#vE7Bzf-IteNYCY_5lduBesD zFN*b@dTWj4^yfR)MNNHDac<9(7lF&pRvmEIw{>Zt!2h z@HwtIS?l;6?u)XN1@+nVQkZ*yQd#M_;83Daet*PO8A-*n#DZlTHR$Bh&8LZ{^0<~4L* zzo958uwypIpj0(JQL=H?F==-P4e$F!S3> zj-xWcM@4k(_uO*ke!+NVW37b46Db1@h9W=fFW&k#iyueGhD|m5`1Y6W7R%>~mWR^! zJUh;}bYqds(c(bEYqe@_Gh@7Vt|}g%;lHfgg#?`TlZb<`RzOJ z<5`!!V3uEy^ja~3=@Cm;GHd1Azxmr4O86gF)vsH`%MyH&t!$;rW~P%_YnL63%Dv`L zIw?msdhPx1cCy9qt9f=jzV6Zd;A@DK!v4^uf7hM*a!%td|3#mfMyb2RKqF(Nf`_l@ zs~*!Z{IzoPQoSqT(@#zJ@ir;$mVT{mJ9XFMz~V`(Pi@!UyKC7Z6B8*P<6ud9BjbtY z`S+HXW%dcyrPQ40snF6pHhE8MT#C)fJImLnC)~+B@4I{ZgPl9$3S#EBlz){x5~RqM z!1;R7+*v8vtM<)dKC>m3`S_YGk(=YEa=%~2mAkfg;jUW`c5YLKjXbZ?WAF{v>Ste}=&Ny5=Vb4Xlqws9T#YSk^j=>(h-B z4Tp{5QkY*{oapFiWS4qq*Nx+od-!LbGTN7NV8*p9h02_gBZ-wMF2{SSm3DCJ8yQbL ze!MX)P08Qu@{ftjGd9khA`O({$G-=IuhO=ew7deTy-7>Nz6EXDpT$2i(T`sbUvUI?AN#o@-n8DSX?Vgjsok87E3q|XoAUBVLf zjyYw%ab>GS$JemTgU074GUT!~A(p{g1=uPgWm4nf%x=G|eG;K~7iv;>C*} zPx5NMw>>yBVUL{G@4M4qo&s+mgdamF+WGKVxK_fJ)q54cl$x$?+Wl~uH0xQGvae;^ z+r*fkzAM{(Tw&V8fM#2}$rVfX+kTNe@M(v|AN| zxCjfJK1Jl@>Yi7t-daknGHsTWFA7fX-E*{}Yo$!^%47XDSI*}o`=3wSBYgg5KzO#n z?UmIll(ug-X%joNi>F8Q-PNoQxBa}!vS-Yb@KV_6sBJun^JS7r0aSAD$mW(wnm^DfKwN(FkdO(|zMy7_WqVWRsCBadZQ zXC2U6b<#R5{c4u2I=@le@||~Vo>&N1MsA*9`}EfnUAB$w-)Gmn`{>x58ns&V%F>%B zs+o1K*?s@9;owKc+qb7@Z)NNH`ztZD-*bc725x<$wbxk61h0uQ&g3$ROG#5Po$TB>(!= zR6noV_V>M&a=+Qx|2Z--brjD_J6O0zuX^i0&*sc~pMSg$;8>Kk)-66oBThSNbz@X$ z>;5yhS2y0fk#*Kk`)Z*K9#Pzb$UL$%We0w{|={R`9qtUT|C9J%Mexj?&H-ulX+AlCin(w72Jyd-EzL zWp?TXGhBaD5ucI0M(n_~u<1|toMfpoeASs{l02Is`-x$RXJ zbH)*!C%0yKITpwIw(dExB;v8Zp0@7B$D0D;;+9382$}Rz`S)kD>>S~%A2=?u6g_lR z+mgLux$oyb&d-lt2l>vMDPiUz7q;Tsg1e^;AJ4AZb-R`)#J~NSa`D>x4iXh<%QijJ zm)2lDX}D$e-G3)uZLojF@%q)fbH69-p4pqT=Cc@xjbHX`5q@9DbmGL{6Eg3oi0>@WEBc~*IjYxhzSX*hb;8>Xm?b63@{JN|?tJ^8 z%zT0=sX4jtV(#`T5Ah8=5|^WVyG`HTm^HEHQ_EU))u^?ZYuUP1s!UGfRhe&Su`EmG z@UD#QeG7Wje}222KmFZ-`Z*O71dAtqRA4?D(xa@RoM3V2V>8>~i`6~vB^Z`X`m^EI zO4**3BEno>H^eGW;Fbu!ZE`^E!&lq&RnIQZ41KB7kQ5#yx%IWfA_jw%b5@BUyIW7(_%r<-#a{`~v?yJLAw_Sacce=}se*}ts0nq2$L z=z3#XgJm7>Ba%9Px+r{USZJm$;S+-#@S{yF7fT=!(wD=kL@kHD8ELY{t2)2E{CSgesUP!xm1yA`S1(>u(*JaVAucIu75kwd1?!pi za=bfqc@4w*eR9n&hYUQBH(Wz%`pEt+Kn)Q#1Y6UM^-ksz9gduyz!Hvc&h7ihO?gI>ao$!j^^9h%M~z4&OIap|D08E@)@nz`D%G50;MhECU7vwHt- zSGkm?Z5i9sc&4N&=if|u5T$)1cg@CXZSSdNcP|C3Gz^S3&);->x};4$SM-}1Gf#X{ z$-g`4$HeVzr#=Z)_PhVGzVgb)BVsnAapz^*xo1rDLT8)AJ(0V8c=4I*Df0@GYqtii zn>qCihkDaCxAt9MZSKnYE?m0uUcxTF(3JM)QK5aar9Nn0ztQ!5hu`zwuiL`Iwe5{Q zPYBG}+4p%u^sLz?>N6`(2q!lu=Iro47@K@p?wITC@_7H{TIUzD9cw9l=)SCp$Hc#f zukGDBz4c=JUvHaETC=yy=jn{UFFB*uv9q2`RzAFQ1L)|Ca^Bnfxs4}&R65;klh-dT z%`LpmPr@QNFir2%KU=nK+TETN)16I1Q)*7AMCzZZUS(Q+#wjjtQ+2t1d+n_1J;rZt zXJ5!p=<%OvyXSbtr0?(VE)L6Pu&kQ6Qt9}$Y!->r-8%6`$_vAOPvBpCr29-xO2W?{ zx?94kMI$#)@XcCp#|Iiici889^>KtL+XT+{llUWd#UAMSKcn(E!^c=ofz?Sl&$omX z^Co;V%bs8Bv)VNCYQ==dZ;}~iCajC`n0~FsL43oTeaYYDPS?-b5_&p%j)S3G%C#F} zJPOQvnc|ym-hKU+c&lS?lMLg8Ra%Rd&ic){;gOWUO0kUS6HnQ;%%c4leoLKXff33>r$g@smJM?-XEFCX2 z`4F4Gl<|wS=G*-C?cSO79s7cry!QWSkooGwc5#GRQ`b)d z)2HW5zAm2eE@$=iAIq$o6K_rXD1Tjo<9gA(dkeCi_pZ&_`p)3N(pIZwA?DIo!a}Fq zh*EXPTeo_{b4~8s+jB1#3p@&q3KBWx-R<0Z&^W=TdAYK?VY>!lO*%S zkm-`gSv)>(l~g_&lX76^+NFVOubeT@GjK@DKcleg<^#zS)282SC_fOVofyy3P&$+2 zc~-vbS-z8H_cFA>rL`&JX|?8OVSi3!t^HyLuX zw-gx-9b+pd+&o;~bG;&`r9qE5Av$xbTSebT1%C+<=93JcIv7nFV;PJTV}&1oyCHEa zb;6s**x*^6XRM5k*WNrat98y9mt);$PAqTzX}L8a*mK#@S*r|_)IK%--F^6EG+%pc zS>25T*V7f44={X;<9}uJ(ABN_`@5@JpsBFKGP{$yO%r$oHU~x8RT=Bv_%W&fWVeoe z5z|SQQqi`uo%}cVo>^=lajkj7p_on=Qm35nZ1>Hll<`~Pb}(AJiU6_PGe<}z&CUsf#>u;zI|pyK!U zXYWsbzQxMm`1ebRGq=5}*=;JY)+}eP{U$D_`@D-@d51=bKKQ=x`f-PqQ>_AnRKvWt zYBm{O(Ak);eJ?F`do}ANwR!tjb6b1ty7ZuY?^L$^uh*JKtcr(&`D-lO@w;s2&NwZzmC}ftBO4rK zc06Rx%x<0wZWVo**M7`w%sOUUTE1;H>+b!><96GewEcG6`;lv2xxUe>W6e29PlEIP zx1V=?_jTuqkV%}NZg~Z0WB=LNwfdU0ZPd+Dp#K2Ms;1HyCc7$oYOzQ;+z} zlB}rJmT9q3Hx{lkES~sW^vcr)9*Or6!nd~W*rD*#C*_#K#jL%?GB>s#Px$U&k+`Ae z^u@zj+xrS?eq3mDv19)^ZSfg5yA*>r+H0?>^LCW#epC*&T-GZUU{`tP_S)KShMW8R zR~D_=mVMTxjPXRs#HY^t{`NeW;boK6&%N68^ofMUGr6eMjSnR*JY76bW?JUvZvlF4wyKP=TcU&a)*N|g zasSurh8}Ut_bYw17O<6bJ)0zNen0NbqNG=zR}L&^et&tj)`pJaRp%Sj16G|{cX0VT z^Fq0U;R17ZpO+Vw|9)rlzldAQ9#`&}zc>BO$2W!h6=oFQeSZGnyaiT`DWOYN28oBP zT4}UD&SAaweYJOQpVaI>p?LG#+uF|1)V^fbnWjv|KAh$9o0oU2Z@rKmEA`dId#j`F z2X7|x>U(LtZ+2ae(7pD)JMPJfJ@GS5*>9-rIsGwv2_tBfw(fdx=7Zh$K!XX+nICq~ z^J0Fy8gz_i=A-9^k7j7HmfZWWxo3X>hL9`Apivo5Z?#iU0MMd*{>`i~Q49ACTfWcG>5&Dd)`}6F;h- zULEtmxh!Md6p8OG>N7)LN2RIEj`*lrzRkRSVxwN@{Kk9d$`p2(`dsw0%?P-CRjiGz z=ICl31?ID7{MdRL(-kB)sBKxjU0UItk-@uw*`{$RS|`^y6e((aFDaHey!+P^_rA>& z+u7I;X}rDW+{~1?2fQff)RHLu0z31ydn=ot#D0>{Z*l%zesXq?`by=q*3ezhJ7#$z* zYn*d7s*BmrX7H;}PT}*vBzFI;R?#VsIu1sgzrC`QZP8V>6hL_hyP~sR)&46CuI;^YCqUVPtu8P%we{Asv+rp57dh|kZ#p!&hu_lt-^z_~3uAvw{HR)9zU^f38K0CxyH_X)KX5%| zdhc=LKDpiRj{j*iHn||)_S9C6BUvqBroF-nCF5V6Gfyl&yd}Zd`R2Xfg3O;MDu&L; zT+KGYQ?frUWkF?0%gqy=;+1o{HaivIZxR3#(sC12oi zU_R2$_lEQL_jNPg#96aXd%Sfo+o1--xD?yzbA@k|7W|Kkwq3&g(0SQessA7AtnbY~ z<6_tGhCTF)Vz6geRH@Ll(pO>4$qRlS`B?C;&)9R(SI)Dp`#yg&et77o^`W;6n>t?^ z8c&>A%A>%1hT&7|=W?wTr_&WT*H;Ujc^aA=wRWWv^O2AV6Pb4L^l-jp>XV(KFCkIw zApS4;L4;jO<%G#IPjs@+^!oJb=J9uqeE~hsXOzWho$!~QvXLom&n z)u%qZk#<(9pD`(6#_z|b3^OMN6!M5L<>savyl`=tlvwp+z2?(;2ed|&ly zt%H$c-=91E&m)q5Jg}Yj*|;Px&+qu3yc=7y!{0?M%aT|7xUZh|2cbqrdVN{x$x;?!#pH-%&5!>%SB~ zoErXb9{}tZtvFGatXby{#>GnG(aTb;>p;8w?v0SSqL9v`n6}>(*?Zw%Tb%p)n4#F8XdM zz8)5SLjLZpkoDJIx-q96kdQZ?nrU1W7+nu{iGdix_pt(B-4fQEoBo^ zcr}EtUA=PS#llz_bJJb?Hy7+YynGY{yA>^&iOZmYJ;o$b*9HBT<=i<$Lx(^{rydv~** zXy@PcU&29cNB03e)?!J4$HB|Gd?tN;c$oe0MdkLZRlZ+mlw}{mFA*w5uVdwe)UP(A8xBEq1vHHM>`x5P!eRnEeDxsjIzF=CuPK?w+yQ#~>4I zyDvE4&yB_Wl05gPa=$or-s#(stZN*{-Z|?rBu{SI`G((`|7DSd+r@q!mDBY){F}B% z?B26=)~nPU#=2Vx(@oVvm=8G=<;eC4NHDKrc*xPdaq6sO$BnYuiMRS1&vMLpQ`qbB zDkAWil){|d#}`cf9AVhEfMya zS-5YFY#jdtnS(QJ6Qm5pdTtj#jaxkT^R2J8QaYb)S6+=;t)B5Y?&oijg_bL~-TwVn z-sng5c|&;@3yt{SYp-o_IX?4P=5@yCsP&&6?lOMIKy{h}Kbp=+RdFsD=+ony6UKt*oGRJuP z{B!fSeqWlYtMdPI{lDCY|NqSYpZ$Mt{H^XYTkU@|+jH&zb9#T?gg@^?O8@n}|G^mh z`{n$9t)N4X?w7v(|Fhms-0uI+{d^%yC36GM189)C~G2?}-H zXmj$6W8S*OZ+BX4F}<3>XEecw$*jRQK>T2AgJFZu(yAT%gEx51Hm;ufR3&q|)|&2X znF-U^hsS0*#6~ZjmOa0-N8IwG&h+W6U0p`8$M2u9P;;31s%ZPc&jt1E3#NYbWB71F zfieD@X|?r}<}{WoPcr6fU3Mt)E?&Iq$cpn1b{{ zdf<*rf%w~NcjwAxZB<*bdjER&tBDLVwLbN|G+Y{K+-w=v`%&?{U$5%DWQU3~3KcF7 zY_c!d>`%5jGgE@~>F0^+yjALl&$;e7wmI?nA-??m^NbnTTGE&0%q`RZB=dOTopu}L zfO)*#+@0c)bt!vJ6elJo+Ue-(Ww{wGx+`U2SCX*)(C!(vd#*P~<{Jgb>^-r@J;&B5 z>+3=0Ps+irc9oAJjGny=0A0%0TC92WRv74vzC+Vxn0IF!XYS*Cy+~G{t#q!%!Ja2I z5!YWfZO|)OmLRw3yc64u_W`Ps7WM2JJlB_8QnlK2!>=Hw4GmgX?@edfct9uM zH&es!Ikxlf9^R;RjPuB*?{i{Ldu}*W$aEol>H(AZ_T+tR&kvYRSo3^a?cO-s?cp;b z<2Oz{Wx8J4HR9P}hI_($uI=G(Fn<27(9FSXFE>wTATEJ|*D&tXx zckX({X~y3ld9oEravqhsy~@=6=7Jf;l{1A4*t$Yz{=2|l{CzXK$MNS!nSxfB{D}2m zdhmUf7VnO0-kA?}&+}@&_cct4C*CXb{lO?vr-Fquwx4hBZ1Fy3Yqj*phK(Qgd1vaX zFz;q4cz7?W_U`q+r$0pR|60BBx!@%E$|tIG>%VQjFZJ*K|L^6c|MLHx^>002`)>Kx z|N8%*?hi|~vU3Mr^rrR)@`ZI*qLXNv23qYK%P-So@v3mtb8Gj;6Sy+U7PnR@_gOedh#P9^EtK3 z{>J2*V?8BV4{kWj>M~S}Ybm`N5^A9!EnAH1-`}PjG|)a(*=PNB*TFAS8sBc&YZtY)diO2n#q+J+Zgeo0 zdt%6(BebS^m$iwsq`@@#oy)yLpGe$j{h(HUdj6d6%9o3J7l})9%v%&?lX)OV>8+H$ zk;9p;?-iN%9B!N|e>-RTGLu)C%N1tMJW(;}qmr_l^~OtOvW_zY{m-}^tKO55aOUH@ zsdLNrJP>_yr2CA#v9<3R*JIs#vc>PE?m6+!S?`O|@IR?k}#QFQPHQmkc5x;qkcT%J2*2vpj3e}~T&#!E9>(Axcx=3kNS(4V0ZOg@8 z?GW1%xH?v{p@yyE%j1ZRtOkM`PR>wU|LBs?-$~b|$JZI|nc|SWhJ|@sV4=Q~@dWJy zrVeSM0k`E|e_q4s;=ZCU^riW<{m%})Km2rF8sq+hn;k5}1HX9{wLG03SK}A(CgDx; z#*E9)Y}5Qdpz#b>eoEve)#cteC*c#ec!V8->j>vG5T}F|4&cU z%Exxq_21I#6YbC2>3aM#|NqSX$-0Ssf3Mg7HUDP(Li_M?yRSDtsMmi=|5p5GD(FNa z>4(w#zy2=z4q9CW8CTL*v|D-R%e5;Z@sg`}D`v*}q(=OE{OwpkY~YgQrY)~loxbud zCURS>!rsEeZ2@6P0kNTJ{hN=6PdTysOvZ8zn^T}QuU&5|Ic{nN&;I-(VY=*e_NLux zZoi&*v!!KzUUsURf7jxzfsL^t6FxdU_GX*MnDtCEJXEUYcIj5H>pSfw-xs>J9ya>- z_>|Z0S*BM%DQ~`ZZ3p|ziveHNYEI}jl%#h%7Pp_1v}O$nE}SPNFT~T&^QG<%dgPp@_vyupjwL@&EUwi5bn4QaNozkU8jH{L+SJF}kvv2Ez?l{5{Lg3c zo6FzRw_uyZ`7ViXlg;tn9KVVly0Z0se|uZmV%gPM)3Sd~;+^pQO`_eWIL>&Zg|R;- zJax6JaLBzD(!00ljqwCi_L~cSoOwC5`JN0vcUTewSw~Dcr z{|g^E_7zXa+`R1WtZlE3%T>D+yg4wZrC3tt_^FN66FHxDZSKol`OQnMK^PFyD6(V^Bwbqo6Jip?>RxM2~A$mh|`5_aiGi+BK2cm z=+eFaoIb`~l-&Hy_VJtrdUe}H-+lk~O{&0dN&VqNe@)i5K6yU>f5?yD`~O#mHgJEp z|JZrHW&iKp|Cffnmj83GUbybn@;bBfw@at*^IChE!EnMKWBbqDJG1ro|GD~5|Np1; zUv?aqt9A{|a+veG@pVPK$a?j+rEz_i{w+8^Mf38nSKd;SE;Hy~zRLN7)oZ2PWA|mT zmA|L;CT>`MRbh*jNdE1V?^CqSa7R3ycki6rS@mVC(iff@ews@WER6N#Jrk@K+Ep6qxv}QLmh9lxcZp`3=LY{>D#Sa% zujh-DL^$`ZkCK<=&dNM-V@_q5ebF~$@=Br2+e~hKzG1j9wv_FZZ`nDWl)l%mU$dN; z)qUrNMxgJp$!EM0#B;ArPHtvOU3IFZ@}cuQ30ac`avaHQhtF6oJ6e^N6(X8)YklTM zIk`=*w;6p}c|T$1V@c*5&@tM}u1ftktb6kDVq)lw#?%E8`bLZzbv9yZYCp<1C;#4l z`n=mb9^;CM%RegZmY>OGlzXkE%HWQ*l&b#sj_PoV)#g+J|blfST)-msU1Dxy^E#VN=47KXZ4vO^sZ6jqPN)>c8ZYiDKE4pDAf? zc-^%2jrzV6#!c0eM6aRYzGraLc$Ce0#NN{d%zjCfO_*VLvDE9w?1tI2W=u@~_?g>0TQZ zP5yPFowtj(kGpx(y08Nq z`|FDs&s;pc=3@Zc#X=L2eaQ|Mza}qcIjh$9_%oA!CMY9ZiTV-i@A?2Vh2ZphsmTXW zlj_6LDc^ow>*AM{43FG#yt?IXd;Q}>wRQ79CZ;~Tw{(lxq>JbOz0q&I|NrlQ{hDXS z|DB%u+yCwS(7peMHrp}#<)7F8Iki6Ab;hd={oTI|W1mY+;9=PR#cOZW7Ygc59P?)rDn0kMEUbJ3aTT)Z3O1vcaWn zIj^%gu4eJA?PX~Q<*LfoI_C-yw; ziG5%3M8V?>MhkpYXI_}H^QL6$q9X_N{yB6OPh@=B`m>Vxp=jlVWYNe2d&CvgmSj%{ zEtR>b+lPmHqDp zZK@-tpX2Ree8MgyZ#2Q@b?Fzy)lZ`w-emK{OC{K zv}ya_UHM`HYBgLLbq^~aoKHBvpuhIkqWH?23yd0**psym@*SyKvzF=P9k~Usb5FK1 zyt*(a{;}by(3Y*?8(tOuv^^KUp*r^Co%NOv_6gYi+ZfJzapNl=?(f;__s!W-UVXZ( z<<0fD%Ez9WWGq_*+F?>l$+6^UZlD z=!a(?EVl*CxGmiZ?rY5Z8YJ~&-Sm50DxZt3mxa53{P(GNV#0+(weKE3uYGuL=@hn; zA+_}n#p^8p{Jr1)!T#Uz`EC1u&i+4t!L%;J>zUKp$}%^q^>CjzTze&kc~a)mW7Gc} zum7|BVR`-c?}wM$|26@4|g?aB64CKV^9y!3XwE~>KJ@wRyI zn`fH0w-?V6ZSM$U3P10WoTFC+OQedAH~d=uWUNI^5o`i$CIBk zeV&xL{aC+Gg80A3t*xxBWrcf+mxoWwx2*D*`Xt(4hPPTMLT$t8#v9DL8J+~I_jAtp zD1X_DSL1S=Z-MynhL46eC$`H?|9+#?N%wks{^F&#oOi8IxZijGM#GOcxok(aJ#sIz z@MDOa@Fp(h(5`bD8%`hIb*KGJ@x;u-=YCH(f3m%1zT=0Z+~PbedRRUx{XnD z)_<#7D#01Uz3#Qdj;HrzEaIcqO9?QaVK6!_xK7!EdB4o@&)4HhCy42&e=mA7;m!N@ z`uQ~(6KV`5yqS3I?T0^G4sPBXzK!Wrjey|8ncsH^7~I!$t^fFxtzfUHt3;Uf)~J=- zQLB@yOO>>a+>84A?@rtrIp&)-;>Xu~{CW97`Q9mP`(Hyd%l)rGQg_x&zt;5r>WiW{ zbNNd~-!$LeiekJn-Rn@CcKZ|Yu*NKrw-@67UcEozmA{+6&Bt4>L6!9TpY!BHMQ0iY zY;2M_s1%&N6>TWKYYd9gz?vq;c%d?5IZB7>6 z72^22YMlsQ3HU+f{18ipRKZ6BgXP`tHGr8gA?TCKjx^7*Od{OVpd6K8f*6!S>*CTz#{BqXaTT9Ab z&pRj9Xz=#R0mI}44XF$>CkBTs%bcI~Cb&F(_oX%N4IdWPg*M+z7rEk4-ygM>_3U1` zYpf#1(w6I5N-}PUzn_Xb6+Q(U6Uf(?} z_u#06=7Wm=^HQ6Wwa#u%eE&|=(Kw)|Y~|Lf<=@KJzuEHqj_kMDE7XLSZQ8WQ_+pV? zOPS%OX3J@I%98R$M)H;K;~I@NPgD(^x_42{qaT4wql9m3+Rz!?V7yGP>9F=(*{O^03I289sZ&(%FM??yo%ml zbJ%#`2IEYxO$wIm$NW`v5BaZ9(h3N>y&-&R?7RKCUu2GddmO{P^}x;ODJx$vP3PNU zSEaelb~Dq0RWH;QMagLI31Zr;zyHWRZ>HG0+&k2CuVsjOsB3@!7-OTxv^C-8zP7{b z<{#JEs&$p=fs^EmTT+bneG`)G4;gAdO!+9c>cpBo{xQ#E8spFZe4%mc=HI;~@kNRm z>z03DV?G+vXa8y9cK*J_NlRyB8E8Ltnmk)u;_QA9x(x zcRaJ$7W4h<*S#yR9RdwgHCzWxbjL+;Pk6o3WJ09=(u1Iu)~!oN+GjXBJFkq_?|NOs zFsn@0xBOn`*QcJ0uU;?wdP-E$@~za>WTCb7FWUd*p86{O#j3(KbNy#;-`4;CJ(#EZ z%-k2TD^1ao_s~7RkDe*ZRtNjK7Ov2`pXYE#=ofFu$}d5zYOPWWmTLK!&g?R{`bduX z)x&+$F5C^1X4|#$gjvf!z2=*3T&y*rk{**IV#9(`&R<;jE&JB$kFvY@D_0-%LIID{AlUC4vyR*HfO~v!tr@gwiY*&N)%$vu5^xck@o>Fo*FM&sa`MATjsCBnz znMChgdb0UI6i=7uj&-X`=NDxcFOFIf`BCL``CepS|GS<#r^y+GraJA-*sQjM+v3>tGb_}iR;wR# zKeVFJaAE9W=jOzkGqxvsj!BqBxG5{M9*j+1?4@|T+a~#e&!Mg5c0Mako%yl+>C(!x z?#r5dHf_Dey58)4l-k8xwI_N?taj9|Z;-E0c zGd|09y=jd7lVDZyBEX`@{O5kN)Uy1dYV0v2(M*)qCT%e=YjpQBp#h=kMKwCW&xj{r1HN` za^2WFBl+5Mo(~Lmy}p}@`;s}t9e7NReXjWs`bhU$Y5Tbw*Lv(ee!PC@cwF_-M#=RX z9Cbn;hR4_5JQvGg)HOB!T|D=>k5bydZmh2Jztex zuc~-`EFeC1)q!Mbu5YW>Yw|kV`Yt=Rq405= z!KM3BuU2`poKa?;%XVo?z;q48-5d9vdT>Lr{J;@8<37(7%cjoyyy?;+l|8E?0%Bvf z#45&z%o0qVUuDHx#d}3sIxFO2?xv~7FBjQfxGZ+8t@^34+?%%-iZ2)Ox;(a?C-eE{ z@tVKiu01ob&b(lGW$`P6?0A3ojO@%XZ?o!<3A1PM%=10#>$}Y?GdHYa`gzx5{dY1a z+`a!gd49%RIax`L-P50oJTT3@;8Qv?Bs)z}_=;)H1Rj~odV4n&+g(qx-Jg8P-9h#3 z)t2%=!)H>VNqbIAW;<%QA-gCkhB20wIC-}@ZRi4i$e@ETk==I0N?jl!Qy-gQA{q;3>%m{nHaX{W&qE|FPXnAHJ+aH!Hw%$97 zwK9v&mGx?6~9G+aIRYHVx-aS*~x)=D2TEy~l1|v_tOmHE%xey`;wH@Z6rEAc1XCa;fcd zmI1PKwh5Ql?GNr^j6IOsaz8@W?S1X~*S7Bq7yR4AvWE4_mYDtL zpDT-RixuA%^Z8(`)Sq?JL96zrupIy|GSy$&_@qjMH}2l5OY{D}4Z3yxd`Yb)?=1cB z%z!DH!3*yRdiXW3`YQ6!Y39BiN%IPeZH;@i534mly0%QJvFPKswF_5ni_yGx#w|_n z(=lH2le1%@ws_8a@^Ig^3%3GRPRTyBXO(tWslD#4T-`HX>v%$+9-Y;ACnP-eLsZ&x z)x?qw?sBPn4)#o5RCV|E)2s1Ldl@oqPV2HAW+*OAt;{gcIA-mWZTc^nVQ1IX7WK*< z_g9}_u8sBDm6y4Sn|t%(PwK|fGi}569XoR*;l;ZQF^Bgvz{Ci5CI+kTdc zz}#h%cofP@x3!uzKjt{Gc5O@9&p#*1YEH4tzQLd0q8?d1>7(*(c?a-uGlxQ^l%Mfy zsccSR+C8JzXV%uHUB}!*1DEZU%Ktd;uJz$VGNBJ6?;f{%uqWp_Lu%A&@wZaiqK}Ur zsprvnf5TAQLv4*Vm;R>ksp5x}K2Lh;9ydu|GGbYikAryT^-pr|?@Rm1m|w81y5aD% zLE+~N*~@;s3gYM7?UEK9y%oK#e`S@=qOWV!CEh<-d(BRIrsc`wwQnwKvM1M^m{-)R zKJ(P4wM@ykKH6;QKA=}~;$pW?LHNCPpA7NDSi^(29B(r3GP!m#jQwFXPaSXDTL}v> zh1-^lu^nDTJ{!WiwjL~eI78iOR|I47ce&l_H?>by${XcgyB9Y%e`DVTpHg9sW69my zXNYpJ_3SVveSBxemT-_B>bSL7xgHQaFe@s+Gx0jY(OA9@UAw6_a3RoYBV?AyCk zisM@`i$U@J)9au1f4;uLg}aKkNwy~bWasmrPt@a#YjxO<)!gmh|7{h+%;GrdYWdB! z^Sl)kzRmk^r|Rs<(gQbEpK;iKxM<2fWvw$z>8n2fYjloL)(~fUHnr=@3+a2u7}jl9 z(mIeC`pAOm6?6PQJLb&!jWX*QuWpGcey4j~FLd79If8)=Cg=H8;`=T!RM>72tGVu- z`C&JBWHms_WnKHF15bOWe3OaiS-N+d&-Lk-4*bZP$`&+pUHn>YmE{M6m+AACZok@k zt4ryiuISTweQaCfuZM}XvstTu+;z!ex}ooq;No+09Gvggh>%LX0$A|^BY zk-YWZZ|x#>PyW^YIa&M8eVe_ByL;Oc_j&VVj2q_h>@E}9XR6B(7quX_O6|$6xbeSt>62?Oo8I=kitJV$$CF_wNc4-mlxRr#MhFb-|1S>*lhZXenbn z6*5WCF2&|Vhvdm>3FcPuO8w6hzOS0((`2f>Fm}10gn+b0u%+5osQ|V~AC;JoEzc{p zD3jk*J)!o=T~rl(TMr43hkt4()oU!|~dxK5jyf$hD;| zuT>VDR=8PvoTcRMdb3yV@|7M9XEru}W_~DmJ9+-9kCXi$7%%IcCHCt0p0!pJw@3Xh z%vpbJ$HFCNtERHg+>%<^zj)83$cVozuU2#&6MN0k%6H)Bw@ik~T-pa$K`K`uWMn7sB$@zUSXR@c#X6 zb=JdYcUGU)&%XM4;ia7Q6N}}9_xm5L`1JQTq5&}I)U2hO4q%!530VMm+hM!U%c$Key^?snwox1k+~phALpx8Yu9p~@mRN(b=GUA+Su5PysUt)J7$`_KE}paY@d5$?b)oQ zY*UsWYv)-I?d)IPelTyj)2?O5*m%R#P40C*(CaOgk~`5`rL-iwVuQc#4VD^1e#!Vv zrw{L1p(cFC)Wk$X->6ZoVxqfy+u<`;TEZvsc4cn<##PL8mhB{mgK3!_MwVMCk{kK;iIR6ecjbod_J0WxHw`s3mc;8zZ7_dg}*3mU7x5Ep>KTnk8 zPQB%SYHRgGeo2Gs>aP>z8x)$N@bk^g%S=yh=PqsP`Jgy|Q)uzT^B0}o zGRA(AQ%|0Ep_2I_H%rk?uY~FA%U9gB`UTqSduH;XT|85g6U23|8?N!ry!QR>YO`zw z3${|%2(<~_QycVHRNNKP-WhiNOMY3-7n@C{^5-6#~bq=KYj93NhUss_3F!rwP{bc9$WvB^RhbYsh{r; zGTuqFtc!SXe|7D7rqm}J-n?(E-|*nQkV(F^lKbz@>#J5U1V8-Np!Z$j zxPo42$7Hc=t<#09O?$Wg`uj`3;c9v`_utbWf3mavxM?zh3)0fy2Tc}(n%v<2rx)`{ z{m`Y1;mcloXHNKiG)QVkYSr@+PY=K5g+4PcUAYypaKqZZWve#aP561Nzb>SB(nopY zOPQ@!LZ%*5?`#KRrKpnS2>f8+%>DWY*qatu}1F< zPy4!UY^p)R9M=MZrCzOY2p4Jp_Drhzt5pC>NoowZzz;btK7qk{%kXRE078WroT#D^G4_JJVB_^ycz8)u8pySx>Nklz(r2VCmdj4nIFEtWCUr z>fDAsKBvCQF~@2h*%B%JLGH%#z0PMG{SNK=pt|{2sr-MJSzjj}X1`ig`)AthugohA zHgub1JMHe1J=w=&UGU)fp5v_v zJHtXklqEJVyIZ{W6?6Q&{H1BGTiU86uD=q?3EOvl#fwOTpbn&=?BC9y!p|Re+R7+)6RAY1d5yw85vmgsA(^tF%>F?s&e6%RYJ8>*xl( ze~g@x-LsFDD$=G8Bt=UOS#=#=tgZvgOH&{+XRV*;~_;UjGpb zo!Eb~lIM+8)t41byFMsBcbqAfDA;u*^b8NDQ7M>%UxoXU_R4R+ogMLm6rVz&ua`uhnoLvaNKn5 z&<4HAi67$Rp%ZBJ4I&z4Hlo5#fhEz_QD4EJulXY+%x zagJ~T>m8=9JK{&@MXhFCPMh9MiKE;@UC!||i9OurY%#4F$DUL8KsmcvINhiM9T^NCNN z_=UbCGA;1A8auVTJ@uZm*16UM$)z9Gx@2Cz&&!n27@Z)Y@vZFjch8WC`~Uone>Ooz z`$XBAR~u#B8{EumUN~FzKe9SMpY2HaDw7|vD1|aKK?^L;-0N3ke2HpA`ubp&6SiovRPt2lKUecxq?nDIVF~rJRMZa>6{J1S3SK)3% z^fHz=-#-vFZ|Kj9$ zW@T{t>$PRS0)k^z^Nq4&bGOE>-}d{~6W4ijB?3e%vvM5lp4`*>COp4bd-2jJ)}tXU znOom&DAqdC)39jmuI=qp-sM$JROe~%4NY6y3MVVXY8Ck?dC4AesJ?#D6tt-m1_ZarR*n{?~3zG;(TW0U=~q#fWd<4 zQ#1b^ak<(X2d+Q(!D#(#j+W7ZGk212t!_*?FhkJ4r~FVqj}G$@f4hG(-W4Bxu#V$+ z|EgI%?2*|_Cqb)!rpe!|J@E;&z4p7pakK1Do6tbNnyqYIae-wCWff%+JOqAj2sA(T3?MO9$(v zZ(CP-9RGdev1McKJn#GMwYCkGVRMtW+WfDp2)LB-*P7DzQ5+ubwic~bBBepVJ}LA^dK z^TTdAt(JRVL!|z!Yrpj1d)5@TlYa_lF%~WJnYpi`D)Fy^CGQiX+RUuqVNBc1+I44} zt=PNk48wHE<6EbyZVTgxi{_oe`R!2so%95+-6qvXqs?1?y%K7E({*HhOzMYQS=CRo z=CWy&=nlU=KVZ23=KE4@0ksod#M&Ay`EX9~<0 za@nqKDSB+L_Muy=IJDAOjJHn=kv7Bz_dv|ha)cY8gp2@GR8DFusmKwh5)cV8~mm1Ca?$G2jUE-1f zY(0%nZFiSzuQ{DK^YIJUWxBWbp4bxo*j?@AuOqr4J^d0g@}Z%Y>$Xer%(qC~;1h9u zX7H@y9`%_GdQ5vHe!9&5`qR4h-$%*jB(38Y+t1jffX}S!zU!aHc2@7>cMLUo{FHQ zy%VIhw+s6GEsXiRDnDi?f5+9mOz}}0K3})c3#rLjSg~f+xiX*AX4!YT*EedJYA2j| z{n#dK3G363rd%)n{=RH#-Ix0~WNxzS+*3yHCx=hpdv%uSAvw|HL#rSC{HnBI+Nt&7 zeYHK4zfICA4EZ8|JS>~hRN!x1*n(T`S3GH!1>ks^rf}uU$0GSe*Edt+JzaX-Of7gdwFa< zhxy$vfy~c+gCwtS%NMf}bOW^jc5sA^eJW#z#frJ6AIn$fT<%yE!~`Ki1w8FKIAuu3YHsuV0RIFzs%*smPpq zZf3uY-JzJ2Z_D4rt!E2XeO6O)qv6JZnI_p`ZgvYdPJFl_`}v+@F1|g|2DdHOUSGWU z+njAi%98ef_{vi`GcQ3nY<+U(&o0Z0M=iPj#`+LM^76!Oq$?|pmd1Y-+ z^)6L`Yp$v{gV)AZOl*8+ZOSewzezos`GnlD()K;aD<;qE=aE=__g2`tV8?y&C$F*{ zE{_jMxZcXmcS7z)tGwl@#F<)~TKFv`|B9?Wu}1FF*9@U^PajE0)V-UzyhN7aTJ5&) zJ+hB2>n=T*A*vuIGTUQw-MgJP^4{)Cc3Ewjdqc*32J?iKD#y7#-P-o(#mU~fyBuv< z(S8k+iWgjVG;2)yb7UL)i&dpjtDDy=Tnl^myW&!q?u4z6*Z+B<&J$;!_xgC~Ls6aL z*nY+^b2K_m}ba<34A9 zyHnQt%4oxx--kSO_xf*J{{76o^G*x)$g%!e)io!iHM!KH$w+%@;;=JzZSH;WD48<@YRrJM`zL>*=ps-hys2G+ujQ-OH4F7V}cRD;evZ zN}M_Eb!~OnA-U$Hgb2@TYJW~R7$wwve)#v3Vlj`%<)pK-J}b!I$p6l8h&|`LgGJ`{ zFpud6H#To%{B_+$15grzEN7z&1H1&afIi$0=@jreTlJWT>27Y`8C#@ zu064HgC1+yPJYXCE^O00H%@zRanab{e&w|+g_{qrAGByIV$7OVo5M7L_4Kw~@zV~KNd&O=q{=7lv{r?}w_b~C)6x$1EXI%T+u)f*!J4calMPI`l z;q~@E<+%2%*PhSX{%z`OndAIiHBV>lKR#!*>2IO9C$9q!=zfr1eI#g|(Vx^+JnjvB z^PWT`?mPIvqObc=4CnomI;rz!Z>gQab^w}O89!Xr;;p;xoc*xe7PO*dA!r-ysS;f+ z(MgvdJioi>=g*%$`HQxE&)v)NL+I4esPNwZ+pVsIPOT{2vC!yCso9Ds9-GH6-T@C1>RdsC$L4a92|B^$FWzUGYP{ur+&njN z!)n74!B1CjE)jb>Z{4*ESq(b<8}GVb-LY@l^-Ds(c1Q6Xl0MYon3r5zD)Hj$#UN9* zQ*U*@E?l(ePKe+to=K}$uXf7y-5RxSrNZPg+XFsn%+KwZpZGDSXq`+x{C5>kKi@Zv z7ulJ0Mm|zE{CdB(f1J3_z}QftjjhUQy)EB)<9{h`&R@%n{dYz?#y35@$k_bKuDY-B z!rk0@i;`b9o_kKjr1OY;p2(QtX3u-Owx|BkWE*qi!~~zIl}2aI`?cEc77s0CYn#ry zA#?MxyH%BiVe=l}{U%{^vN}wxgx|r|)>bv)SofJ5%Wbv2R~cl76$#xq`hUJyPO1K; z^R8~}->Y|RwK=JFV20PGOKW|9^G@@>Q*Jc;~uoR?Rn_tEp~|fxgS;{_k>!D*zfo2`_-f3RWAN&nrkg^+0R$o^mvC^_NwC>yJT1;f_;y5^C;N=%3wO) zZ$GQSDDG)Zg!sMWpZ!lAzwJB`(wDh@*;=W9WnDafj&W^jFAn7N(>m7ls76A3f{&@> zjbh6`f;FP6k8O#tu3$PC7x}d;h257u)&84TPSKj;^@mmotv+sjhUtRfoYHd}555bp z{iV%%wPF1f2D1xu?tf0!I`{vD_DZ|ob`3J$AMcInUO)Hxp;ND~XI*-|@%ozg#+7$} z)qSy*)KOpX=99tt&_$2p0xF-|#&S=-zB)(2lFwD#7=pUN8XUYQIvTailY?^#xRqQ?27$E4%kA|23!3Wj@mvpPik@HQW5&3bWUf-p=OjT5Te{b5Y6cnuBZ0 z?gfP}Tc9Vjg7fsEPd-zpuPUe(R*Vwm`uQp+|61~^Y_HJTbxXNod-Zo zIohYZO@wDY&|7t3OVsq~BCTH5`9=<69pzhAsm@B!tvM0Ww36?!t=x+|VIJnYd*_zT z?|k*ap*&l{gdt3O>p_!8h7}W6uUf@&rj+fB>9Si=-<7h>Hg#^@xG>J{$qPrdHLLG# zNzU?!XI5ZqTdBhTwNxsjyyanIT=Tzs24+bCcdpLN-gvF&$;7(Y0=FS#OSg&(ddk43L zTQ_&v{Wm@qRVn*#ty!s%oo4iS-XyWtww|VynS$}3{4ygOV?8sjuZ#VptemENIjQ#1 zkF!!=UAWB>-Z;E5p14v$e(%qM9dEC2vX%=zDZRaNGS@q+YU$3aD&fJFc8c+v&bz1G zzr5yZTJEmrk7B(xre&?2J}ktLVQw{S9O6oX57`u4OsxkP9{t4}C0g&DHfL^X{6^ zfa$U7OSmKIUaefdMB)moh4#y+Q|;cCCe>FZ64I9D&JcAdTTya;t9r*USqs` zyMOOj$rB|4eN*pn9LrjH&9+YeQ`zeh#&v=V1Vs}WBCjSpzCT_n|KZH_UsvpZJ<)RL zn{cMM;C*=QEA7(W<7dk)U;q4mclhkjYoDz7$LPRxhV6iZLH4>+^Y)bgH2eB` z|5Yol3%$wnCT#bu-?{2g%w@UU>ueV{CY`Z$D9$zW4ExICiU*J{t+sf)&&h_QH87e9^xaZ!P%k@6%lH9_WAHB!l zY~3cUQ2om^^Xl1!tM_^?;H@d<3AkJo8y>zoEX(Hj*RNl>-o1L6!`<8aW1_UPxA*3^ zjOVw6Z`b;{YxiV<^^BnlR$8ssIoDRm{P^U?hX&@x?-K4@PY$rr=~%Xl$6>MT<>aij z^JYm*6|XF55m>LdHGQ+WVVnO=hsrBqjK;-N-rnO(Q|)j4DO)jXZ|Llg0qoy&+L^1v zdHTv%Wa$LVn;$&;Yh&$h*25K(Ip5vNU2ta3lUTOHYqo^F-zds&bo{q(_2dnDjGyk= zdTmMjdSTrQcR$b?absyq&u#m@?zpw){2V*YSd04I*KYInFs412(V*wF`-!_Ae-#vKaeQ849cZN;>wtlW| z^;+kC(=z_EeC;RU)mmqna^t#f)%KaiRoDEju@{_S8LoOqMEh)9?l%MdcfIlo98-Mv zl(!1}T)N;!p6uU~tAzF+Uw!0W+S|CN9G3(;isz+9GbV3MRsYU-$>#fpzcHY!5h?|0 zm@|MT#=$L}y-}c^XojuA&xh^tUIsrd{eL`f%kem`ew$C5o z=AT~F8tcOoR-N!%TG8NDG~a2@3YGIdeVl!a8GlYLW;+o)`SHnpj+-*?xOj-q+Em;A zq;Pk=(e<{ods1vpo^dWRK)!$w%c`H@8S6~9`$tJt+k9Nt=)XLho$jjR(G(17% z2aA*FmZ=BQSOP=K7(-&q1D1wL{ofc~C_CY%u*K(y+x`EZRM@^Np8w6as-{RL(USch z+o`5EE*rgKHR7!AJ1Z(|KK5R-X~Q~6nPAuct4}L>{`~#;y^CM`n$wf7dXBmavLCD# z%XTndsaAY;_0h69425gNn6J*un=3DQ)H300VNIQbrElhkYEYAAb*R*zxV4~xKhU-b z(6~y_Qr5~?J(b1x|D3%qcxBn&{_M>DO69$RD#5Y;&ZPfyefQ_*b9>RcAMO8Rf1FzX zr|Ng)*R2mi>)We=2|Ooc}xN@1EcP zH-EqWa8m5`nf7`!lWuOha%cL?nKSdh=cYZ&TdBHr!BL$^v4~Borxi{!weR;=n|U&Y z$=Fj(*o|GyfYE=3%&ZB{`#Jv_|K4u*-fH)%T_sVk)@7M`grEOxS3SRWf#1};@T<$O zMZN#E>rAQG))lU?b-SKS*pqpAnQJV|(!JlrgT6SgTdx^h`|-wv<>uw(CM#Km1>=L3 z8-96}k;$>u%uIdj>C&rDx5WubWoxJ2P-WI5RIwsn@qCytjF zn&&1SOAuCGH*HxI^No2I@)p=$xU5y4}^deWt)aL=^J@ci_k*>7wocgirIo>A5- z5i>c?*6sY0g?3lv$|WWIeR*1Et`uanH$5xkZ&F#Z;{H0{vmX~6EWJO|b`txq!zVr@ zNXSWT(HHZqPr3X3IR_-z`XF7S}n{ofjn+;~K_srYL z@H1~h&^l4ZvgUOh#{%ClPbyrO_GHG6{^BilXW2{V9p2nrw5Lu=VgJ-i3_Bv0G8Sy~ zVt$Y`mF>V$E#A8BP&U32)^eh75d2-l)cr~lv+t9H)+ zom#!W>TgfBepX=ju02z@PG(Nny25quOs{Z#agKf|5x(R(sTX{Ht4da04Q<`E%IK@h zvi*g@v6U;5SpuG1874zI>#`^fJXq!#XS)w^NC z-g8u1yse1e{km?(b&T&f9xmFkOl&5HQ9w<|--&z0EUzituetPk zQs!5eFEggRj?OpKFtbpr@`>G4A~e?|VV`GPEQ7J;wJ&bV^o=I?xI|7&5iUJp5zc&) z!Khdva$<7x6L#Ld#z*dQbpgj>PrUBidsVo&rFm=Clw4oalWa%(rDTF9zxg{+woh>H zMAKzg6omuX+7|CNRW{%;5jIsz;@NSuW8*XV@?y;|kGOA&JlgSW>oLB%iKV|&4+TG->O+BC_B7%XQ-YhIOQ=vi^~;H+x`nZ9lJhD zeQI{nbJ!OxqI}Y8FJz1z~*CyXCjyL-Bi38ygHN9m0ROr3DdQYw=xA{dM+{S zkXU*!f1_9P{iLaE`=QxGVKF!3N&64X_Iex6{_WqoCHcPBbFP#7f35y+U2}VTZU3`5 zpQo<>b5nA{pUw8aPtW{p@qGWE>F=-C7~ZW4?A~ScWt($R$?n)IM?-J@@80hHbm{7p z8(V8$eog$jX=&ouQ>jAFVtZ_5*(R~=mnaR~e&_nlCA*S)_I4QePd{g`8IZr8GGxHZ^-ApJd{# z)|)lb#;Q3TJJx=eQUIMpEGV;rx8nBgh8Nomavt!SJTB=i z3}<;dE$z(iJ3CfyUhJ#9EVe=K;^U2iQBJ**I?`uum0n*zlP7pFb7ESP)RT=H(yr}$ zBgu2#hiPYAwT+e0l3giPitFdjHYt!ZTrrPB`r5f$b^bf!_UH8~omdjR`RsJVp51D1 zy60t0T)szarpKpUtiN>5x2~Oit+lu89vgGYoHZ}o_Y~hwlPrFFYoF>Hg9N)B{Uxv7 zCeF`%|1S68g}VFqwoT>O#B4M%C2MNq#n&>oIEQ<>BO19b(z=au5$i1CHvr~z27yudJ4rC zfX<~_EobRu^x)5t$NgyvlELfLedK)?9nBH;3}d;;AURo&{n2qzN3|**fyFDOt-5yhEJ|Q_}%E!$OYYr+ekbK=G>T0SPl>OW0 z*X%12*=HFe7*;(#-;&IJ$(U8(x!2mcJMxqkojRcJ@Mc2xh3v=P+x~ufZvWiiuOxf2 z=AkVIO`q4?`}W$-_oKwKofC7|)7VpO`L8CZYhG{I>}fBja{TC*;sp_zFU``=upTd; zY;+*Iz}u@dPqwHf&P`@b@~+Y~u4+fEtYYdfINa?2Ix*Yd@6ptPWtSdo2Ui%U+L3aE z)E_ZWmeBaWe@pT?*XLX(>pz>v+diH#|If+!_RN#^KaJjJy!rj~x|i1vmDfG5zg{Ca zNqp-HZD&vqB(^*1%FPx}@!WYHYtS*W*L}W$qcwFF{{(yc46sNQO~tSu`gaL{fb`x zqGY;badEQmq@-B&%X&(epR%2iC}%vorDBoVOpT&9y)n_jx`K&pZJiS3Tg)_bt5$4} zb?}Wf(!99%aP6c!>#D7%hTXk*LE^{dIEe_T{_1|4vNa^);b>eZq9R6E2h6+u07y=)I!E&nx94ZK8j}?$t!ePL|8B zD|#CZHLo!kv7M`}dTc-IFy@ zFfG<)dSl|5-3(8g*-qwNV|B?FbP4X?!~A*OT(-+>C%07H+Fd>Um&$7QO^zQvDzoop z4H5Em`{HG{VSe1n-y!X9mc_<(_wdQtNbt#8&G6j5?5l8KYSx5KspKoJERr5+E?1Q9 zm;MTCel)pgYu~wRTk4gnd|ofV0qSdeEZ-MgJ8`9}+N3uxugTe#d3=j{vRnAD-d86x zhiUJM53h4K5`5Zj%5>t3L*1*B{ahV)=V%vh^1Ef5cR3R?7<~t6CD{*|$v&$>`gftR!&U)c&}m*}K!CuY-*GuXjF@Sa?rsbw_L6Pn>7{&+*&l{f=cA|KNI{xaHN3vmehSpECU*vwl9?sq|ne2JyuvKXk(~8De_Ci5^r9Fh3~1 z*xK}Ddi+1NgS!6>{jHzHl&qWZXL|k5>kmKA|9|YvzW6^!<87HI75DBIQ>+Z^-u0>E zpn~PL+DJ%g-@W$Ot)iuo{1PES={~)Nndf%|2fy!LD0aL=ddsAuy9vKvRQ8-Mtq=E( zNWBmfw&|2Z)y^pEsVZr448||7Y$;o0UbMWiu-ZFULh?n3$j-Gp)qHxtOI|V4i0Ta# z2Q_S8ZJW5Fq}bW_K;y3Mt4&SJuby7J>-4)$50i$B@ZHwzveGSFQv}@--z;a7v{-g6;_FGaGdn6KSJ|4pSQd9Tc1Kh>_aw&T zD)rY(IYB=9TpS5{7T3WDE+-7*8yTP@c2e@YO7%gk|?C-b$5kcYDoxjPLB5 z+Zh{d?5%a1^%`c1y#Bh)O+}LNa`EQPiJ#kAH`H>QKKl|F=iyM98?n7FE zTN(vwO?zrzKiiOgz0A?5^yC?S`8%t(`ES%WGCgrcb#j(($WMV~G26-nEX-srpXko- zlVAF7#+R)3{XGn++xq1!l|0gx*l(&*o}IVnq05e+YV2u?&XnJK*x-{g)8kVu+d+m; zbITvZ)p{BD$bP!ZcKD0izW@8G5B>dqiT~!cHxWT=JvT2q_am-1Sc^*j_6)f zlFgj<)xnJMyi3PQd$nAtj>Tt%UtV9rnV!|p`$}eltyEWv!&Dc~z5WIl)BMfPU6Geo z2`=Z+sGf3jp-4l|Vx{v88GQ}GZ?`{YUA9buQB6x`{bx&SKFdA740{A;Jl;9q?^=o1OD9l1)U40WX^TFK3C?=#GJ_VvNmtNh$c(r>?>%H8+g zOz>~-uLJCR+2KDYYk8ty`%?UH|GyX0x4fU39>*2`_tkxUr%#K- zzVZcWsVqNuW0Ba@Wmi{EJAH81x?MV7PApg*_w}enl<>ve>{X%?{9m_f=k8j%((PFk zL!N*7ys*YM)%>af;Jldit%=SjJKD_O{r?LuSW zx%`dC7rBb$F6dB6p5=PV#K9+O>!L${=dNOAn_+m{X))V|CBBcHe7VftE{vKb#d1=j zT$`AZap0fgw-Xz>t)ARG8Mw1{QrX$*>^{3QW;bSD@2EYv zK(8{X=E^>kN?Rk{1s!U_u4<=vOq8F^C_j7ttdzuh&f8{dg)NNlZ_3=8Ik)j$+R_+d z+hYf-RyTeyV@`iHr7_ucO0Mi-y<5%~jb~2zeM7$TIp3uXdu2rqoH09h?TedQ)1LbE zv&$#O=`x;T|He6?U)EBjPc5P5&51;L*0b(Ys%jt2m|enn^uR}6^}f>^y59<`$1I6B z9+i?cIe+I*wP@x!hA*u|3pOod6$wmvwxvd?ibrO08m|KLQT{vp9QP+*QIKZ1{cW*l zl|;^km$R zeo4OiZjzsD>Vp}c3;mR~IcNlMEjYH*+2rEg^KJTj{sjH_^W0uM?&qQBQ?34fdY*gR zVdmBfo&a7G=A(tPA3w5jDrR}kac$>;Ijf%7J+>|W&tQ6hk0(7U{N^radxN>GSGk1LPrX^sE(yM@ENQHtu>G=wM1fkal(5b%S6;~#>t;$$6gJg7HzTK)uZ%6q zA#k=$M!?&P&#kU1CqG~{m^|%n-iFwu4KbmC%QkLVqB3Rbw3bt!g4SNWp7h4mw`l6C zzSr4%#C9%R=eG6O75T|bzFH==lR8=WC0-QCzg^4rPF9!g7%$Vab7t!k)81rlzj)=w zg@of^!4>+JA2k_`M({pUr%09O1@!gZJhYvw!GN0W2}cKCp%|-c2Sx6 z^9P6K73IVW43ZvfJ%Rx?_Qo$wPqG~`X4`-9q*QwLrS**|ucjEjd*pq5M(s?-X`b7c z@y+~q;pJiY$sk{V>;>Zu}ZSUkm*stR5{#v?l^R|g0+3k;$y|(W=$RO$AmLu%AEKbrwEsIAX`C94h zvy6|U^LDDvu`2b-yuSTj)#@r`<*Z4Ksh3tarZ`9}Uf0euiScQ>e3e6jkNp#O`HylZ zW|ZH}zwI)|bF*5}8oQHAVsCHUIWZ;5&UWRBjmzT~bDYe(@%5sQ?WWgftWqA_xNSSr zW3gEP+X~rf^F>AKPbKtSb6sU?#PSi+x9|CDWw$^8@T^d(Y!CthXgS}ZyJ8C%EC z1uIwNDjhVMFmrR;6r+drfm2n>}ciB|Q)yq6EeY|5v6`#T9 zT~D1K@AhSi`K5fjVr%YXJKq+IL&g&yy(rL4FstYjOztb5o*lDcZ>q?Gnzvi!FKsPW z{F#F_Z~S}^-JxghQD&54Xo$7H{=1h6Fe4di_v+TFEzlU762zDW15M?(2eWOZwL)KDc@@CjB|XsTmbh)3YWSel5DWk?qLq z=e%+3yF?h(YD}_Qv|zrlBtqCyZLieibr$Ke4a@W@la`!+ z#$eB=3h}dz2o#g38qsu56^6CTqJh$VC7}EewF;YdmICN zUN4sjytl73_{QGmUCE1%Mo$geTYTKC(a7|q;FO!o)Mnm0`Ne&iT%_sAE{WjgIZNW@ zZ^(a>(0G3{`S=^wDJ#A2t>5O)KKb5>D@yWKF5DXa`|S$G(b7o8M}`6kb)f zPkhkBa)j-ezxJw{WgZ*VSZ7zIoY@u9zeXfyz5TL!ea&lmE?+x8D1FGDAint6zIT0B z1vxtBRFzn8AD{DB!E?!t#B0h&UBWg8COz{i73+D{=h?Nz;p+Cy$LFo&I6nXP8uulQ z2}Tdl;d(Y z_`>F>mXt-um-sOsl_=jCywy64`B0aX`qpEHNiwhd7fYMzU5{xlW;x}lBKg$$<4!H! zhVDRk9RTkJe7ISn>R7aH-~ZqBCV#Hw|D9K*{Qm*}za_UE_kK8(z4EvoXms;aN!)}z zxwp5u#wIM?doH}oWBR+CmE4D~aFlP=$ep!9+w=f~-m)m)uS@)Qc&>I9hR5oz;{3Wz{_PO?b^`f@^JSVMkn6B zepuI@a;G&?yx`8=qji&Wzkj`z{OxNSWAmdM@{-}%Rm#Gq^JZ?+cQ;$bd*#TAZ7(}{ zL>?E|YHwaYb3^K5rx{znvQ{ad_mh4j^&&4K;IEai@GNbuO@aXCEpUQR#v{W ziuDBB8JGTknOpe=d+cSl2|CzSv1lCI(7p4zlKW*nho2rn-8~&D!lq%;E0%~!TBzOq zWp-zM;buPt%ULCNbtCL_7wa9Eaq9{D`{i;!^EeyS-p)z}T|)6NOE++~&d$W}ZDKP^ zve}b<2RA7s|g1vhjMiQFyoL-d+U54KAzWi;9q zr1*2=@p=6Bf33YQTlY}>-}E_a!0LCn`t-oT>jcv zYaQBM^W#7q^NYD&o68i;JnrpwzaVpYb>Ze^PlYF(sd!x29MAmtvDeCDOI~kyHOX|l zsp~|4nd@_26q>xXN-Xx@xli#<#be&M?wU_aUQNv3)!Fe$_u;eI`F!8+Jk`5aey_6q z*zfm?#Xr6L(9p|Zq|A5yyMzVv`7ds46Fm32Nt8{@@|7~vyw-2;wRhupceXCijcikl zO;7R*2cEm8;_jYp{QI>GSuB#-@OHdV~VlR2tp=v+FK4TwWNQkd-9+ zfF&q-x0=$vrrR2_uU}sJc;oynv*Sk||Cz;irO;-#QbhGGv+MmI&hBg|ZpjpRKmD=n zl*c>w%{RQAb}C_>JjbN#iocr=a;G;u+8ycAZaguG`7Xy^!yq0GVOh2rnZJ*mh+;{b zS$?x@jeA;M@7u?>cD#MA4R69T=($1rvl5`ed@E}e``JG??ONfgn-wS?e*RVMiuL^m zLc>;0I3s?~b?)p-ar?_>W&C#WUOwrn_Muf%Pfzjll`4()u9c8~XPEGYL-=rPV%8RO zo^M+?60D>4xC+0#G$Z%owa&MU%{gD4^Hy-3EuG4CS+?oPw5r=?6W(R4+m@{D9PVEH z;&sVqU7kGx0#j>*yS?M&HM2HeX^)f3_^Xm`ZLKW6u}gG4lll8wTPIgNd7H?7 zEOthjq=vAo+FPj%ySg_8$1eW55!kbfZ>8GLC%nfGpHl+6DT93%w+S1HYurz1s0m(RZ?yHq_IaPa`EM7F42w@uI87tFnD2zg|8!#7$)NLqtHqkdT_7!9Y=*7WTx|x6`rhXcUfwHv->}K^ z<&84`9O0>H(h7Y6b86ppPnfehCOzw*-qvIBpX(fpW0>1Ig*KO&3MMyaFi2&H`AExb zmb<*6@omLllK{V9&;Y#24_#0J4jHV34BHfkN~zp0lfG%?|DrqVm-r1(g72={{bkL) z`U?3fW|im8_ZQup>D7F{IJDL`bHz%HiIL&4rI|?&QXgb3kom2sAG=FMCw`xf=kmCP z^G;ZV3;P~>)9vwQ1LMaR4(=~<7Eaq?^`+#BbO8UVZ!=yPy`2@syKH5y+zT_0t5v%X zro_K6*|6;FJQr4(;QsFkXzWjqnqqd%io9tuzDU&&& zXSc^@yQyE?m#NL1=D+=EgHgko7hg|YQJb9SYgM*Q?&jTf@45SJo)r9fBHVv_&adS4 zw#P1TTTDxwzHRa3tylj!e(e7JPqJ9rij{UBFi5iQGfcI*ro_B=m8PG9L<<#o>eluH+j9Y5aHTXfK+yKoI#$I4K) zd4*fjQr;ex{}=G%#8&xpGb%Y($mI5@o*r3@4crZ!uH` zEy$TL+u_rbA03z07(TwWqwd~=GAo@mb37=}O1j`7ZERu8&#kx%C{wr#OY1jx(cDB+HLRrTFaT zn_N^I(xAg(W|8LiWyY6R8P}GE`Fr{r^#<$n47y-lgpuPfRAIKbTaB}>6lI`mvq5lf2eWMPN2 zBX6ZP>n%FI(R`E7E}kC7B*~JKOS(D>8`{FAO`Yu~E+cYrs zT1b1&?YxkwOTwgim|B~js1$YG3~kB0*117T^yg;I3bg>9A8E>a)}$`pn?CuRVFznf zeDzmurewzV&t+!CSAR|I6`U}!;a1<}jVC`AvUD+~uC2YtaI5dRoJD)}_v5|}c8pc? zlG&!bwPZdesT%kt$7JrupT-P@f#Iz;_$}SKYyaKznIaLazv$SKKzD<_%xg>Hi+dcR z_-@EwkyvkQY^=N#R5mj|a00C-01Yz+O8pUA4Jy2!Go9?VD!-^y6d1nklVeWc^!4k! zn9sS!?(=HCu{~II^)$&Vdf~TkPZsy+3YPs)saN8hq-w_V~s+lqHd z=Hnw(iycjBr)J(%3D23$z3jC2p;MyThfYn^=2;NlI!kNO!Bn$ptvgRXyl~qwTCHa@ zPr~j!Yeg2wDW7V}ZvJ|1TGh-hK})qyck*sal$UNZ)7rZ0?6bALr3)AC3)?%%bL+Zw z>%wY_YGc8JCNRF(xTN>Wj;zV-hi)hs+|B-eUDe^; zc0r4<+nNp%>e9EP3z_b7cH=F(w~O>Yxj7mOKAn5}?!#GcnSYl_TjYzX1W)!^Wx97F zV~UH2rL^rg!RgsNdkx-M=@{5)1T4E7d?k@N)%5fWSbo`2QO zo5_6nictDDRfXKwa}Jk2I$>+vf8fk#mRX$+!lK_jDsx1iuJ>n2yL7Rbu`n=vrFxOi z*08x7l}>b?E@e7w=ryNsyBX)I^<^viN>2;U5WL=@hOjh5ON;jtdQni-xZ~Mx&Z%4Ghq{``|w;o7DsIf|0 zEW3Nz#>gU0x>{9QW&OAkPOQmQep+?8O0qI=_MXbeY>q}>PrSaqo?kj=iJIim zsFXz~U8Zi&y}gRVs9}$N=2wx|6Kp5-?B2ROvfAY4HI|cnCzeFYTh@H&`FCPT?Bpch zU0biK$&1Sbw8Qka7gP&C~Z0ubxeWch<;B2kMlH!~-*59gL>|oO| zE}GL^+@n|Ra?`y&cE)q(M~n8DNghb;5llK@zIh&lNs{fdXy%I!WhMLjR$d29eNMRV zlgSXX;u2^Od;h$!ZAJI$)k%LJEYj<}^x#WT zpucTPtv$6GyU<>{RL&R@J-`x!$H78p;w zt<_lUUwx_n2E(iu1^MOOG8;Nw_)8>v%1kxC&Pw)N_-xOnOF_Y&E7oXmKYg0I@X)cg zU0HM8wbgxgR9Q!-Tyk|OPt3cMQ07qlYEq{1QoECf_cCQNR4rH@YkG1=w6Nzgv&g>_ ztfN>j&S(gn%;S@6#Aab`&U{uki`7-vXn{|C%A%tkbr-HE_V?aspOTyWidDg1GGhJQ zxg1|S<7O;>R^inaTYNcrm9N^_SyhiWPE@>Yu4y1=5^xNZs2@H|+-v0XgzIy%w^J}uq$Ilo~m~%zX zz2jSPPCe6wkGC=vYW5)}Y#O*jpQSi<}xS6tY68<7S_&dCpy*CA}@bcux(L&`DVwW-k{aiyerh**{AH{xsmkY z>YV`LS6Qn<>SJOf<)Yr~Io0(kAU1U6t>iPi_wenEQm{#U?%((I^o;DXLk(A-EpCo& zig&qdn0a-@>dT6=IgAKVQO;&dH=B?i@Tz*@6 zqDR@ew(8Hp#(NtQ8HLw<+>n-b=v}%;K~JW50*}i1jqCQE$h&d0CZ|Njr;qvQ8tIhT z439n*E|}G^X>RhN4c&sD^%k8xVD$CG@3Q>xuF^HmY%|PrBRH(LNwP@GJkHpw%9!Go zP}zR)W8AAr<+JmJmO<7YfKe!J%Hp?Uq{9&N^yMW^E?ztOwC%Gu6a*Jy(ei{&-h z$w|B{lf8QPyt|=%YJUC6g^`-a*e)7Y@#t)pXFMS&*65)yt;49nYwr5Po0v1#n7cJa zGzT6K^GN$*lCfU)Uz6v>R0k`@cm=6Ko8L2xf8AMpSmyWE_4^mSW<1(sBQ|063KNDo zccQOIexG*WuXMuwV;txHNF4ZlH9H}>N8@?Z!$q6A0#kf;O03joYZ0~G_pG_;vCpin zj$2ZSuNuU^EqJr;I^Q+HB|FV*Z-bi0poLhFu??g)Mv0>0O!>Z--voZ^8K>*My-_~t z-nr*<*%G^VeVW2n*{$Ul9%#K|1^03jjlDsvCzy^H-tsotF<&HWc5w5ZJb}}{o@C5V z*uH!5Nrf#(8@3;J*yebg|Hj8Tn~Q!L?G9VI==2wtup>7QNCvK7Gb@$(^{P{w4DvqQ zx)-9%o>Rr!-~Xj;<3hRSn_`VxrANOwr0rh0&#m8^|LHV0rSrWD_igj~dhF{~wwt`A z3wK#DZO-4ke&@y8j)u$M&G?o6OOyGyOU+)sna7tN-*~Vxez{|5KVxx!(7Kn?ZLBR< ziDWORJa(XZ!~ST^YYc{eC*8b$IXB>braEVa^)H zCz`^3*I!@1C4T%RXQR%`t6LftJ*zk?V|sjY;<0axr>-dFN6g@VE&lA#ADv~f!Q0OF z8ShwTZWRCS*;|=?CT^eC?X7L_uyd~Kkvk?Bc?k7Y{7m(8^{cvJLtljW_&SF&DB zF?@L|F@cBY{gz~zDU4}nb{o7?D(YEmy7GEl^B#SfV@tdzKCOK?;Vk1*X7)ve(`T1W zERuaav0v797Gn~N%JGRI*_YO=^el5wD|(}>7B{1u@gzf$+SOn4cFRn7Uvhb!b?Squ z5@kh6+3? z`@g-?p2d7Q$KB!EmG>DJQjg!7Q+!kX#=kw=CqMd8!GEX!-NnA@t9^;Qh7E90FW={`4T(pU)$nXWzjKXbwde@hPY;HR!zVfR4u49f-e%IB$`la1=3tGqc zL}F^+^}Ypj*4KR4D*#$eJB4jOc-aXo!MilXDi*LyeA=~s<9Xe8>T&Is*>4`t*iyVc zCHBie7#IEC)Zm?<#N@c%O7Xpus;hW*RKKnH-LCOiPxx5u71iKw zpY_REy~(6J9*g!0YDHgsRfUUZWE+k3v-+a(>O zWtdN2Q4a2|c{1VP`k=Kd9q%pwlJ!ejej(q_6Ny{vl&=0dCVcN3C*#R08uGpjHyv;K z?#}qDa#`=y#QYtKcTy(Q7_YqE^lbLjEM6J+$9g_{^2`}e_1l!pXON6o_Uy;I-J2&S zS1Diq)|o59yW3;)vcJMwNWMDOj%qgdkFpR#yNHoV4ly7kt9saLXGrrdD+`sR^TVM#+@ z=FQ0K+0VMdZhxJ@e8R!>_vQz^8>e3nD(3rsy7b0*+bXWIp!B(oY4!hhE||mJ+HDnl zKzBm*S$6vwjWJ6jp6`ek*6jOw%As(Muy2~R+k9o0TA8Ze5*<-S_QR?*_>*r?X=C{+!*4phaJ}ULwqAmG+*;;MS>90TgHE(c@tvuC! z&~@o+tso`w(q)$vzT8z)I&p>9{K^#039qvY=Ic!@yv}udnfRwwQ%_HI>Rl;*@zKP_ zbr)`5lyGCWx+*Qnygslw?b7N_9{%s;QW?`VWM_ZL;n`VmC~w8e4ab>6_Qvhpxb70e zF0afhS9GUK7=(vTt=27?=~ygUJ87?eQF3js(y1kG!NopPDla^!Nosjf*1pYi`?9pk zLk-ieyy^>ME{kSg^EBh`HJM%3x1D#d{VW4oV|a#_mv^CHL0+Dh&z`6|M^>MGJ<)UH zvAb1iNg8K-d8PM!UzIDOdD&&j@wVT*o2suW&*b?0EfO}+oV-4>sMZO zr!#(9$Xv~O@{021Z=3;YvuZB$9zQhkuuK1U&IZARH?|Y`cUn$Ad$Vs@Y}Wsh!<+{V zm&G1WeK6Hwlgv8*mdWb*Au2zYP3Ai#QRc~Z#^{~WEFF(;9Ge!MEZ?>HEA#isLABf6 z7W|ZB+}wYlaE-g#R;lvrp4|<}$L?J7cL4PlZ+%T>I}sUBr;~jvb;6vruHQN~z3TIA z_^9qPqm1$B#Vw~7T4vv9ZFus0zW<_QYDy>P|C;jMNvV8EX}LF*fzM6}D?me!1# z<>D{7`Rj4M?uI9)9o9OkD0DLTHtJ3AIbzo6CojBX>(1p-)&9u|R(Z^)ni zDX?vYc5vo`A9>f5RN|L;F<2% zC`h>UxXYxK&T)y#zdhEjTdQ@|@8*78czB(oms#fR9Z|uLeWpkre_dAX z<1kAsn0G7Nq0&&Zd=Am4sYTn_)=6irX8PL)nv!vKtz5Bb;*_kci7UO+`VN;?XD<#~ z&X^RmwUZ_HL|f;^AA8OEdhXZ7%=I%&Bl#JLlJLhNq0-OvkrW&zfJldELj0iJ3`f zq8$wV{CaNI=$!HEKfNRSiXDUcvEw|`gdeZ#$-KU#wsF=L{nX&ZUdGSsWTOvF^L>42 z+u7HLHy-}Ya(YX{t=!kvJd+w9&xqUWS|HOXdHgkR;^$|+YS!lt%!oT_y**#l!1&#b zzR2lo-xeI!do{5!#YiCKPHMgV6{X2(y@}Tio0HD$%G-6Z;rkB8jRy_39>1b&?NH5P z$z+_+6Dj_@wAzFIRWs?pnk5Op`piQIinNleXH+gq4Jl0V-zVF0*uPTMfcD}Zo&g}L%P-yazX-4v2 z!w>8t`&qtlaWE$PoA$k(FvHy=?C-i~a=EHqbLP9v~@av!{e=AY=mCa-;_JN{^Z9ip}&h$=5e=l zdxiIi2}||~$lSJN+{eMuXL?4kZR(<2rWO02Wy>tOd46Zibp3A{yr7Qc53$uI40<7% zAEH5Xji4!YLoJp`KO1LUQm{*JOxTio`rU^I&F63Z{#cyevGwfi^7Mv@FSP1|W7K(H z>7^H*zhiw~QM~EA>-5W?{g^kn#?JI=K3?9v?$+jX|BB@ryk?-%zQH1X>FVi{9GAcE z(EKv9HK4xRg-U*@I zYpR}vF1&O=qFLWX%UCc`=?t^2Zeq!X%M6>nHSg{SoBZhPUz2O$ySumE<<`8nBwHt^ZL!jo;$^JQ*RvUnwen{BS#*KB{y$ehNr z`$<9W@3!B&MSYj48z|ugdP-o1LGnY=$WtE^I6qe?~Ira&S2PU(va zj;<4A`wZVI&3ZGzN5zuK=v3ps#(aUSw)z4isdTTUy zTH*D~m+P$Gf2n%1`+bng&FqQqIltd^f1gsm?bwdj7gefc7-#-^?9SWMsie#>Gw|HC zE2@`Yopj+fQZ_vq*WVL4eR+)iT*^Pmq{G=QX%3Qmf3f!e z;%dmX6`xbwC>1z)j^#B5GpDWc@{Knet@7NR4U{fvh(D>+OLy9L-g4gaKIyWWeY@In znNR<8*s;R=)Z&x#^n72LR=uxY7xrq)f}1P`r#En$XEQ(MxN;^r*XTOq494dbZ#ho= z^kN3h*6cf~1xo&QpyUskYVS~D**~?yXWtU0ki$*^sOcKA<+pMF=YxhCm{FFp9`=^Cr%TT8vy8E=TqV%U8v zp}ca1&gU(!!kSZmDKQ`4>!7{$h;L}(4*nlG!Ct0oC*9ewI@a`5tgP=U-*qc>c)zlp z|KhYvPI9x}Htkbk?Ly4ymsXxW<;8MqMssiPms1=)A$eI{?rghRFWoz}GI)Va@&(T? z;^o;2lArZnO-g;2YH;>OO7@!T0o^gNva_V#NHC|_1!Vlal5*h9CzI@k?b~l>&-=}@ zqSEG;Q!n4`*-gD`&ihQXdiyNq@HX504YsCf@=Ug6`OH@o%G))W6Biw4uC-mb{diov zUUS{;cW)QkNq*M5ef|B{6EiB#O0cYtHeS5q^EF@Yrl(s!UrtPvTmI_ghQzxuH@4K- z<;0lFo8?9bZ_9}Z*k!u^T=Iq1*`~FV7$3E6-BPRcw<=Vd>8&U%_V z`?}ZbYk}Q+7VJB5dwX8kDO0srhfn|Z?mlD|%{(dc_O4QIi<*Rdiyigl7DX=_s#Gp( zSFU$7UU_|Ecu~&ZBZlpKZ^Sj2Ph{9HZv3>c`5qHj;vH9AqYXWo*Ec2~XF0W{u}d%| zXl=f&tL&!h%I*eilR~HGIMgi9n%wy4_LYB}>DfvrmqeewXyv*4*cxt+eb4jy)!aS$ zmVpi_i?2A~aMSfvX;8P%s;!PiCa+GlrdY|E)9t#i z+*dx--8#D=uE-+I-a#|MwwvYXEcJ=;x6ip%)yA*;W5FJOFt6nfOWjTJ%j<87IVj)m zeF?JgAG&iFoo(27&GYQDoi{!U2fVJF_p(WL@zcmk6I*c>@zOHJ;|_T_k5#t6 zo@0{Jv%5p&_qOe|UB?;EZ>$w5J}|R#Pnn&}{+X8;b_Afbbt*t@od?^4qy(OKn`GNv zPh$BQ!(iE!{J1jav6t8GXK_29*L<*zkM%rn&AU&m^r;rF$@-MoqtmZ%kIsCsV+HqO zlM}jbTbz`5cdgy%ReEymmP#Xsb!&A3bw6n_rv|NjIkjg+@Vd2Hh7!x>3Z1)Fn^?0$ z{fuva%g&XC2lWbkrp$~xe#P*y%3bf48{Z~|`EHq!QB+%6xni9LZ>ZWY#o+FkM1|Ps zT!q-UWmZpCohn)yef@^i%BzbH@2#>~bZRl%#XI&}Ph8;)KELLhFWVl8+KFYoGbL;% zGv@Sc`^9tMb`)TG*-jn+t{%EUePg`_+&GxNk?eEr=T~&Qtch=+X#}@(qGfXVz z$;n?S-TCazmk0@YX_Fmu!?e{G9ljzrIm*_k<@47Cy?bWf_<5N5SNo0p4Lyb8%VG~Z zI~%<_v?M#P%&RT-i_ftM+#PJQ8lTEWn`@lvIc&<%v-xXUR{!-gtX0a%_qG<_cC#*9 z+xS&#Y4qf{y^I>$EGMSiS!1cTAUR0c_dWqdO=j81oE?9Z|b$8-U z2=;ic?-LSH_q!%hVVj?@W=ghnG4F1fX@%SB>=;wcUss)cV7@F?nLV-DE10dvx8bum zk4K}IYbkG;Y{%x?K}`Gj*57=w;Z-Ydi1Lqpzq-DAUHdrmv&^*5qRJ-)dmftx#3Y}y zIwU$f`*mSXjcKOx*Q!flTKA$uYUB(Lt(o$PWt#ZwiRa@t?u%GEcalj~g1KAAP5H}f zj2FLj-qOo7!?!Tx*Vea>cV!yX*r62p(4liT@X)!&Iq~zx%OWQy&1E~BuXgTX%({bH zi`LKO&Zz&SUN7|T@BRO=zqZ%^-VVCwy8G0NleTKUDR=(fd;d4?)xMaI+fQ!H{C(-j z-bqGt+4enGUUzWoB{}AgHk!XZZ%^0mG5r7L{68N_zx8{+Mg3^Y|Iv2kanV=y`VZ`h zx3}fa`W)$ZtLC3!{!)`4QCFs}uKBQMQc0k~&$$as9BS1yos7Qj3{I}?5(yUWnO$03 zyELJ!ro>_E(HX^4r>`;kVY*?hX1L0ZZM#DHZfH-_=U%F+efZT>hc8}l*H6}R$`0PD zbk3!b@#e#QX107A?p(hqVfFT7lvK9U>`Tk<-r;sww^l3M%k=sJv7P5a!qP6pbT*0~ zh*{}T9BQ;&Zsv2xBjLL9c;%jub=U&ko}mj{@}V=$(a&? zvrG$Y%#HJYtFfFtuzA5v6Dy-7RgWho^6Y67ijWghNWSMP`{_nRP9@`O_Z`i;#tuZ-kqIrJI`Yl;K zdp%aGRr$KTG~6GrTWj<#DEAXzmD+oQfP1+Gd#)e2@p?k1+T*O+FDD$A zdTl;tW_qH%aF?AM?QDn=XqrpXGOI$7{9q z-hK_1`{ibK7&Y`{{B@DmSn%WD?{|Fsk`nG7X+0C(d_9?WO_g~)OW#W0X@%F7BQ4ab zdS=XzoIEG{*4IErW6kS=lafVda(v=GUw_CkvY7cEOGl@|^Xn?Y<@waJz1?A~8Y zZZH?0R=mCP&YOKY39si(I9oaA$Bv!`E2UX7u^Zzz*7n3SKWEhtb`4)L_xaqOp9(ux zY}S@9SS-`Amrt^yPhqV|4s&{6XXbUj>t@^Ea-6&}Z&3}XNd%fXJ+NJZ(Lg*1+B*oC ztFQ8TrhE3{T~@!(m@mDmuz#wB`n>a7cck4){(Ch3PwTD!f|XB8pSTA$%zW>X`9bVx zwu_|yt$i^Uc^|6Re^L+r{Hq?a~|Hz6Hgua+LGAw0`DfKiSx|d)aoLy|&VQnb^$* z`xo1m+^kyT-lzQX+U3cMyJVP81hbvk9Gq^V!#>$F``3yY%?-JihJstGX3tR;651 zX-<9#87-Y}HPvC0W^jMa@wbg~C$A_mpX#^y(-5>~rS-9kx1KiqnbBw{_#|RFj}G(k zFRp!=SGUx4fwn_=Zv7_pWKD+>^NEXhZ}sk;H)VzEu?^hr*&@-lw*NiFZwpRhOjbJX zGC|b$UkKB2iE_=oQq1ebO_bJqn+crj$v1h;BvyR6zjM>EFDdJvewB)MO`0rd(VK9} zrpYAW)dH!-J5QEvVv|Wr;KHbcoa{fQ z%#mkN(pX%>5p!j>_XO@Y&o~UiqPA+jV_)RCQ?0AU*YADGx97WJ-9PJzI9i7Pe1PaW zp8~CH%1%;W#FW;RZqvxqQ~B)t;o92h&`XE^ewI8{X>5+xT?n%fO{!!Q8(3PgWM* zmXi)RBDr?%+>pN?JLcX`|IpJZ-WJRJckjZ*haGM{m~rofM7iPnx2burUT@`}QfCf=rdrhn z3hCSy-?ek+%?)gi^?px?+VEG-_nyGFH+RIgNgBL2QnrNnU-tk zU(v3-&S!nhwd<>%^mi$V$z^+wyDd85GL13y-@0!%?<@c3+bdRCKdGoTU|DQCzwD&K zaF*0dn;TMHzWfMlPT<+S0(63lRQX0;h2ZKM^~|f~5(4VSVmGQu9-Z}s<79c#E!W&l zKD*ydGkCYlo-y^zE{3P=Lh0GA6LNolJnpett?ADO$BlUQ-g(gld-`Z2E*IyZyGW^ zXIUaBz^iiH^0&Zq#z%ttO843J^=&_%vj6^M>8_=B&Cj1bc;op$o83idbr~Utb^k>%|?~{Gl|L;XVOI8Y>;s1^DzYQB7g7Reh`ro_O2djLy-uKx0 z(EC5<-k&-)E3e^oKjwQ*N4A~|n?8s8r2X&B_R@7v!|PlHlj|Iw{`|a?SD^mq z>3F{TpKb3iem`YN^zju%|1AIi=>NZ>_{R74`XBAT9?sFQ(tML*^6~qj>;wD4<0@5a zu9w$_|F~@bH#l|q(du0RUd-!VV{dvjU+-R8&Z-ih^OX7Z)J1KxE(L_{yYyh|sRI?Q zj5(1jbfRTn<%DQ`-K3iMw21xrq^YN!PHKh6mab&j5vX@#iC4H}%{I_)^u?&Z({|t5n0oCq>2PEr?FsaBEpqa>9%) zxeIolZjhYu&U6La8qvtSY%W{2gA!GYXJ%Afz5eN8;98C1#R|LPwjpkm!+hJ;M$lkXy@R|3+J(+K#UQNFK%DE;t>5glb>A7ps+jBPk z>?=rk?`N6t{`O|)z?AD@2RFa!|Ndsn&%O=ue%G%kz2|G^zjgorJ=?rHO9joduRAs; z`|N%((WlpFzZdf<2c!K#@|HyrxeJm`tGnc_bWPj}1jCKf9l+g5jc z?JCE8zx^C$e#v4_c@VMn#H*=q4xN=*F=_TkoOPL)~bxqjN^uZ#QD5`6xC6#jKcMDZr$&rTVGx=Rc{B%{BVWc%;mcJW%w zJ^h(hPkJ(^pH02Bbj#};S);aCqqj^`cxQA<1=qhZ__OGs>VqGdU%kqN_1mBNoZ86g zQKqcV?r|_psb47l>_(+2Oh?Z&KG89G?piNg7}FB3AbI0x#p!Cf;N3i5_B~3-`E}^@ z&95BS*SI^RMISHD?=11TNHU9WSZb-(M}*$lV&_t?))lU;m5{@(?5 zb0x|-m*mDyOqJf5CnYd{^{0p1C6+Q4Ec9Z&pELzDAueCj9V#XA zoV%jh_^Ff8g4t{bo-ZnHO?fqmF)}Oj|JV5crhg9b|7lPg?nj%etNQ zRQ{j6|EKp~{pMcIC+q*-TAx{G_ww3wp-GL`cDx5=rLU2P=V%zs3^?;y@u&6v&(`NH z+Rtk~6P#4}=T6CM`Ckj=Pr2N`2s&}vw&t;UU2@v*w;|w)E?nwLTt=*G$@8LMsfvBK zr?PDokNV=cZe>(%!3{CCss`Wng6|9&)~zp0$Xm5KM9Y-#Mri74r_!m+Cbp9@zlUt< z+VX0u&;(!pl%Se(q*{ z^I+kohrDd3xY-Ul7^lU)=2>E%d?z)zWQ*F_S&z-um2X~G%65E})FEOFYmfP{$k~0 zf;FaUU9TB(*(Q|6mHqpvVzowNLvNw9ftbwgU#ktJ&e}*OvsmqlDqbs*ns)B*{u~AQ z_o6GV?>l2_{o;68nBgp$%V$0_76j(6eGw$9e5~p2_sVYdgBy>1=bmx%+m-D3%tyEM zecI{1NLgjE34@*ssA2i(;P!~8PVZX-pu-j+tqz}#`fY#qcghOQNB_(3v_IeEzVI*u z!~ZXyE{-9rAI>~4h*6&8lNQjDa;+gHXv<9IlsWDuGk^YcFzPSXytI}vuI^3m?|r{_ z?~k6Zd*(jRq@RDfp9|zZD@~clcJhyI&DYiOy#GJf|MQ>Q?cx0V*GDPw=*$aSS7^s) zE{N{Y^Y+*$Glgwc_@+w>EW%5#J~eu&bn14*^AEQ|;w9aF-R4bN>A8;oFWU@>tjgER zK3$kNqxzz?q_Ezr*2afVPftI2ao4g{N^4?v+N_D%dFZyy+Biuz-U+*-q)U7q!Wy#s zuU@>CaN&mf0@jk*A*+4n7UyP|MJ!ux=y1kVnr9JX#;XaD#n)eRoo&qA_Hv?+uF>;C zTlSAu%}>I1X7=-bZ2=w9shqr{b@kUTOB~<+m~dx}=RvkM!*`GDe(kbmJ?8w^*6aAO zJ*)Sw4K+P+Mdh-Rm+fTUzL)JbdDmGwUN-X>B;PT$H(s~R?{V^Bv-tu0A77m4Xnp)z zPOZiKkTF+w-qdv^pQd7jN zpJ1_CHrjUYER*aiC1Jy5W;5SP_})ut@TvNGO?S3$w9&HIKV5wV>+kHVogK86{{nO6 zeYt}l9Tk2)*jMo8h2qT8yA_XCC>{4GJ;8SBit6OJx!PG1{qGiC;@!>D_i|!Sq44B!8YU-Ot{ z8o;A)+;ZJDm&uDO#p8v36g3uXne{9U@k>+RKa{BHL?u4_wALePROfD2XU#ac! zY&Z9MRr|Wnwn|;{&mWuWu`hMJzGz*|(u41JzS6oRcX{4U#~8I`^KrP4RT zUfX0%%+~Un>UKAxTe!^g*pbzHN~UhF){2yk;%&Pk?@Q@4jJI$_0yIf|M3^?{zYO>z5vutM?ilVz2cOLxs=1Iqu zYdIV4-PDRu-Q;u1M4?AAyf`>{hS3RGxi{R-GpcSr=KEUO-uKOnIiLC8ksYhouGLMr zbM@lAbt13l&C}yNtmmS;>AL!Njwyv(=gpS;ez8H);27`h45Nmgw)VHD58Vlg*gtKB zf#wyL{^z2eY;`x6nN{W;+jr*1bpAR+^{=z^m9D5w&hphYy09nnuoa`Bz@D2871#T8 z6Q7qcCoH(ZV)Fj(R^MZ>Ir0alWd9CZ8h80wr-#wn`5qgO?csLlTNc~1yX@w^*e$J# z^lrYM=($&I@2zM@StAL%tOeC~w((1G$n%=dw@EZ&F!MOJ#=CZ6>WxyTWw9<3_PQHg zd@Ox9cl$jVxjpaK6`Xo7V@vj#JsJN?PASY33y|nr5dAc-H&eXy~bh(spjD6hQ6@KJqUwO@dY;>^GL&m_wQJ+H-ln3Ma{g+)?= zZ9;ODVRB1~e5cX#Yj1anDEeJmDQnUg^x*PSgIO*$j5lNoT)PC+3%E~cwOU!8TWBe5 z%2p$r@i)e{?30CL!8IH1Yk@l=tyz8--dV47e4G9uqkhI0)%;Ig*iP+yuzkhn%U8p# zb(nX$w6pH+jOc&BBjet1&h*VEk1y3CjcN6J^y1&#_sRSay#m~20&Rpqw8zf7AGjRd zdAwqGl*7|kXB8wZ{++%5$M@=`O|>sBEc`HaeU0n?{pZ;y)xTO^r?pvMi}!-S_ggiB zQ4X;=9%+AX@Be%Iu=xHTM}4gR`v3ppKfkc|bSSjCaG0}fv(u-kt4s`PmuvDCbqn%c zWhku9uFY7X$$vfe`@{`Te!V`lN%eZ`RkqU|C0X**rEaV-OuzCmePw%q$CV z$m_T1tvVoXwy zDArRty|_8H%ZB-&GxJ@xOLw=OKd@!%L55v{&jseHy}k9ibNAr|w(HlG`5z23*|jW6 zx%6b|H$^YqqID}Q)s%Q-CYRY+b{)L7q49UZjF~dq-ZpMXOEdYR;&;7gM#WcYf$uX{ zxE{N>>->QkQBThKWlgG1y><0&Z)5oOzszrq6U-#!Wdf|eHT-Rs-C~}sbcVsO!N%NJ zav9H@>ryKIef?Tft4<$dbu`*LS$4+t6=5?ch6QY?`qZ)EyT95~tLr^-5knlV;vKu~Y4`85iRr z2E$#C&8ie1C*>B@aBn@uc63JhUAMiT)_U#ScU8es+OzEPx*V6E=X_iuzn<*O49{UK ztzRZ5$*do<&bFy1Q@lV&z%OR4V1rMWso%A%pDFRvIutH{)4Z%LX<>G9Pq#=8qwyiPw8e{U432(k0k86JOEarfIzzGi) z({+_x+nNh|G@hS+J$dui;~WL&eE0SVtnpaiXc%z%#q0P0-i^*i4sR}|d}BN|bKY^Q z>(?b&PwnbE|2X;R&eQK5z20fxi)WkT8|m=f^v=3U+c>kQPWKm`^JmES*{YVs^Mk8x zvfW9KWwA^zC0zZ^?Dp~6Zzk9o_IA_U^QE5`{)m~vcA!;Dyrw(U?uXc7lMlLK4p&-( zq4&4J5sAI59X`&^*%4`-F#Jfv3YX}i_N5>ztQ`@MmHthTOMg2 z?y)R|BUoEz-s68Jt_sSJPT4MReE+i}d(K)p$ygnav~&F|74tvLec&DcE9l2#`+v!6 zi{F~>K7Kk9l5O5|dF+$$V!p2JnmNIzYpcwhr&@Pc-bz$DzBP0ycnR>nT|T<=SDg-T zmx_)~-LNO;<)jT~zJ*R%Yjh%3&MR!~hFaCKxTy!WUQF1r`s{)&n@mj11yt7sZ`rwj z^-+h-{(%o(bqO)%&1cj#=v^tUc`0?N>MF~1tJm^O6=ge{x^&^DJ!jUvUluo2bluC& zg9cZwFT9n!HTzXoaJ71ZSi*Ag%{_a0W-%6T6K$0<^kCg1{o1+vU~zT!WTlh2y1uKt z^Nt)ituQkx<*Tb-)}-Y9PYRjSgSNW!^ks6pT5CL*rSav;j}3R$sJp+t$5!<=;$^KUcR9{%fG}c3$ z3YXcqg!S8#CinK+ep;~Y{m$R#3g$B!PE5YE*7#WLBi3Cj%oN z>#g@>>-)*n+@YY|<@4pn6w{YX6YO&hIQ~>!v0y&IlpH*%=#15bKa*nCZ9a8q1NQ+N zX0NUDHm3=lkh;ON!@(fIXRhG}>BXmd*6;t;b+|aF`OHSI#pf*D0$;LBI)CH%)=8zu zBx1vs+?>MtYtD1U8_$2LuW!_p|0Pyh7qsLDvtXO&LceEf3&J1#mg|?&E~@z&+LYN? z%5=lQXv3LG8R_+N*$zDiZR!XC)iIYIY!6uK2tH)pX)4?Cz@H5jW)mfkrYmo-wy-Gj zTX4ou=CtLUYCY2n`Kp)JXnHcgD7yZmepYqNtd1Fgv*7 zlO5V_4d!0Ar)&SStGsunvR9+`QG3^p`9Zo1Ec5mYPvMX5u6q7r)sNJ#K^o#V_j|pX zZ+I(aHG0mUC-Kg3M-JcIwOhRk)spVqzAMGXTeV!hEoB$0h5pWeRm{(Wte5GniQ8!t zB5A|C)0=lrr$zFu(5yozy6sM0Wjl4nSa>5_U*|ifl@@X4=GR)aMweCx24SJ-as{bIIm9mi9)Gg~SSy_90sf7RcZzUXwRX(-zdQ=@;c-YeGbihnK` z`Rvw`JpY@wZr!|SaOb}2hGk-s9%@H--=C*`yuAEIt%LycK8e!6ZW+ayCTg!HdTvge zyCqxcyzpY?#J4hQ=N#ji_M7EIvhs`~-W&TA4;tlNpHbrL-*d~%AV=QHY?E95lZ%P7 z`+3sO?EbN!^H}T^waaW>9!93eqRrOvMw{!Y2tJ;5M^V6?Q=~)vy^)~k=URTSS z#5-lB?Y%u0ubHix%#eL)wfW6kWw*B{?seSG_~{t0+OgieJFVMPOi$k4mb*3C_Uf+% zj0S=!FB`fuj54qN$Mb9tPSTd-!DKYQx6(l;H}QOswGww-H!QuA2v)uff~`#P&q zgqOuyM1#&G6}DZ*E26u=-~-dV_xnC?Y5W-5r4-yUJ*yQzGF z?L6DbEatBlm{)nTO}V?HyW^AdDo?emR?+=A7jg=Gu2{JB-(B;1G2784Vb(IIuSPli zDX9>%eckY9PVW_E=97~ejVAPDif3MPnP}?2Ep)a|$>LS7Bmb~XZ;xfujI%AP z{%#FtJ#k=@(y4|`jt1G14rUw09$MrXAN$?$T5#6PV)-tu+r=kX>+5(rPOob2lp;I{KZ+Vb=I%P z+nz-oG*m{~e2y4=W?E%hu?|;;1Ky&GFxY*Y^}oKb^R9 z_33NAU%ciSXe?8k$?<7TqjBl+EAoq5f3Dn+Ru;6uNA`==?Y?u@HV1!kmox6Y{cXal z>5Na-6i#RSd}BqX&;D0Ju5L5R0{eL+Cg<(#^Vrn5X?cRR0P|s&S&XSXdsxma%Z)Z` zeH+b~u|D!%RsfHJu;;NI-Pio@DOb)u&pSzQ!J4WkbC)E{zM?(z%Im*EX|W8SJ|?&G zcJ2LonfG|+=aM@MBn<3we)p}in_2Q&_;{y+{PZbBwU>LPWT&hQENg$=Q+Qq1ygm9; z&+fe4Q?F#RrCo?EYLT)^}0e?qkk^?;k(UFVSFY zYfOE1OH8HS>E#upS4>U0Jzq~;+|Zp-Wb*oy>6@;vC-wTZ+yly9ur^HI6?^d0a~_xE zEz>mC9!_HkP7s;U_uvY;Xea@q$x3-%$89;#bK;BXLaVsmKmGH zz8C8}-xE3O>(g~xp3hwt8swDI5+F%OA}vCdVPqi`B^I4S2S2Mf0N zE4s{U7>opbk4T!on&wueV}5&=W07<3@*wrCC%!m`iNu(m^qqO{M6cIZHL2M3rapVJ z-ZHmN6bs-8V4KvbR$a35vfTRci%;xkUl!{6o2*>xwS1n8yw`)9)e6kVB+40&E(u{i zCM(NOoc`j~kt3^bAGoO^yndd6eX>LLg`N(T;AS2PVc%m5x^uH8dajp~mp0rW7usud z=tOqWq2H?3BKZ?eo4%Fv*f?w6yh)wn@ovx3UM_sIchX9Cwk}cIuvy=%W)>wrb2XV6 zSb9=zTY297SGP9$nx5EQCM6=R^4>(lZFl**3m$I;C%icpd*IW$C32PJH+E02db0Oh z`Lrdm@-_(uZ}P6WOm2Lv+|GY`4|l||4c*`TduEgdPOjN}%Qm%jvFRc;Nsnd!xIvQ` zne3_o`_A_6?vM$d+*2t2^@Pi0`91&RTqiZAxK7}m)G2rRu2trL7LCb8yfVqxM0s}? zJ^$j#Hes(As6^&6Yk0F@PWG+V6|UdnPR_457rdtNvH$*z3)u_)c+R#quvTC`n6vud zkIPF!q9r<=Wa(|A74=x z^Y~-(tnxLEeJ`)s?60{|y_`eBH@beei>*hg*K9mr zZ!vF=lJbe4T2CsAnfVh0!?TmO-g20_CQeZ6ba;EJ_quTTl%Q3oy{B>a-Fz0|GV5D_{>xKm zcZDU#Ek{WZ%g|9#2^ZiUTp!J%pyaeHT#1+ETl=Wz(1GQBOT zxnj|YB_YM<7Bp(-U5|bH#W63yW#(~)Q-+GtFJ5x^ezUkD$^WHH!opno!#3_UjW3?L z9hez+vP_@t)D<=JE7wcRqHY z+rx-0&SjG4cDII)cFj+m*^XaP{=Ar{zP$bIeUoLe>O4J-DVNqZrabsLrO}Y@de0Sw z;Ql$>rx`Z&?Do5>lb-!x#+2-!wJXEbvU*m3oy&H7`+dLjPpt3Uy;bu3<>fA=$6>E* zC%qTdVLs+Esc?r{mye4j(*=xBdrVzbDM9P!henxhJs~*5o>}Gi3sBLYV8(c|Xp0$VmudaQ1ry>9@SSw& zll0uH#%nEAUU{litZ%W*jO5()+D$7Nex|mkWp%SI;gs1drx?i~eemiv#yrL~vZu>f zqWXo>8E-zleL!EJ#_jIrwF~c%UH#7j5@uukaUB`HJ`*@08{F zyx0Br*zwIdesa~B+lu{i@oP<9uU@||>cZ=ZiR(?j)tzK8(Yt=&!}S*tjvHl9&&fWr z<#ol~8U?%Xr-$+!c~QO(DH8Dt4` zMwce%M(+5xtH0&jvs)J~B^>aUD!!@J{CH~Dk4x$^U*yj1UCMUxiW>8oE6T}Fj+$j& z{-UC`cc#Ys9|pN|rJf}89=x`}HY~r~TSGruH$wfYRK>bg8pRdc9>2<7?bOU@(iXdd zM|gc#k?X#dvBwN&PxI?>nb@fnyxGV9(YijdgC-ZwCG&nQy_sBc%Zx2%?J7&QdA}!@ zWcln|VS8-F>V*pxOK$92cI?=Nqys*-My1D>Bqm>RegF8~y0Y?}W)s*7RyxW_zT%(E zcGhJ^rw~8?H|_<7ucajAII^EFKm5dE?Xou(R~7kRSln65&O4=Ya*yfB4i6*0YsJRF zO;35bH>)wnJAT@=q58O3=HoWjM!l`auP8EKbeSNz(o@Z=r%`;up2WLNQFb4f1})g5 zmwiLjRiyH>n*a7?q9HvRyH9`BlPrB}=#eHZtUt3fbDzH9+gqzcvK=Hnjw$p_obtN) z+xGGo0(&R#m5V$U+gTaD#xu;eC}^@z$j>z9RL0FG6>r|QyW5v2?oe}k?ZbDw?=0Y6 ztheaY71ih0RMMaJUF&&Q@K*Es#U0&IDVNsRYi(ZF&ir;hL+S!ai@H}Q)p@#Bx*l8c zx-h!hXM;@e>Q1HA-+s(oJ|#^ycqv+t76ux2%G=_?e>?91+9s9?!uEa5XzUU$~k!a)7|^gGMn-M-eCGOyp>zW$ud zWbVrFT^*<9q0?jiL+U3Z|=4>4s1z4%Opayupg!*fhLg2mS^_0_7s zbh3S4qY-`O>3Wlj=qpDrhSoUl74TxdP~Lq>;agF#luCWeiRMP5_zhm+y2cZ7xol;> z7A<_2lgp9oyQM(Oc*oJTJMUk6C8D{^uX4e0#px609XpWg?OYnMFK6YeiQ$@4t5PHO z)y#B@S*p#`Hd{KIbuYuuBOdE7tze8#|p$=3R68sUPo+q-(4S z*CidMPrq!m%I387cX?Fmf|+Ih9kZTrGC#REF{0n* z&DIm&9$FaMsrlYAyrS$sGvmI?+l{xJW_HLiUvineGVq>Ll&R*`S?jOMlxLfNj9Ook z?X&v=ThDHv*&);S-0a=WGi`g`%}Fag)y_&Wp8Wm2lI3T?B{nb3Ys-?|`BwQGCG_;k z+pf9h@6wa+@oIwSZni1;K3Nm{ zs}4Q*@%X%ifc?K2i;gyY{ye|pn!}81e*Rot_Kt524RSX4RDD&qPyCRb(Bm0ivW=~y z@d?NAB?<1E_1qSn*itW~!ac?FxS#o3rMpt$*^7?NC=paui~6&vXZN`tnd4C@K6_XA zf7{8duJE#SucwF^yPIvTCHE<&t10`n8*j-t)P)|4;oHA*V#+ZK^Fq7h$FdE)IAva2 zz1e>Jv&ZK9+3)sR>s0ra=1uuCH>jVdhUvJxnZ&;frdxuPs$K`ixK4RnJNHG=t)1dQ z2lA#gM6$&i_TEyoaO)LxSaV{drc}9LXBx}A#_V<7kLyCD{)nwI`Jo#ETAu~pUUD!W zy!fL;QK2$WJS;O{+ltfinGV}maIfcPJ1HKVxu9yP7H@`r8-vF$4&j??bz)cEJ8?xV zK0kh)*6A=UR_TIc4%sOilufQ*zQ5ye!cB#OE$1CJ*_Ld%(#FaB!m#<=zIW3ugoI}{ z#4h(Re0e)mR5d8OICsTHQ>9}EjB6*J_6p;iwbEDZ?5=&=oD%NzGH+|lPOhCAyFL7X zkFJqgG{ZL&+wQl9%a5_8UUTI#o0xRV=W590uD8!(B+3)79hF+OcICB=S2V5%P0wMP z^Lv-)#dni_f7{_`op*gn*yA6*-OJ~lyJldVdLiq9wWZmTWW%?ImUNe7U%7T`)vPDq z%A()D;kbKuF5CHgpEwKDR`FV_kKdrrb@_3Z9P>$KXJ${6%7BS4Og9I6t!C@%lsNAr z#na!bwRcw4lg#FaTZ=Cz zek^0o?AhC)lfU)ny0^1gPD)fI-gtT}cJ`AdUz3>{pYFxp=AC5tzR2O;zS`&;yG*%H zS(m@zur7ZW5E5y6((K($UX%BMDv}z@zDY#bm0f9^`F6JdybBx#$v0X(!%bc(&8qoy zOq%7ymc~W)Mk}v<@nM^^xKMn8Ppr|h*yVn6CmFn3BsX))YwNu8Zj%~Q9?aP0-(bXd zjbB>BK4r1<$G=|Nm%W|5;KxCB=4Y`>Vvk>W{US%!QL_AXPvP`~MzxdXS8*l$o58$U z>7>7vj}S@ucg}>0~drVNImCV!?f!_Vb43JtvBCp53}*R z?$sd9xx&{Xp85Ei+K*qam(+yV^cfb%?}}r3V^;T8-14~Z$v?*#;-CL~>U?kNGX6dC z>@UCH`n{#uV8R>IeexXFV_#=Gylhv}iLYO~sp`_Y(uFK{tiD)1Iko5XF^*F+s#9P0 z%gzbiJ%^#BWZ$x7GqaDre%4g94%9VR3d#YXCJ-Cw3_Va2=*PVE9d*yNc<+dnW=>^G z?cTL#DqBUjR$RD>N_@uBgRh^iGI^luVzeh~RgjfwZCf;NR^!u2Q@x#IOIJo2T@9Un z(q;A5mDl#=#EOUML@On}xf&3xHDT%YPY&{1_g(pW?d6ZIOQB2|2d0bpYfsm|Z1wWy z)1|9f_Z=u)d$2ILwlpI3f=`OXirBqbQ-7&UzgZ}nsv6fH(>yVJddx!4)MF>OCmieP z7RhB0Pe|+aFur*I+cmc8H@hy}yQUHTT5NXmHPN{WhHtWRRs^qq@@!ev?CY!Rb}qh~ zuz#iF^%({M_co;6YN+uj@Y_IHPI*kN$zZMmJ>57RJp7Eqr*m(kS&lUr z>0RGlCcz=C@cxeD?&Z2&YVU7#I*JF(G5v5WwSY&1`2>f>l(|H)LW?wz*ig}*mzyxzPdu)gMHPkht7CzKemC}{q>79+1_0l ze_eKM-CkGZ5OzOh^6sc~R*lJdb4}lUnw8SCdym}DlRPTIo@@=q7au=AXY%e;Yud~b z&8#`T8~dKc?vuT4r^*rbb|Ys%-v*hxYh&LP_@;ygrntu2no4@OIjjg;#p@(#c$mqr z@y3p6{JVEvOqe@A^0eISwU&O@gpTIA_CMa$XD{5hID);dvPa@>+82(^%tblEuDV9& z4aMKBQxO!c1MQvlGX1bS=VU3<>1-Z{^}D}0d#%4_$hKO3=QpXw&zDr?1Gmil>HcQM zme+9{6VuM_eX=aXo$;Vc=lOyI`)(;;cq8m^JEreCr^WHt%NUDhp=1Eis(4Tz0Ms}B z1R5y1ux*9+Y7iE*yGgG13Qj>SW#V;=Vl{VGJ`W9_^XL>{S z-D`shYs0?m*e@-R8=Ac=j``Wji}MWZu1IESH-GzvD#^=Y_9F3O6d2N07(m>$-#?QNW8>&m+1~NaIc~UTU z^}ikb%Ior)Zz(e0OI#Xr{=8qyN5S6(2lt$2sJw8kVDGmVMeA>we)+0s{?6%&693E> z(|!0;4^+t3PVl^F=5TCB_U~t<+su*$_S&71)=9q5+9>{aQu6tfMJKYKrC;@zG*~89 znagxM`|WAz%xl@X@4lYk-nRGLf{MvKyT5r@hqUu(JkIjf{q!z&-#-7XC-Ux;Cj6gw zhC?Mg&%x)_*Lk*)kJr^!`~EK2ac_N9O3XU`oA(t0pCr5YbIiy$^4RzK%UZTm5~X)n zSfw2Ju`RkWi9Jo}B!kfc9+k`Tk`Bw{A~(I=?N=RZRC;Pj?0i2KmHB3OE1%Dme5|+L z{oFN`$$7rFzFzjP3)y<2e^%0K^;eS^)3&AF_!`(?!F_y2`NNXGTMimDfL1ukI7&K9 z+g+M;=j)ft`6lnG%vO5VeGGQ#+8mg&jrD|Q)mER~JQI>xBrVeZta&xb_UbItSN+O5 z=?`x(S~?jeyxH*P<%yi#NvAel*I{0|BQp7bYsvM8=8Xx#CF}cMUXfXE*vV&o z6;rtPHx#oxifOP5_6)J;UevR z-r7qIIf2vnUs5Ot%wM-%cG7*lrHrqqE-_iKHzKO)@79GWqPg?z7F9h7)t=tcbxCyL z+MRA|=a{XT%X39`a+j^Coj}{KTRcX*4!d9RhIt=8vf*I5b85!Q^&$BwuO@iTU8kcT z_}B1RtV{n&U$wPT4eQqH^1szBUAU|1MM0<1`7273ANgdNEsHL_`n2grUUQMsg*Cz- z^YT`h1+X1j{q~O0RT<-;{+QUvg;gm*8wE>`Eb$8N_W2?aaLj}!!f+-Sgs2$keRzK^%#qRqQ>#L=?OUOj$5P!$>X8!6@@OgHhnqnDT7%_e!j{dv_P?IJUui zbBrk}9)8Ep%;Mah^X%f^S)T>6o6;CJI2%1TI`&n<_MFDf_`93$ z>X%-KuaRZXYkyj^WA_|ZhU%8D%x3$;EwX5~ zUH_D?Yt7!FR4dOpgV-Sod}QHtm|2y!K^;|6a9NnIF&hHD;}w$q#E4 z!P5SRXwY%30isMNYYcnOoqf;tG3IM>rCi6RvZZ_YGV3Ql*S-}YWOIVu`r3`@W#_Cz z)2nsw@jZ2Zxaiy!QSOuCUOzun?bMPl=@vW|6T7x_mAu*_?^7nabE9%+o9qkKp4M_z zdwScatEZi7eKRvm735xJbAAn7eMNrf;-yh;akX=M+0MtZExx+&CWF}Z>|1W7w+*lS z{#GvOaqBB+ewb%{%to6v+bk7&lfV7>QXuh0^^>>D?#SzzD@u=Nt-E+LN`Hl{8f~)Vi%`L3;U9rX>V%<8fscdJjC^KKWqICUw=<0bhw*|~`f1k3>Q)Ku4 zVIm zmoKkU>+hF(!uPH9;zY-pRldFbCvMI%wTwCM%Q@#}zsL4@v*!iuGTnN7OWmQXRc8*& z2n%R1Y_M5+>v5rEMQ?xa%6Ox#C-*Eoch*PRpjujk@zbqJ=4UrIWIncXox9TcUe1I) z#ka-Q<{D_QwRmnnwuSq%o`dBf!$8m~iZxm_a`N9hFmRsUC z@TkbMwsoqgzn#w~d*{9BiQ{kX-&AByQaWKKcl4^&s}m0kLjH^KbN6{}Ulwk}cU_|5 zfk$P2;x$!;GKaoJW|HOEKD(2oHKH6C zj|olaX}sQ?cjxPa=FYi3d zJN+)LUEDc6|2KyUcOUD?c};5#XO*uM`|0yo@709lFE@Q?j?M-<&+9Ecg1a5AEwN{%kN2;61Zx?zbPUUB^2waB~#bE|}9{ z*6+X9@bOmpe-pkH>m2BBNLPq!m}Apk5j*Gm;!6xW1i*a^<~FCP-%@u5fH}?gol5m4 z$SgEmtN+2;*XB6K;hz&~mhR`~(eaUNLcJ@KIHvHHv#B zyqK?OM}k^k8oXV_p~3sCN=&3rY`e(-b8xI{#tKd2f_0`Z)^J{(s=Dk_z^<&y z1!6l>j$R7bR+SmC@y#y-(_6U>(SpCMqz*S6)G4?f6QB7YX88;4%xg=0%C|Fb{%UkJ zD|;ocGjo~T*OS`eE4~{le^_&(_+=JzwE6o*e36>>*ltW-Tx&Hy%+F=U%6PU{?L0Y* zDGwrZ=fC-A@PuiO?b%(o6Lwpfm|kmLwMuLEHci9#N=-50;j3RWopRaKsq?+8lFRJv zT!!RJJH(&847ADmz{B!*%H6dZh3gL*IPfT3e&zWrHaB#F{VccwCY)~TKJ)|+qL_1T~_7~H+*MDSg|y?yV&9og5749tXt{1Ol+n}_A}7@#k{)O;2kF)NPJ#5+vr&A7vF8QtGtixIQ@E3vWn%lrd{9V zWY)en6foo1C$Dktkm1W~Yd9x7&8eOLYT`=ob0@YLeo|UAXRYVAT`A`8y?Sy>YJ%X{#2@1(+=$8K6}t1Bw-TXcex$K9i^;LV2DU-wuYd&ZQeFr}7lVb?n~hci(v z*E!B+YF@TFevL8VLAXFp0*}V#vxe)LPsO~R`o?e$vjg`E;r5)RmFivJUtdh!zyF7g zlE!A=6dUnZdge!`WHL+(dG*@<(?W+;rh(z@PqUw}GRoA?_{+A(!FXb#Yag%Q-4oo0 z^_T;#`3#=gyqZ+{_xoOTo%n4og6Rro;%?odwG$ZQ--R>Gahb5vm8~iAxn1&G!v$wv z1o(>FQoJ?4UhF}!qGdQ}(i+-XQS@TI51zEv;H^9F{xe{X{=ENBx!T^oo%_wQT;)!k z^?dI0o@XMH<8N8!tIpFtZz(@X|M~TYIaQypFIN`jT5K_Y|Mi-Tu-XdS-`I)~VDLtrx?bW0yL5jA zN$yT5HF>Ya`80J!2wU76`4^eO2l_5PzVTp2NS4g@n`!4vJ-4Uz1%Lao!8)v;?|bV$ zxkX3UCYBX>EQ{s+`i(I)-)%{h`IX(3;oid6bAoR#U-@yNfz5?%gS_ho6>JmKbI)e? zzh%D5P?=Q|v4BT}`J98%+WCtN-o1ML)#}N+cX?M;Hv76rf@bBW1!O_1o)= zH16%bZO2m1HGwfz{8{W3CFV0*+HS4yFw(oeBqsTusPCSJlm|by1)FSorZ1U#Np6(1#6}4OFvffqYYG0!bYi6Y|KVLq1R*KTe z2IFHfa+Y=1cz5$G5Y_d&w8pmR&C6?sXJ@@I*dTLxt>;!ZeWm6U%b09y!*{>7ERPY6 zR9(eom$w-n>iVE{!FSRADB}xHBc6SnF~e>y|Jk2KC%zg6 z-_N#XiySLfyX`TGpJ z$+b&;d#Bvm{XODUanCM+1#`Yd#pro8pDbUs&Z_K9gjUDC$y3=jPM>{=;ky$Dd-gtu zhe@&9s%E++h!?0y#l(lMx_3O3ZO;;o@M-J0dfCpr)n(f;x0mh8(uFJcojO+3e6}$l zY?IU0y%I%&lFRHWubz6ka8JromnD+Ux(}v(d3JDL+00nRjawGHdYd!xc4>b3>N~4e zHXl3FU6T8%wNv47mv6O(&u*C+r{BbN1|{#gD)cIQwMgka2euQ7o$tQtwK2=sWV!CT zMBc{!vQXp6hr8rX&seiq*TmFph1|}Y3_I^7>^zvTb0H(M{G9GgBk_JEChW}Q7)$h4hEy~6uoKU=1O;SBu>6G;Kv!1if)^JMa%$YwojMqr-`s=qdwz3^=FuM5U zD|g&%A6}!+y|1s|s!_~ItiBsn{dnu=w`a|z$}j3m7Tnud>us?if4b5MiITTBU8hv6 zekM4r@p;Cr(kBKhukL0xJr&oz=lHqhaWnUwtbUT`+hv-0-DQH|+o0G@y-Q-;WjF5k z{OY-{@kQaJq}o3_dUj^~cQKJn=*zt3((ix2(ee7*E{Vx`wa;a@d%8?4+_o%#Q>#7g!WjpIKS@2n`!={vkp2q16k)Pdp+HB9x(kL={t#nl? zJbPR6Ez<%Ym6=msbDV7WXzXvlc22TE)y9uk4d=py}KqjqnLM3#}>B}EHhY7PCA&zw5BJ{`b~hAg;_!G0-3~{ zir>y$$$E0#JHevy@#o3+yWJNzeqwnL>Hn>A$?e4_1phQXsaddFhDCs>?|^p0o6_Uk zct1$7FmE(^=fx0yF`40}+cgnYvj-tr#X<{N8^U$sldh{}yUHvPP4|`8vrb(#3u}G0tLs9L zzsmNT+cH;%=zdUIl*X2SM+BVn5yR*e_l2 zwRAP#&b3p2C9n59wugJ`_N{DLlMUZ8wH$Zj&10_)?eF<)dhVJ<)a1Cm8`?77`$TL{ z^8#;6TEVTJb7|d5>!jJUQtsuj@lI)cvZhk}_ljUS-o=X-uX1LaR=DTb%UK(yjh;Yp*@;8w|7OR#V(0? zZya%tTVeJJN42b)M>iCilNVHMcaU^AwxRn=midQU>X+9&cIR(RcIR8ECRxyDdeVKR zvz?dkCh2m;e`^D0*ZkSRZ2We9huZz54L&Y2J&g3OuW~kHI5y|?y3291YnJounep3B z>BNk(lXtBQ-!n}q+@`ij=I&ad^^V-I*ljp4A?R)$qCFzQ)!ZyLr z>z2q`P2+Gh0V-_M~Fp-HQsvHLtt$DJuxuru77zF)KTArn9Z0vIcq{Z+p4|aW+c~G&kmAJyp=uQcCNHQ-^#lkj~~@7nDMu2 zPl|l@Pls|%RtBbR4r`j%&CU%Bues}P(;L;`bLHxTnaK^24&etf8GNkFChRUcDzx_F zyt7{`^w}Hk|Gu~SY0lbTDa|QL7tb_iB+Smx`@OP~?LZ|@pXcuT#i9&6Ji@MhTaPms zyu4y#|8Da0K11;jK2?^_U8cXT@OiURX8mlogU>-1d%1wxilDj+wCD>oe)rX{>B$|D zN1Hp7FP*E^{y1lSiN`*H_5SZ(3q0)Jf6}C5Pspu}j}u-MpAIiCkAL;^xz@b$8s2p- zOBtU}UD3@18nSp$WvMNmqQ6y1Wwq$!mHSU0DBR-z@|sJh;e%D{wK!$Zns$i=x9`c( zjNi6SSZA_VY}_WLDQnc6_8e;1;`-Ulc1^ANj^b|dd|p@GO>WFd4N~se4^;6&}xGC$pWHQQF(n!!haN zksZ?IzADdRT_$!)RIl3VKE?2L)cy@&6O&#|?9^NDz38|^=}Nhq*IrEa@imH9Tj{CB zD(%t77Pln&alzZICnF!Pdy%&{f4#HO#mCLRziTf2)%N(?_V&!_jvqQ7w;%qPye+rE z=hRo;z1DFvzsAF>6H1MflG_=!#$@OQyDj}b+veE z;qpJF!9u*t@NHK%$Amt?XA-5$)NU?5w2v*N{^Qpi{%0EJg1(BS7q3lN2p^TP{s0dl%jL zd=B@C7e%$Q=ay}`uH>8f+->j8*Av(#O?PtdyEEz6o=>J`W^=3l?d+L=BOE^cwx(-)mpU7h)HOHl1(LBSZG18(fMc#q5$31zD|&D$iMeJbUHtF2L6 zB7<@1k=(Q2et6AX$2T=~%Y>+ zl7!3JGX)#ex_A_XBkygijJ>flH+jbVk5MU$PHibalsVfZ8+5?gvbUGdTv@`id&chF zTW6O)Y_qgARrNTwr@QW?MfCf7i3!;ccGsR(bDdJSW!b-q<7Uk9(dkRvETzic-fR^V ze|hbSeDx|*-312klUODs=NdhWwO&+tech2g+58t%qg)bilsX*nQIV82&#6)|m>^Ay(V*6dO zcU}*E+}r(LNaDV}fLhg@((P)KdN!AuyzN?d?TTvf;y)Lf^X`ehp46DKGy3$yTiKIW zdWO{&^%aU2{JFDviNC$F#j%^egw2-!lkhmUrTc`TvRd5yMfWV&CpD%i+*Cdx=h@dV zXQe;e1lH4$0n-YnpV`ebW%3F`1|AjR$Z4I^w=teR&*iYy*Q=Ci8B@H2Wn*f4(zBZx zxpgY$<+FDl-t6A6xX3YbQ|>k6+wnh~jy<(vzSNX*|9lk7lM25*>GSx{H*T%iU zxznAc0t-4CMGIbQUY5w-8?Sk3Mgiji!&}-MYImbPyb9pWse2Noa6?h7(C)ZU;I}VX z{>jVs-gme2nKJ8z&bez2FHIA#o=RDj=NOq8>%~k~|KE7FF`;4R@AT-*8)oiTbdOg(;g|Mcz8s_NRJ0F1FxY(GiA5qt z6*9@e+c|Is<0+u#20PUCad z;UDLmXKQcO_+Pr9=Z*cp>zcTBlMObrPh2~!{$%&Q*SneGRL`D0yYl!)tB0DO_TK-!_t!(aa`{GqKelzh zme-%N+r95&&+{Xn&;I{iv0LG%|Gy{xhxY&fz2E!)xBUNNbsxp+1D8f;9-p_m?*I3C z`OOgUxqEy|55AhZ#AL?aDW_WRI=M*Q z_hODtn4uqfMe(wc4ftX!?&{=vTnJSZoihbcjdW;t?PBa zNJVVFWx1B^%0{u79mdHoUp;MlR>hp`v+tMHYv*|Py;a)Z%eTL}^KDwyK_da{tOvI< z`xz51|MM)!Q#e!SFcY*s^5x{1$T+pDVc{9K@2**C`!2NC;OmvkY$t>d$2L8kSa)XE ztiyMnOqjD_WoTaBs_maUoVIgK=u|O2e!%-#?Acznqi2~?e(4%ty45N5^5#mxtvy|S z*Oi@XyM&mp{oTuUc-hXAg1s(%hVPT^UB0V(c%2+`+N+7bSGd1(u3Z&AZ~j~p-^?$$ z%qf;}{Vi)}U*nuqxXta&V!24oJK1~HD$}Z>-d$rbT08$mFOSOQqUQMbKZ}|w#q;-M zUpuqf-Y76dVJ64tdv|Y}F4s4D7TfUAPk6(g%FW+B*=BieXWLNzu7L66Zk`FA``xzG zGfi6jP3>9i?{9BUfAjKNbYe!?-GWCedUiKFe0)5o?lI?8#o)y?ucl3AyRaj+dVR_@ z&%Mk32CrKYuXa@GvtHJuiPGhju|{7{+*7`};3mV&St$#CIBu=}6!{Vz%Ox{gu3qPHf$sF|#!v2tg^fVdWs6UqXFkDcF*%D@W`Bd@bWOK@){72> zOs4`FN?1~Y*4<2F=~x-sS9;RHXj$wT##Hn7i~N52eAZ*J5zb_5OTN2td)TR_ygAIX zUD8;Wa8B7IFYxuTOd9JED?9dCk(WQFI~jMqoh$I1`Iw>a?BiVqe|}}J&w3(paMRoF z->fIpwyg~AYw*uck=a$5x6`29aH&RCOJs8#OAFI7mma|hJRFE4r$h;n9F0uXXjH0(6&b)qlG4+UH&&R6F z33EWrSkPY04$zP%BbT_>&I{3NJ~94?nZkV}^O4-;1uxDXN!Pk3{QuYb|Eu0x7tWPm zRsVZ?z4f0T{r`8=`TVi}|NOs(vF7(XEB^nP|G)UhV*6jpd+V8b_tjG*B`X^f6_Ku_++cf?XFsfjDN2`Y>ofD zHoYMwoWJ$_Ed3>N$NRZKR<3^j{q+7nryu^_ z_x`uh?|px7?~h%7+Pwbr_SXIXUhn6%|FzhD@$=6w7SG>u{hR;258pqQIev=&b2PqX z_Zw@TMj@W4pY;p|?{98a|N5g?u--VPU*2xtudC}{?OJoc>~`+2e>3X;++JxCuy;z; zZH1i?OB+FpxK`{HIo0~8CUknR{2rx{X*%K>*Tbf9%=x)!>AVx$_&2Ow8L@Us)-Uno zW3JZA`<_`{H4?rmYtZrTb(WFA+kkHMzJ;kFtKYtVo57*FI_#9>?0F|#`U(%mZJpHd zS&P%zV9{miXX+`BOj88Bv{z1Rdvzg8DRtMvWky#*roFt?@Tnla{Z((_v3154Yzx}o z{9CnJ%PG}$=doL_yd*0aA2NJO@b9it;lClV_^R>a=B7_^j)mQeE-{p?Un{tDS*gg@ z6K``FHqA|c)Vy%%Qcun64n}(?dmf!<95HXx>xT`!E5qaS!zJX8F31isJ;`8X+sFR9 zTD0`ogwwYjzP@Jewgm0K)Vx-6BH>CrhsERUVm8V{OjnnxRWp3nA0Rn8Ba^)bExw!$QP8^z1vhRw){?=SKsxG z;YMFi7`-`V5xx1{vDiOFHNQ-@o?QO*X#>B6(y5uVo>adRRInGhyLM{O-wBQ%l-Z6Q zFbsI(cipA0F*R#)@zaJkeAjCP87KUlH1T!8TedihnBBWg7x`H>6-_z(vH0Op@kv`= zu}n$+y`1CN{C`^-H#Ba%Wy{$!(^@6@hN$ei#-yytrgd%mPF_6n+IUiwvuEV;Yz1Kn z)~dyeO%To^r15BMekHswUci(W1X*1)Rx&B>c zEK&Ei@3fP&T@tAuduZo8v$KXaYPFLrpWWjBZOd@-4uAj4ujegNr9-48s@ED#c>DEY zM{>ZeVwaf7EA-Es=k9;i-FWYNCAS9ShP8$MT?)6$=4{q?o64A{^nOX=@$99IA7^Xw z)^UR_LIbZ2-cuj10ofb~8KBy+yoRAlTTt^K==k5(`hU;suYI4p!>`)Gq5pj0w#xbc z`2Rn&PxxeQudLlM*Xje@;?R7e*Ao*UbgO&dVSpInxn_PF1J?62DJFj<6h4mn6#}@uKw@! z`nfmdj~25uJ>=hZlI;)ZxW-b|g;#X<=`D$_e`XxN`uXo0$>(pUpEYl-|2e(B_VE4V zw>eK9sC#z{bVy43_4s<*&9w*ir3-$1{$Fr?VvPEVgZ%g6zn8`@-`~H3|AN}%rXamI zZM)`^K1Xg$xo$tt-%bAd(_e+X`zN-`*F|LC2c3{C|0J^ecXz1NjyRv#ZP0#Cpwx{x zo~>q8v(;}|mu@#z**j6&d1|BKvshiWwWgx0S}Py6`SJ&8rQ1x(f=n z%Du=F(+R$O#%$|JTejmaGdkJ6mzlLrTPC$M@w@bbvfFkCq{H84Ni#m1)pcn@R_k?@ z%i=rtOt}^)+7+{1feJ|a1<6l(sJvP_HtRL96eDTQJ^x5FO z)0Qc#R<4>-DXx|%(;jVRdUi*aaIM%Ov`beU|P z8zKEHZLg@v0U6n~<$3pI%5rY2EMCX^`r53VEtZlf)Y*qDTgUmY5t#+$S&EGH5n^}LpXt!PAp$9h|ZZgcYJ2|6L&^Aov z=M~*9CFWCxvt)XAFX~WGzO?SWmx3hY38tq#r%N9d%)O#IIZw9n=i+|m+bxPPVI&9i$Np02sQ)qNsw7w?4mCKk)SPQGO?DY4u##{TmeW1~-#3d8#<#V4jd zh?ubE#YXQ5JQC^`A9I{IuyKmZ1i^%!8ILP?4cxc5yx>i*|>t64hvF3VN^ThOSy zp+{3ZyCJP5Jz?hYKMqXumlVYRR_wp?t5QDbm#F|xhft|lO}zBw)pzekO~^T3l&c`~ z;hD`lQ~STOP8b%PsoeSc=Oeiay*uK8kA2>5>|GM?F3|Vk%na7_{~H@DuX`~+EDn|W zBc`?QPb_FqT=9|jo7Nz^FJg;L9Na)tyYH0cE6#=f|6Tw8z43zy-#frZMdnus4U=l^-4{c!%jm;cifK5#Y*E3Mu? z@#c5l`yb{XI{)|1`MHH}iv`bHIwf9dt&u(PTx{v|G)pwn16jf|NWnH|KCmcrEhdz z|6i?-&zXG>4bQp%k@jjnR^y@OE7hPbb;fMvhyCBH_b)%cKmPC4_)sy{^~#a0bAG>C zz5bQ^r~SWo?+>1)@O(n*hQh~gOPBn=|NnQrXdwHn`sd|!?)C06hxwKM{C~a+q)z(Z z<@#U#QR(*Uc?GNXU7m32{C>-Cdu30x-`E}<{*iTyz|*FeQ`dm|SnPMW6_t)&VPihU zVDz_(@!G0Qp;h-+x#d#-WZSe~ z7cR%i-TD^Cb=P5=335yeO01r zaSbIitCWMM$D|fN*uMHM!_L)_4t#TaR?p)c-@~zT3)ourVPaAx`ejuRF! z`S-SX9@@bjvCOV>*OT1ny?T-nYO`t{-FWEmdwGuaioL5`kL`HDc2gna6p&DwmmF&G@_bQO;Y_Q;{C~4wgLb&AaECyJ>mE{aG%PG8tWu z%&1DamRBC0z4l=PuZ*Clp@?9BfHLXci*vCemjpA%j`R@TxJP6 zkM$aE9FTBb{(AX*BMmc$WnwcgMmz3YIQ_cvP6!RX`SBqquZL@8iV#l`E>I~BF8*6RkZXYnZeZYJH&zxer z^Is2}d3}rcx!!r7(w9d?zEfuWeo`n|nNxr7UENtJ!SqHGf!yzlLUNij*G&a20hX`f z4wd==*+1oQv^5BH43#(INtfRE>bG0Zm}xF`VgLC_`ntdc#sCJl!rttOPgw$LzL(dR zvo*=p|6y%j@PD<`o%o+q_1oqD9GrjRP4&m4`fclLo@%GZ{Ej(Nyl+CmjQ>_P3G~#+R%YM`|e)tsIn|$+`#5T{l zZ1aAaAF%rqV~~_8r)X(^*UHIA;oSYwnDckj>|frixV)iXFeANg;}rgF;z6v=MH{`C zubqy~45-$e!geTM?bY>=?wt5FVK=6m%B*V)4%%SNoAG;h)D*wFNeXv!9jxx$Upgx> zVb%$QwF?;D{CXv{)$b6)noA7Q1#S+;26rQ(GcQE0-<6OxyYm*GqzeDHEiJsCl~?7y zGl_U-#G!sxvOV)ve`BiBZC|znUrnbjTvM|38H4e}w5&-pjl*WHaR2tAX!60$2Uj}k zYhLFqy~>n&Y12*rlv&3!Hvhe2{&(`rULRhQg5JXLxqBP0-Ik6IR`$DoHcQm?mx+|* z3(m#Lf4cu+n_>AAJ)(RI&7XPe7><~JJnUEj-g>*AT!t2YO$#V(01FE7t}o=70ydNS;u*MyTpyWxCw&SZ@gG> zY2C#ySC%Nuj4xg3IjvIsSnRiFrsmd*dCuCE&iB%kO-~ul(qUfzcAFlve$Vc0={>tcrteAL9<;7s+6Htqwz6Pa z&n|{1v;F15eLod8r{7t-_umh;gGLEHyhaOnWG?GVI_q)RTkL~zA7mHR=Kpk z_{?seS&T`y92k!ZPFZ|=t8|5Ju7OYPr{k>0UAjD%PD>R3kn_4|o0-S5^rAKXWz6~v zmNV-oNu^Hr+3hp0%vW1O>FB&V-NkwhGq$qKXncHr|Ch+xhk^>v9Smy`{)* zhJbI(OATeM#HZYRe>~;#(wl0rR!+tYIu?G}Uu;xnEZT<~KI%&}^?Url-SGUD-Pu5m2zuv-a!FFY*{yOJhrq@$rALKmWC@ar@ z;8~0u_m92>z9BP{8B!nEyxnRsJEZ+g?UMugZgDZ^pPs+|dfCdUWglmKx>cCBM=bu# zqDv393xMWQPO*cJ+-~KN*b#85{hrfQ(9q7tOAgOtrtr7#v46HKyf~MknIkjCxn|?> zB`bFBjJ)ljbevI~K`d|!hok)O8_Rip{^{EM{gQsT|L=|Ihy4FNIiLD1@rBC~v+uW_ zE4_Q|bSUxPYlkZq=0!dwQ?4ZW?0O_+HT}AxocETW^Z&h^AENc`l=k{P4@(#1ndd#% znm2zL_g^c8cXLe&=Sef1d2Ug9{O8K&d-v{Ta=Em+G2~j^BlS9`n`t%YAC@Z47VuE( zey}?JZ?&y|(7WVcwq5n|(q=ie%s=M!|JXi>t;NB}e%j~5tdH84@8Ay(J}~XN?m9tF zwlAD({@m#QJ7b=80Pm0EkMD6!(o|G-l3Cwb_u0HY`2PMI=kI&OJpbE$-TM2D?zJX2 zbVH`|OyUld+7XxM)qJaaWsO5#_L{I;MY&gBU5E*n^9qx=acjEXrMF>v@ks@{V=ib{ zBoL|4~kUje)?H!jh+quQfv25GFHeGY9?%``rX_#j9_}Z~sM>eche0kKzTdVnQ zpPFR3A^Vimr@f|z`OYm;UCd~d;FBV`B0rz)%59;^2IkLSnQ9!n)BPpumebdp|5g_M zX1{t}((TPWH}>74p2v2qK4>Q~OX_WFKY(W-mYd!(;xz*DVWnoNuTos?nIB zclUaBLC%Jr-=?+`JvYvqB@?>$(*=fSF}A-PIv4o(8m+v3Mg9Bt@2!l&de^R~Jg(wZ zm|Vnb@VLx3>g%zupPSMfX6`#7eeLY+9cpLJ?nt~oYo{cm@w;nT%&E$J*By#X-Y-&{ zS@mS=vK#+0zxypZG@JFj^|o9=o!{TgB+GM+71$ZeRP}^UUr$J6=Cv^glQ)^ZLidP0yr7P3_WdA7?prMLBqS z&rI#S{9MTX{c;Tr)07| zeRnPI!Pgtg{HZ*97*dpuUr{nX-^VYlVZ7Y#=7ET|xVXiCj=0<2wVG94d28!+<>Omk zbDVUUIKS>xwR-j6joTZQu1W=nsi<$@aX9`ZD{Hd-+7}EoZwkZa1S6--+dGnaCZ;a9p?HONw^C1<FBZuSDf=(2_MOM~H?h(1!Y{?$ zZ0oMdwf@`SKKbpvJ?Cy#t1w@9)BpX=*Aw@oy!x(}$sVygvuoY&4ZG8d_s7Zm@EU)A zko`RCMQcTmhTQxYMRVK(!j9Z{H~l%+mE%{kd-ilV9M690R0P}7s(7mX9_U2>R;~x2 z;^lsEsFcL>uI%TBPXE-9=QF(c>*xIcKhK!W^l)&#)Az`D<_U=d$IZSoT5RBJ`SVf! ze<52_T-8fyo{)cDpZ~xA|C_J5_5SHMzqjT8p7-JJ{r`XScl-m-0Jptx+Q+vALjpiw)){ob^GM`+t<$*H0`gK7vHRA*|nvhK~y1a_Wyc` z34w89{SV!l81CU_5c6aZ5jA?hvM4eM4P`nXGHP266ikSWt88mhHSSKcixdwXx)vgu!3kZhhk61#6@JiMaeAt$R;bw{l{n`hfG z_g{y%IO^msJl0;Flb5ei_Wz3Z>5sP_NLeiFFAAP)%eVE!S>J7JCg$2#XGNvPtj*+i zEvZb*Q(7~3wux`6Z1lC2ew8U3^w-RsE5I??YpqxS+i?zsV+Xpeo<3B(wBG$oe^J2% zbMtFC_fKrNv*zX0J$}bxvUv`v^Bm)?nJgCYdGqC{`Q`y`E`6T6`}nRGvz?GA|EReA z*u9FUd3ztk&-n4^$n05J6MbLJ&sii_dHdSg#MzCX@7Y>2x5Y9TeLepB`#Uaoe)$cS z0(-n`Cnd)kZP-))UhZ~%zycp_jhW>$i)7aszCX0X`&n!|zod%%)I6I)ojXOBd%Kj9 z@3fu<&B^!c7?=etGn;9W-LuGi)dFZlwNx<2!d}zeL5|i4x^=!%Qrjj2`^C z(0oPy{`z?*jous8o;mP+V!Qkqsj{0A!E2LunQC6^k@vo|wm5r|vVuG4AjHLm(`T0p z=9)#Y&Ef50ObgmDllg3xU~0Dho(UF_^{*S?Z3AeZYtiKyKeDr z(`1&^gPS}{PjVVCpLmz>_U%Fm*%^(|{YuQMugGnlZ^;y4s&-q3|3K0gQRTfmH@v=> z5M{jdfN`=>zksj1po-0x=(r=iqFeNf4uRCa~P$$8<#`EpB6(*&pufLdQG4J;&2h;N>x9$AC z<+^&jgMRA&<~LWkyg@fQal&XDK2$^PS`tmZN?X5kt)19jD( z>2=T2xAb=?Yu<|gamZY|>4&oYC*!QI%mNqRwRdPLAM;&u_mRG!{QsDv(0)+Dl_UMk zE|WbapSi~bb>1xBx1KpLbX%qU@_$nwH>~<|{bBX~@9oA9W@z`>&({0$y5UDXzsT_w zmI6Myr6$G7QquJf2X4;pQHfJ-m@Lne#PV-?-OK4;Y?(Zc?fvz=?tTB4?*~5r-M#;J zyZN8m7%mUCzRnLx0jJFDg+9t~O#1MDQdG{r-i_};gV>?-&)UdO;#{*qPH|>w*5#dY zulMl%X*lpWmUF_KWi=9Zv+oH_>IOAZ`n;HLdasN*p&NENxptN3yLTBppN$u@HSl)r zN_uuw+#qPB;fGZ#bpn5xUVJ*MOK7Qo@`|lbe!YJ4CpGK!mCOU4Dl>1TDjm<|NY>4o z#JkIy=fv&kEa&+2#SLNSu9xYq^LCk4^1AEO)hx-aMN1jC^sWxK)LCu5Y2~g>I#)sh zci+)Tcow%(nyqhVTE4o#+q4*qg5)o*QRO`HNn@)<0RTqENIq{xB9)qp5<&s;;w;T)C&g1hr9>sF{BJ1qBlbJt-+j5#vbWM#;)j$3^GUYT#>T;kx2N?MZ7Xw_ zH!<^im2knH#M-0>sZqPjdKaC%qOpFvei4VmGw!5)mDj($jpi*Y*Sb{Q_8oh zZK_G$arN2udqtZSBn`?OzWqC~{U-bImzT>cdOu~Z_ulvUoVCfOa~gt?(_Som!xpzu z&+?kem)}{?oqK6*@+{Nrc};Jtf)+a)DQ$Z5 zEcW67?X!DM_wKg)t7JPtc2aVRrQ6KFV<)sbl_nRh-MKb!IgbGIiKa&!$IU*qUR->- ztVh#rdh)3vvr^03OkIH!vXqxaGU#S6@nhbgaY*-fhtOuR;I*>rHkY21Id1m+33JIl zhL=1%+#Q<}^xWUE%wl|6lc4Q(Kw625TY+g}Lu}7ErUnOt_bV9`8rXLPb@O-}U!l1{ zQh7UrQeeosNr2Hl9m9`>y$MrA>lJ!E*@}i)|BM8x--* zV@~ifnOz;du_p7GT+-jo3+5K{uBog!Ff(~ax?KL#uBE%!=T+azo~qr~xpo0VT+ph{ z9h+qjMzY1duk5!?yLLdED?u%FcJ@-nkI|Z-tM;V+h%Ku5pzF5tLiC!3iQG$T49oa8ixzx@E;0S8{a-wi2p&9yEE|AB@xSFKH*{p*Z=?Mv@2wMSw;M|9)b->1$n zUKsy->wOU(rWyyq11_~%7Z2;#zMO6pc;mC+dCTvn8e)8x>vS0AHN-qMFT$^{o#oJsbTQzu- z^u?bxy;&N<(y{&0D^c%5TEWG&QyUYe@3xgrU|Qq*Rg@_;X1QcGZ(3u-vl&%|e!f!~ zS05~{JgN2jlgr95wt;e29rDy+A zn#`vcVV1GXZ03p20sH%BlqSA$mHnh}EY5Z=+i|v=wy{PZnWpW|iBC^&&zfxbA*l9~ z!}>G3(|EV6bd1|?p!`^mVP;9zEpNt?(Pn3U-f^hPDT#P@-RQfN{MGimM|Lz;&8xhw zBKUNtX)~b>62xgveMaZ$&~D@N&YhS zi%hc1ci645{5!ER*^NC#U-Uu#jQ!V78R%<`5 z<2X@%XJJR-u`RFP?G9P}=C+>9x=xkjw^AHt@-x1l+fx}HG<%NAxni^2G>tslUd$f{h6bv zM<;&9zY~1N86N)Tt+G8T`GNTd%Y06cW4mH6O>Rs+$LJ=T@i&4&_`(wlhlzg~UIa0R zo!P*UdM`e?MLeNL^R}VX*<|D8_blzs{l52nS)zm4@!;2Is?@l0t|#dpGJYhri@$OI zb)Dk=NQrONkF5^u*d1BTyXC(4cW2$NrByZa%+D+S|EgScCj02)4;6+^XFhj)JtcY5 z>~+)gBdoK3Ka~1dm8no;=hb}Q34Bx=bm&#lA+ zF88;e)cCl@_TP`?Z)$%%E%^PGfA7OR#e(O5zO9q(=wNbn;k^9q`Kz;W?CTEi`%^lv zx<>X=obs2j_5A05zHLZxnQMAK`O>`LeHC>(P45KGslJ{2{l@eE((|R?t}ps;w`=$B za}D=CU%jdDGv>&B{)q*b7JdHyak0C}%`T-&XDrWD>Mzu3d_U{Y+9Rb$zV66-cgs3- zx~|In{!0$ug0$q*^jnJ*cW%l_jo9}@dFB=CORvK8_S>zA+NZK+gJs@D(;cz5Z`=!6 zdnJ=+mj!?F`e`gh%Xth|^DJVFUobN&B|+k_URM8fy~w1`qD8yaSgWs|ddk-Gw#(yt z>Gl%>IVlU2*Tn5~^1JrMB`<&7*5j)JqD(KQ+_IZ^?{2_r+ew`o%%^6QOugYDYqWN* z!SkfGf|K=_U%&g7w!3WmqJ0+8!i;RQ7AK1DoxzyZAo1bt8-?6iSKhKU-|M?@_o|%L z8!4lYo6H@uCe5BL724nPqVr7g%$X8K4%^H-|GhJ4Gv4ZGq<8&_67%^jT}qd1F5F(r zVS4UH@Z-ab*R$;9%5z>#TIu=D%;H_({3jPDDqdc2@MDy$fBuuw&y(5C342|hH&cdN z`nsgUd7l>9+h!VXrOux9X>HxQd6n3}53p&-7squSWj;U50ON zZFCh(iE?B-&S0GFV0^o}Eb-P>%{TWp`fl*Kt*&%ZqLT51HBV3B_H(B17wJ`se?776 z?(TBUDjyfg&w8&W~g z*8VI%FKw}4PX0Yt-%qvQ@1@449wJp}@-JDRKBSR6B<{}k(1rzamga@Q?4TpzXZjN>^6 z{tOlsSrOa2QO9r3T5j>!?QLNEgQyFc$C(zoxHtMMOvy0(dd5NRdB7~DCrKQ~On0^^ z9Tg0FTP4HqbNo1q()#}#%VOsJ;yu80e2M?(9dn#pWWZA$M$v!(_kS+opnP>+W8@DKJexIxXPM z+C`_lJNecJ{W5)blR+mfc9rqAYUVP}^=h$F?QhhWAEbfKG&;t%J9qb~13QAU8>%8R zS1vkwpr|r(rq9k-S*x9UWtnw?!{4MOY&A1m`Tt`Bqi$fLORm|6GqpV5c0M*0e6n$2 z-c`NwEoQA@%ukN7_3ZKK?Oo-ocInQ&YeH7HqC)%MTz?br%JjP9V&}h-1#*&a_?6jC zT#-$FU}}_7-2B{PxmZTRg7XPCulO(78UOOemWEH$0)i9oxbf_Hwv2by^JRyYef`X~ zcXDF0qv8IZ#|6G$X2hNR;-2QWTjSD7&+TkI&vWL?Wt~zhEf{)l#*A{tBd_0hixw|B zbwy@!UN0yYMsLrV7%9#cXKnE1(AisC(y#knRS|YAySz@8Ddo&=kG=OMe-Xd4yS)F- zy273NUbZE7DKMY1h&~>bQu5jJU$2ZQgPDL?#xl8|Y{Cp4#Ct6e|4Vx`;7vwI4*)tzW* z3||v?>;Sj>>*G9qcc0#JYb;t9TpRz67JL9GhXet!4pYe~_B5=lh5WS*dTGAB$=AVydm{{z* zl9m5{%Xx7d?MnwcYGo#uy^Gd-Te>qQzJ2pcr#*Hy&ri!vx_EEz@u2z1SFT+7BYn=3 z`Jwq`C6#zNEv`xD!!sGGcWUrv>2JG~usvX6*4<17ZWSR$)m|xP{RcZYt~;c#+2)GG zoomupu7#}&T5@FZp(P>l`UjqR%g4|1nD{OyTR_45>eTjw_rjL?n_ro7YDxEtBJQmx z=YCzddhIp2#cCn9r7k8NkV;s#Z|AB#R}^+BO_{bPXv&UFdsIR+=kD@5;N@$y^6CMT z4?e$4H*l|EK6=IWd#PD_W8Sr_H@`~RHh*n;Iqlf4fWW|Yvr-c*zqvlUb(r}s)2)5; z`W)^WuDiu-`&P>E?V*oRew#xP%5^Ek&>KZR%S4CWJuoBu3+GrcXR zuTb3dWJg%wZL{^)8%n>uy}SADvzm=Fx0kl3 zzVf-I$y)6wZ^!*@DZ8-#ww0d89#(xnm;3O@#lKBSF>5X^WUfA3cAH%$`39@WW$~XM z7XD>Q_1WDawYzcp_J&EDw`ShIxA$E^?xe!&|Nh2J&N;N>^|RS|0UszCDyAB^SKC|2B zib`B}1!~~RO z^MnudE{^Ti*t~A;fub6j_NUYT8peP7%T#*1?|R?$4ukWcEE&ytg5^ZV4k68@R|NwT z+RyNFDJcsWrOQUJDli6o(`3EJZWoLhhRX2_Y>!tw1U9{XhC+t)^aZ<(zA{*=x6>UTe9)Xv|jDLUcu6t-i5Z{k~? zoOTu$opjzkQ=xk0RJLv6-kA!2(v&uJOPiJ+e0-R#{Og%)mOTy{>n>guU41CQe|44k zcL^Wn^Go8tmr8Qn+W1B7+388{{_D84d6#rr3Crpo6ukY6!SG^wlz!=!D=iQ0)`hDx zub|Uj?1o60~8pQ*`p$1KalR zcKz3BDJA`iQ<-^gV$u$49;uMcyeZqan`s}N^)sNp{Kbn5V*|4nW*TL}`sVMQ_P&~X zXJz4u12fD5njSaC<(|Gl0oZ^zr7K7wK+iD$ZFPF?`3M0 z_Y`J^WJftLo^qLDzBWGKuc2VtRfYVx{Dj@6GB>tgekOfL?e_L_4rR>cYC_=C6$fPZSLHc;9X?`g+nLM&7#V%K_j`)Z?nS#xdz9?| zNd){^vFOB>+DV(YHX3g5x%G9jJad=5)V#kxg4qtb^xZwsU6Rf4b7%T|K?(POw09fc z9E;7n_w<0ztFPSWg;l?qyylU(-O(wYyi9aT?-$Q$LJoafPefXr3l*CZxW>1SEl$q# z+m=-Jv<5TjrAzObyH!Q@U%Y!KL!T+_F~^ZfRcCFSidpV(?7r2PZTXww#gB@Qw|2HA z##n#1Q}UVHopdD3Et+l06$$2=1G65ScQD=-!}PDg^vt?xw|*3R|%Jxw>H;ys4dX3*jAlv|NZde z0=@pzbAEsPcliC)QpRNVZ2$OYayF%RZrgmE;j-^%qrxGZ?<@|Nk4GMld0lXBXUy^U z?bibNF3BuDzVUNq?apJ>p6j>${dliq)$w1+^}U^azim$*;hx~9(%^Tl_y74z43K+R zK#Kvu`@Wh%N80RfuBwGexmrPrT#v?e^yVNKka^6dV)12 z$~SS#RJPpiT|0JlJ-eLg#eDsAV5UL!$|-Ey^S57O*tw|0RYN~=oxXWZW7OWPnL#VV z*T$@>N>)0hJuPB>eBC%sOaS@YrB~E-ulknu=U^k=DIZGE;$-p%X{%j(N#I&xp`SD0;kNdN@bWn zC414i)x5J9({EWP-U>}U;8$fTnD$_1+=;2%@~ewy)(TXY;kdpcT8{&Jb&kY>r`$ z^VEq1VuQ?jWr2Ra+wG5j zbR^6yJo9bs%(-98{DqSfPpkcAN;2r_-pV7oOpWEhWMQ@okH4hOo51k&rlk41LtD5L z?(I6d@6F8}<>&i0+-<0Qzb6-5f?=Pehxk z-)gG79=7}5xq>Gb_7xmj@N>gK&{>a^$1 z=*dmBJ_R{K8qa5!&oxN+78cNB5f?nU=JQ$elXrjJ+wH$vZsxD#OKT)+`81N>vD#Rx zTsD_9=;OP7@j|yo5zEsTMZJ~NFRkUBWB%&7KU$_<|OxS;@PdFz&+{ij&8xndgkwc?Qpm`cg^OB$?Qq;nS!halcUy}WM5UP z_v$K;iFSH=$nZGh(Rp2O)8YiDrM_tOI6X~fQu37PxerWsc^NaUU7xn-P~?nde3rZ7 zigh;Bs6E+bbLvl;TWlTwnZ3tuKD2N$>N5D6#-wn!;8pe?cZcfvA}LZKRub{ECGDp$ zXx?^MsC3qQy?H_PdIx^SsspOW1vFV#RPr=Tj7nyYV!!vpBI9JK{KN+ThM6I03=$l! z2No_mQpR`vL7nn}&Byv@xU7+l+PhceyV8bjk9UY4+|6kD^_*as#wYKsoz#hI%C#SPt+~?RCw+ugT?>%mlpguJB4juE20Vobv!|vp&2Bf9!}V2aGJ5_(z#mo zuIHzU<7#AO+CD2<9xA?N`96g4L_?9(7Ts5mUagr>v(Jn9#%b3~hw6<}`M2jUXSjH) z>uQ&pu&mUw%6vz)x5JY8C5a+L4fBJatL#p&4+MhUDN zIu*9xlDe1@v$E6R^oG^F^G?0n!0Yindr5v=FVC(YU;E;&ePx_X6f$+a>&2FTs-g z48x~_8S^E>&p(-YGVp82ytz{R#m1A__B~Ggdn>Z}LE+ZELrc7KmzZ6O>-zQBGFSi1 z?%k#fe6rhKzSNvqe)45io|(>?x%|Js-B9`d-Q2jzdunIzR!+K=x}c{}{N;6Pq0f4+CK~6V9mEk>F$32X47i4fR-RA#l;+wS#=9zl1O(@*iw-t0{fR6gH*aJqI*UsBM z-#f{3XPw{L1$UlGwP%;_TxL4OeG2P&GxefBmRqZf4(qX)9N+m%Ra$0plB~PJjoxiC zMz*Op7tRRWFefMdKxDw%u9s&eN-L+_TsS>Y^9m;q^T{hJ)mB?~$L!C#aAu$Joi(f{ zTDnj25pl8_z_&B+XDyL4H6>tU!IkE~wvft^r z$J8Py@-mQTNm1XOdAwndH!`R*aFqnjmR`Ko@a)aSTjp((Wt2VfWFO19ZxUBrs&hA7 zmnlBWvF2Yz-JAzE)*Uas@&3ZA1)f)CJl^4dt-?p-?EZ=~9Ebi09H>3|`jgB~GlsRl zw^XOgeqc?TxmnI}&SP8OJIY@-^3BXWV7bqXDPxJe_`UTnK3)y47KvJrn;rP)zc=&4 z&w-#xB+x80tW~?TF@NDH)`l91m@7*I?RxY;w>9n2ef8)?ljEnK8uCf{>`$HF9u2X3 zBBq>G+WDt!%azt+zqA|`6MSYF9f%6s<>hy6OXDKBou?9}>F2q$$j-TFBACdTyV$Dbs|Nobw&Nc$rDe zlaV))D09|lm|2zbpLOb#>^Hx8SGoUC_&h6R(XnjahS2t$4LlP0H!~V`7dmEMw@A*v zpA^648pFxpE|v3-a&jm5to=0WXQZ&{=_@Md+bUntR1$w!;UE7s&MP&R}%yGFAScR;ho|D(3mj^0`(^j;-0G z7S~YJVR(t)Dy;T2Wf-lyJDn0ouAbl=>5##Vk6z*^!(bzq?dP4#ibF^hzL z+iwffj~zCiY4EshGH*@=^K4#Yf` z!rvM?=S~+kHpIS z{t(?01i}xZ*TCrq(Q7iKy&P|s?yd4_yji-pY--ca*HMytwI=L|5N&$1da1~bIPRqi zKfDe}F56R)vm$!w`R0}w$(TN#39s&~o_XYqx16EJn~Zf651;Z*JYqTh zGs3?^{PA2f&xVp{W6vvR+151_ZauZN@##LjbGLIFBGVt-Q8+&1^YA|joO?d@#hr}RGrd;7bYz?1-d^=(&vxJb6-T7DOHP+=mprl5eCPJfq36XnEX$vD z=~bA*tp#Ee*rvU7RNJ$9;Xc2W*L~Hz*1ptTc0`JO=jOetIkP2$HBDDu>*eKTyUMmt zQs%MD<$fDu!!>a!2a9LFef>&Af%(|mx7+Sco7H`$=1Gp*ryD00G*o6a$vsw7je9II zIiq*CjkRsw1{=9;w}c9otzk<@dm{Y7Ca<7pu}#wc1p4z*c8p^?#Zct4!|jZ>+S4e?4)13FJ;!_kV$hH_4ACj*V;}?vbH%c zl>5H*+wqm(P?#FVyU3Ey11VhPJ1mGAX0v_IxiDY7}2pLtTP z*6dQ8(gEWc%o2;cPnpF8ADH-=Y2`b;V85Ep=Qe&TD=)gf_TvIwyW*Yp3OoW#JMYZ@ z?Ka`d^LKoDw|DGsFtH9hfAome{F@9~>zOSJtU27%XWX81U-pA^iOqM`JDSSRD<8Tr zfBCq_#(m!5s%>kPd~e6Tys@75#V1ymn!Og6dYGU5?e9OE{lxa!9GiDFoZoooFIQdP z`PS;(k;0FqA7*@fesWLn6sG%0Q=9H5!DtYBYSaCrTps6E3*1=u`f51WnRTzXt`@ly zd;QZ3-W>+hgSq13wY6GqhC6HSh|OI3z@kg?M9hgJ7yVR1%cWN2&6Y9>C~1&=nIEqC z)uFumPV`ypb%h?!4so7H+jIF##(IYxQ$M|pYL4FhW6^(!4z?MZuhow3Y7Pu2i(}d< z^;&zY%8~31%a1-VYyNabHEoGV@r1%<(pjrR@_Z}8T_roO>$y2G?sv$lF0Ngn$hf=p z%Im1F`pn;Kj$d0=#hh_zZQ(3S^Txy-2k%Au+%#Qzouz{D)Ynpn;=MA@uT5KKU~@zJ zdR5gOh0+p-6uiTc~^U87==C+o9 z{dQyH-!D4C_pUC#peK`>ruJCv{S7Ncg=PO|Sf2c%aC!C`!@x4>4mtCHds~}lp4|M( z_MVmV`;SxF%QX*VEBW~PNtO6#{$JB*?69XeFWRE=irycdS)5;(<`mBDm${X`;Y`u~ zs!5G0?9XhaBuif$u(R&_d9to?TfP0k*fROu4JvzHUpUA-Yi7;2b=Dz$ye^yT#8t0; zXS$*iKi?=~U+{vOgWDb&+^>G;*V|~7zx`!kn*HMi?{>ZR^WS;y(C!z$-#)C{{L1^A zV8D*Ef9B2Ie&3woreoy6SiuRoo)zMIPc#@ky~_1*)9on{ldF6WeXYsgl&ieM+w;2N zp3^QXzh3sYRW(?4XV$;R5_eh`_cZhH?7z$~b6!f&T4jaDGLs8@Uz(;~pAu0VoxH%v z{ifs3shZafU*3AI9vt-c@xnWyb)F4pZY-a^`Dwd74}&#_du7G+=1u*LRgn&B>QbBb z*gev`-m&Sm#{2MZa;Y(oIgUFR?>$*r!4|{1pKZwjExwYLjQx8V_TG6G(f*Xx_4)K< zmYtG!ekJd^A-Hjx&=VeJav3`fw~=d;!-4#&W*yFAvv=zj?K-ap69N zJ3G!De3MpgB6#6>g6D;)?4gV|4=Dd`u(qpy%E29!Unc%N>`v^0+m8GkvHUY`Z*IIBr>o@1nadrvR91N&%CXlwkgKjcQ1OeNtL6vYFfbO_ zH-}5na=plg*z2oTi%f~Vo*k}vVfVU6rLG=vYk~xRM+I=@te+axuzS)g71v!0qf#%a zxQAvu9}R|s;}giE!h>n@=EVEl?PpNF^4w4I#dwvF7YbYIAR@d ztgh+8>j~oJJ2q~!xe_+@)xVbVt6|e`va057Zm+mlee=Xyl#QvM7BUd`X=aK2(6L;_4U3fiD_@1dnf`jda z^@RZ~6^uu2Z}*cF>CdVyn`QTe)ADR|y4vA8+h%S^mi|0Z^6i$`2{y*InYYspZ@Z~^ z)}O6IbG_P@Zie+UUuNz+F(vA9zt7FD3z@4AHSXPgs8gBUMEmChyZN0wBJ$Qn0S!He zYkn+f+>o1m-!b~q;+iiX4i+3gxmfCF$(Iv}Qu)vOaWp5y9`mf*%xGkL;*Q!&tG0@x7xeC=OtU!YU}QYmbGw+% z^PqL&hj!mnGM`!U`uY8jYaYz_pm!&wA+n(-JLh&|ir1>-itv5vk{W69uXmhm*mSr^ z@2Qpdu5-&{f{S_=`&4e7CjY}h;o+~x^2QfTCCaYfXie^E{$qH%J$VlQ`%6Lw=NLEX z7bnJb{1&`7m9v7atTDVnB;aXTjFRIW3%H{ z;Q{sA;_u$89=ABm*TB~#ea-U0y^IGO29u|~oqw8b?l%dBS2j7b8ID{nvr#zn(^Toy zHpUxw*a|9j6s8{!zA*iy<19mO^K*v{`%f1aOeo*bcYbp29R35-oA;e^y!CMQ^U~Gx zrth=Zp!)ZMjoR~PF?;N7;z|x#ia&pN=jZo-4-PheR=U&u`=sf%=bRjiISzbLD)wXC zBYWEFG{=QIeb0Rxi$b_+x^8Vb5&d zhQ@>iJJ&4>dKi14$ko+#g=xYv@yLK2g)=oN3{`orXD}8`o)gzFL+2gDf~ z^z=*xe1%LuPpEu%mhEJ3FE3Ntq2051=iQEq7I}5`<~z@uva-2F^Esa{(yuI75PqR& zvCkpX;z`L4*ZbB^PQ0<8;=qF$COO-J%g)Y8VVHSf-M@czXFbxwj1E~I^JSa1eEG4d zd3%eG=iJyn`@%ZUuWFZz_XNK)Vz6Co7;rn+GxO`bSh)wTH%%w3`Jl&IA*qvpf7!n$ zw!5ESnZGCd`J7|+j7NWezj*)5iRF8lQtmuU%YA{~J z|MNxQ?eZ@f7H$>OI}HQM?{==Px%J@Y-Q)$5>OUEqlP9fvZ(rX(?fJR8YvoegpA@s5 z6hCyBpYhNanRtT;wY#@iRpKq`3oEYA-dvI$wC<&M-K5A<{ST$=R~^ZAkaU+USZ4n7 zZT?r2><1Da%j|z@KDe=DNw#q9Ne82av4T@<51jrz`TpNU>d}uim`_S^r+VkPd!$v% zO}crm%4d7p%<@T7>*jt{*Y9arl>YP4lI&lTG&hI6{Mx>UM>>FQ)=u6(b&npiHq4nC z;a-q-`;e9Q^lPjq1NlyIue^TZcm3zu14Si_q0JEumR2VZ=q%6?zjZCJWXa>YgPT1M z^mOMue`Lc@SaD9q@g=?Kk6@14_>ySR_o^m#iSGF2<1FxtXV9lWazx?fEHScO>2K<=!objjEBSY2;WqAjSpDBF4QCWCTL?Ye`T=D(T zbpz9|iqOGL)8HJp1H+Wrvu24b`?=GA>E*6<+OLWpZ!IrHXwWj3WlX$gydy7_cc%SlIsSm8vIBzhm z*!d!HnY!xLSFU<@MSks`#d3h*T|xY8#-iMe{8e0k=lUiVEpboq>;HTuV?JYX?*pld zwCd)$@-Lp&I27;HWz1;W<8kKQ+Z;g+{%>UxUwk=B8Y2&EkA8ZySL*DMIZyRi%dcid zdk4=|uv)cjnbno6RuSgcuAk&(n^gI?`LC?kTeg3i58rM4T)Iu#fdAp2ZP{){ORx5{ zzj~X+?fkdQC%pQFfyFZUnIf;RO`CS%+O@3Px2{aq5wFa-v0%6VYnF>yYQoOR{$hQ8A`)xGUB^AnxemnD&%qMErdhYwf%H z4b#cFPdHBYbUCq9FdlRG#Mzv}@N>qU$I4oJkGZ-z7@oYw@cH9oxqGb~@2x67rBpol zW2qWmD?nciDH}K_a5=g(LHW-*5kyirslydvaciF1sc7horgp z!|lw)4(*ov^g%D?srk=8DGonhF6Vf?XpNLaUC`63hG(S$`nEqdtC}>w_E|1d%C*K6 znN)|FQ?mVc)wwM)pDC9*HG;cOb7S3d7K#0@UD;D7t+)R$X?b+@gz3{GnNQ~YzQ7(I z6mMkUGt>0xwIwm91Lv_nol){O^ZFO{;I^|ujAtD-eOIWqHwx%!mTBI@kmR*;@0zNG z?lVgrZZ_UJcq8$OY^vj?gqsIUny*%7xR&KiVJ_C=Ig{tkULiNZxZKLgZ2L{~_*=5y zXIjiVF6hBM@9$5S3HmHsrWAB9{_Qnm>ViuN{0_`)oLfKbJh8-G_!R32H}~sD&8kWn zQx&EaGaQ=J?~tz<-3M|W%dm909-npmd7b%9Gh6ZInD%!v z8$Ru6O#JPNs21yfC=FuoJNhb1K~i0p z|Agk!2ak5e&A+uRH{7E7+rkfDF2CQlf2sV0cl-Z$7QDD{^2x{f+>icS>}S_J5u3O4 zz=vI8U)c1t^p`qS)UI72kgLXZTfjbTjA&ZQq_hmqR6BvX^h= zmn{dgr!yKajBPM>So{3m)kXi(9H#$EPm`Eja@VPU6Qjw7o~$gJJ*(HP3uBC9sp9=s z`eL8Mj}r>TQ+XF~S{fgC|5hz=c5dvqA3dF~Hs#7{?L8Ly&LrX8+jl&7V`Yo_rQNzp!>rQg^$)CTI+?>Fins7t*$=t?ES#zE!vwu(Vym9-G9dmk`ma+NI z4~}yl-%Wf!FSaR3CdENAymGte!`QOME&2E3I^$BD_Vmer4$5{cnwB@W{YkJoZx`<* z|G6qxxGmHk{%V=DR&)EeeNT(EwyPcKUXuM)^}c8Qr&zW#<*UVK{yeGUx%1kO<<)!N zNHws{DeRWtqPloKLu%FJm+s5-XVyJ&_tw?>8C1}XZtMrI@#Y&?p{~+ zoZjY1-7<_nbEkyw4^50cpQ?HN{f5%7s=`mc@@U?0_-Onp_}V3gnJL*p>ug{C+NtyM zR`pcIC*tunj(MA8Qg`>>`<$n6b8c$WZks)?RhjSdb55H%*C&6|gBwd6^qG?wW~%aS zVy_JB+RJdtaL?(lpK4~7wxmp(62-k>v#P?WGDf3-IgNQOH*U;d^Y*6D^zh%2`VCJi zEB0l~w?2F(V401zlVOoS97A&ZE1pHUwsOmV*PiPCc)TFP-!aO|LFvL#Apw?M4M$$c z?cQCrIp!)yv&BA!Wer#QChpEw;52x&ifJ{2*8IIWr>9#?&xxA8bH~29pPw||zMD{9 zCg}I^mgzei=GzVC#~+4#o^$=qGe7g^%;y**7^D)ORvs-b*7;qbo0ER>b?5fSj|=VZ z@xMF#`RPukn@wreXSUv)&T{9OVWrMF<|D;=4=lghDc>?$1RfH_GCaz)uw2utu`up{ zqoPQ>pXP}j>#nymJmEN|IoGCAuX6u+)>v)Okd46l*IX0!L@agqb~T7A3*0LV(rQUL zFzwUxSzVU`V&ARPbu?wEEWFs#(YLDMVO#b(U( z@&7d8pzb++%`3JnttWHW@mD`fyV~xPF#WsUyYrew@OY@^5GrVuZX1H_@dyy+Pw1nI$5qaNpVJ<*O&K6K9Rd8-X~-9LR8}R(Hr;f zawo<%J+l?sJc;w`A;)i$r`{;<$ete?A{8KSv*3fCUI@Rm&SN#<2S+tDgx34tFTAvE z=j@u}D}{@u3o6EyONw0HT+@Hh;PmC?{_WN8c1H6VHTYCaXRoNN5U)CLKqBCnZ{3Xs z32{ktOa5d1(qA44*?&vpf2VYH*1nVn7HTosvoEcc7gc#4yzcqo-9Gu|7Inur=g-#P z$u^<(&t&UU=d=Dy?ygH&GU>JWy-b5Qr)xS*YftI#`{Czkq2Br>DC!Jh#*I*geO~EY0&ATV;d%1}+_@2}_KQ2POULXbkBM+?1?Q+qW)nW$nI4 zY}_etw`ng6wEk0McdEToX4}U~pZOno=RdbSrL{Qj`GxA&t7fwvR7og~-==AL>l~xR zV+m^o>ld5&4lr%a=}x`S@tbjn&2)})Hueqk_1PFw-W@JGcQ~8r!A&-c%Vy2o=k{@Y z&$_Rt~(Ii$%D}#v6}UurswM{&@fC+%=PSWf4iSfLVcg5 z?kpheUpL=erIX0ZoBTJc_P+NaLd(*aK-P_Qu_~T+8(<) zb!kz%^y^hDdl+=Z?XQY1iIBE9EvgsjZ}jSYrnt@GXI0koFKu|udZ|Ib?_LsM6nN~HfYe9+C@bJ?fp+nFaDVv1za@1)5!Z+ZRkVqGnx zf#t32siCQ`Yu~+uohKXi-aNcpV1kX+ky@TVGq2iMDM);)ds5e0y_4f#n>1g;U?FJpJ`Xa%t>irTL}?cB@TZ8?&7(&(izU`uTgy=kN0- z2cP+|+}u8Ez9|2k`Q?+&&$XV;TE27jntLh2nb*H4GN1h-FMQ|gjzhcl@XtIi<1q7q zUU|RlgyfT^ewz;Mn)l&?-j|lOyKVM#7iB+?C{TMiYu^(KYsvPXN5$s_#~V4u9w>^r zG}*_qw4|po<(RGEFU>>6a+8!bjx*@bNoB3rJKgfsdr=AHQ)_E^M9ytwHd?1Y!6*Nd zJMXHeD)kSTB^9hy+(G$|)uGJeoc6L<<#Vr7uiFJ%?mALw@HHs2IXv2J`}N=5cmFO` zw`?lWSv+rl?rDy5f)j!t&EPmWXZF_>tQ_BqmoVfS-r8~RxZOudxAl4lJOo5VEgh8o zGFf~ME^l1waB0Dm+YZVOXJrx(i2ZQ&s@wK=&g_W+GVB45O_-m(zOLIdSINgm^$Oek zH_T4Sn&zoz{>`vBB4?u35&QaKtc|^#Ged6wakGO(=Mww$%+AkFuF!2Ta!hF0W~5b- z`)$Von-4q-g3Hzh`fqz8)AVW0pV`+ZR@rk;WqRVY^ucxsFg~z70#1Y23O~F+b)0wO zlRaDuAMc8bmXeb4bt+ugCu2Ex&;Rt@aoiJPR*1ONZF@b-;nP%bM^EI=x+OsyqSw6G zdi1C2L@9%#A6fkx!%nReeRMTq>CD3|sSod6s=j_PYV`#DUlU(?ALCVADpkO?p|Fne zS{ZX>RTKNJ*}M|fQ`&fCnD>9t*z8v!zVy~BN3$8K2fS@hsGVA+x%`+do6m8c983Mg z=$_I=UuG5Pp4#|Sih1Xh$lHcCVz(vYuU?7}&RV7IoSN#o!YE_i%9WdruL^4r?=#*! z@ulW7Qz4UMLdPX9q@Ju;@$6XDSNq8|ygb_{H{>3$NqMiBaQB+e$%^fVcHh$6n794- zHq}0(zb6hD+8(d9oy+!8neF(ux{{4{s|tM=D>pOUJ6TxO+kPm)e#4#R|5BKCd+d}m zs(5D{@NRo8O9d})Rl#+U33FS^FHYyt5q@O4{qDmVTVB6qyL7-rz$ZZ5cp~R#rN33P zN?y;*RE?cn;F}@Nd0nUcTyA)Q_}>%7)^F-|m#@6?>p@-lM8*`ab&M%)&Wy*)SM0gf zyqn_%)1>4ManI`<;*tSsJGcXu>05qNd#p46Y?}K0>UZl3wlf+%y*4HCa(53yYQv0~ zC%$Of7yPemG!pnbLH8!R%jAOIXUuzEgztOsFm_7ZV)qxW=YCC0K4ofq(*J>kw8CQ( z`~Q90+iy(nN#@beKBCS2DX1fS&)+M-m!gvk!ndXLZJM+$w=;r$lHj>dzj^xRZ&uwP z(`Y%rw1?*2nd=Fn}Hd-NEJ zSZ;D$5iHty_M?OGZKWq!nTO6^`^$1_=LUmqx9e=v%5;u1Jb2^Jcq@r@3e&XIXtSHo zuT?dwZhtAv=EE4XAadQNMm2>~R<|3IA4H{|X4@v?pKtiU%ib`cQ~9jr-QJ}vx10}M zTdTStn{fhT>^aUOOiLPco-fUrwJE*tcEW~N{qGfH=JY?_sh?-`FsaUt|4S050`s;M z-w!ur^wXma-n=tZ(C-M#+?s#<<+GokZ`kPTudPe9xc+oX(<5(9lx`eyckYPh(gPOj zpEf<&6C_X+yMA3-`twNvF)Mbzt5T@^f4*$5n4;x+k$^h0SG-@|J)PQgBRpDj#ojP4 z#&=$;1RBJZ^=@dLHp|@hRBiW(WIH2)Ti0E07S_Iamtk_l#9`}gV`1i3!ONykuRJWX zJ@IZ-s+7m40rdL8+KTfn`ell-EZdHiEY6jir^uF10@2@}Z z;s2^3!LxjZ!`f$UQB%{eOUIaByWW8_lse{-{H%N+C-aZp?V}JX< z2bqkYT+Fn%0*=KV3zd_45pHj^edbIXGozI6@>hy-N^T@Z9*n&sH&N}Fo3Xj%^-8ze zlMY2bTjm*8gx&u*Pxh7XvL{mJGfT3oCO1B>-L1L*UfO{-K?UL)Y|PUi>@j|$wC6O# z%#v)cHT;HLr(80`18R<+On!LovO3F|FRJq`UH@UUGuvt`na%ud`Il$L}HTux)r&^Qqa;siPzwQ5idozQ+|L$exGwo8D_7qH>U;l4srAHmV?TMRj zQhJ*&s1S* zeKR5AL$-Iq{@-J!)z^^YM!_ zQ#p5>s@zt*;>b+}@e@yK?%40T#IW|%3f_!L83*a-(}MDzaUT!Le&_vO|DDnNi?4kf zj8m^T=$)5LcoxARn}4EmE+78YpQ9y`0#UeY2oWBQ%jevYr6^}cpm?`Yb2!*}aDf$JgD zP99uf6RjAh`c6prj4NkZyu0%aJL|j$*VoG>rYZSf(#}b+x^Y|VR+Pr=JfRhr*<%C4 zw4QH2c3|h8IUfU_a=m}GCAs19$%}Tj`*VYx6Q@0SdC;$Vj#z6JK zyK2hK`**G^nUZ}aH{s5;TUz2fm+w~IBCS(ix=s7-uFZ>;&-nCZd=X|iGv`U7@ZpRv%W>bKo;`ta^4C36pM`mVIQA<=6^;S~ON#wWI_ zPT)~^tTef#_wt!f7yj86O)7tX$I$*?r%<-jK0f(7+49GVi~3nl?=I8a(akNZH%DVL zTMz4*<9#iMd+Ii+zSiMnG_=h`(nuTNsy<9B{~ z{QcVRv7e16Yi_S=F$|DYU_R&3ux3m4oizV#Y?Jne&;0kqJ+$rbGxz%%8h!J_`)wZC zo?@wBJj-CHypSQ~+Wn*ipGecaCt1n^)6NPd)II!J-coM&f6cGSnw!skS7ko>zE1G_ zkI3K2@4(achj-f?@OF%y+07%eKcnH#BW`_(FPFOi+^aN~j8I$Rz4ThsBUXpBv`y0@ z>x~Lz94(!U#67t?ug|OMEttZX=D+*f1igkEiC-Sy`gYQPLfqetIs11Xo4+CVquKFl zCbQc$`<=5HE#g@=>h&E?W$SusaNAYVTdtmQiR`4$d7JMf2`k1Q*ybw1_46=$Ls#nUS#b^F@fAF+;&gaYRKJq60C+(u58ba?RZ(}@tKsPZ-XQzC? z>76%^1zk8(e9e$y{eC`%na>YeGQ8;hwzH3!x90Qr=H~~K3uL_Z<}*}eRmZhL#$$Sd z9z?I4EJLqE7FFLOAw%U(Dv6^jV8#^7X|#>J*Y6*Z=ANzff%Hj=js5tN(fT z{$JjYjq<+@8(+o${~F)^`T6DR~h{~mLR_`Z!^^=@;vq227r|DE%HaQ?Qm{oIut zbl_)INZ^DT)uj#JqO@7JX|EM|ux^Ty%43elHAccSD~~m3FTLdZ^{S-B?N)K|_}ACY zeb>Bx)9`Zg-=eI&EW5px7c#j2YPF7f{bZ5Z)zAzVk=nykip{Tvw(fdm#C#!Y?&5vR zoW#Qq7%%OblEplIPI6Jrg@nn^ug#ksc;?4av8kck&9C3ysrBU1CY3+j5yu?U_HMhC zzuD!BWN=vD=`$xZs=D3VYI1}p@I+jm?o(;j_xa3|3E$H?bSwgN%xsIPcsyi^n31`w^V-D`r{2Z9W1%u zF8Z@;`EKt+j>}l0|DIB2PSoz(*=V@*y7IP^Kf-=S-b}kSmZ$v@erGu0%(mRk?^Gri z*qU0dPISQwo??^8?DuC!%^v$nI%NtXZlARB-r}=Wvo}( zr96n>+sybWlR5dD7-;4X@ z_idY!4@eZKy`1&c-0shUraf}?Z!Ug#q0F!S)2gk?cAb(3u8|QyMu&#XXhdmCG5^Q~%>)jlTmtJr9@|o?JgJJEdGd^j5 zf9gDp(!BoJ^Sa@I*KYEQ8pJYYCM zrg_h!OAlvUSkD^Z#;q79FZ711#hx$2DEwv~cS)^nld)bA%Z&&(-W^<%j1zhl-n{0! zAh;y9&L>W0zW(ZOzkfg8aK_pAoQd}~*Me)GxBk{)SDAh*{d(H(9F@KEcfNb~j%mZ{ zkXJH|6aU3rTC(y^Vf#!$pY7?L*YCOWsBC7bx@*a1^w);(nBl@({ly92>K^at{ru=h z&?Md~Rx;KHit6We@7^tU<*4Bu^3bntg=LM8fC~x?zfazgN+-gWak&t`pg zuY2OY<=>af{_XdF^xo$}#Q)9_cPCso+3 zYh3Y8S-Ulh(J0b_{r8Ve&A&Iy)ptL!FVT9B^VWo#Iq(18dw*42<&W>V^X11X7*+&- z_*r$a%i+^gQ2%P$3Et+Tpv6p+!sa2=EOCCB) znmsgJI@|2Up^hS_12Zd6^kgxaFecx*5p=tKu}{CT!09z9hqg1kU~De>HTPvE+mXhn zvsURQK6bPI{>*pb5xrL&n>FxDJ9-&FQHQL<*a#67^^0-7tAc2%G)<{X%17z%(*@@P4}Ky5?Ss4 zsmDRGfUT==_RRS{H%%AVB)_hy@b&f8+@t+X_4uajQ=3@NIehwO`^s7E?yQUcJ&lXh zXR6Adawy{Ym=tHU=*ui_{i;cYlVqpxzxpQlYvN0PyRO|eArsEjq%iH~_{20N^0@CZ z` zbmQ+K{U2X!mTc;2u(_|C^I9-LSz`0u?+?S$19ERawp2DyX3u%TXa4;0KEWxAC$ITD z(<06x_q*r8n^!p;^mOm0e0rMp`_17{HX+7~FGRR!@p?S{G3y4q5A*gZx}RsBGJEH4 zzv;oPzUTXP9Flo{+&X}H2ZKq&*+Lt&4Xf%>V`8kQ{p%99Sp40}%4L_PBjWgff$H{dg`dIme}(*5 zDF18W&)XqIe{Ze-J1b5;pt)J*JL87?Kj+@JthescuK?X zfB63M`9EjQzi9Q&bpFpmc?Q0WqqkpJsl>;1H$DL!?R-sK1$1Y`+V8(XJeEBU2B9qX zzvbRfyPmB6rTV*i{U`N@v-kg;9V+#|y#9Onu6++>rX2a4${xxZBmd#^QICZC{C^Jc zd)VB2|L5HMjQTr%ZCw4ItM`Ae-lgB~tXWaA{%7nz(7hOrM%zDo9ej};dR=Cc{&JBk zaoS56%9l=Qx|xz+g8==BLDWv{hMnR=pD1|?fufa@7*(ljOW>A z0eNf6Bl6a)pY%C8J>gD3wB#!7)0^W`n!k4GvMnuTyOPS3mZo@m@4Kvti*0S~1Uz=K z{n0$H_IB60ZC(%jnauhMDl2zZ&3oyowr8~&_xnXtcAeWcImR}11Aon9BmcfHZToUs zMB>#L&VC8~EM?*Ldy`3y%8qv#SLKD~BsuLCIKU&p|LwcPolDVo)_=zj7BwR5~HlD%OrzKr21C;tbf9o!7_Z@cX> zEwIUBIQy@#(Xe=0xrBrF?X)LS?*sflZHY;l8h2aXbWRG>9*=GJ_SMe*HF4(D8kfcM zYSN4{uS@Z6tzW<3X9C;tGah06pBn!@>|p$KG3Sf$-V-bpvZq_iClAa`msfD+s!?fZYZ~pg15zlVd9I&uDz0urK{)uZvc*~O+Wpmk| z*8DQPAmhD>@zRS&ToZC*8?qBlSC!P>RqQLCCY!~Wx;Fj$9-qa-F}t+ zY@f}(yYe1>jW@4meHLSWqN|$7?cJP`c2KyebaPD9`{PriXE!dhK4s_SIU(yd!`;dm ztRco9j;>AJe`(XzWSQsEzvrY)jec#@ux5D#^RX#8+%w*8o|*hfz)!z`=k6mjzl{gV zP1kL=zQgx*yTlj0FG|)^tX($ue&)XQc3)M^Z8=4&uXdtYhPEeLC(H>~{35nm3!$7{bV{daTz-NL{{9h}7*4E5yynSXy-~#Ez zO>ZrZf8c&CI4Sb{^yuQh2gHrn91gAjbG%;0?d`0ox2Fel`NeBjF_-;(I;H7m_FAU} zd&9I^Zch#2YFe-IVAB!3CXdz2#3i3Il+UPp$hG^y;kR$!9r&0kX0&(r7rpQm<`NEf z?2K0#y=H5UKD3tMQI$3SJA>y8hh93e<<0E&i8R&Au|IyxlFcN3=7QB`Uq3VLm=el- zUnP?He9uItGR_aH%rn^LoIY)){c#q9zRcrSt3DarxSsj^WylVR+Jj$wgY|q*TqPU!3ey zAZ~lI+Bm??j_;J79Pfm}DXd4A8JEk58_c(l8m3Dhxx4gA~ zYCQS<2K!@EBAHKWZDpI}xog|k-|tetOm6(hs&K=5jeJ!@f!=%Hw38MqZcLXsy{>SI zeB}?vsZAG`pLyTb{K@&-Psc~53;twOT=|!AJTTykiv3rW&l4pDQ#Z`ndD6j%^ZGj- zdsRa|E(^Cp*#NZzuius}Jb3h&HP4j7DTUJtr!YSKE+O++Ntt2hr&r<{Tg{FdWmiqI z-EsQhjYdgz%Wo?C)9v0yHO3W9-ODoDzUGU;W4+6Zd#ZVKn9r?YKIXNLZIS(>g|T47&{p}RDhlTWSV?c;PAh?^2}%~dZ*of)n zKhOw3LX9SLrb+@*<8KF#0)W{GKY~EBR_jec89pV>TdO6-?sRgc>7&}epY8t_x0XCK zcy@aA&)Yw}_kZ#JynXSHB#UX`i|^gL_d);vC;eCM%a;7|-uJ}&+4qmX-7C#svsedm z$$Sqi3_f1|Ns8^`@&ZW^O`4BD$Fc( zy89yb|IPV-BM+L#Z`trSXu_H2Tu*<7$Ov#9|1Y>LzBg#WudG*H6KX6$eg0JfS?gPa z8g>V1wLIFR5wA9L)~BRjt=U>NCBd;*rv=3331o>^Y~9vZ+-Q7;qyN^bAm(#?JI^sZ zU(@*L&65dtLRoWf{tWP5d_MY}Sq7U}w)XaxbJJ#B2#L=WPkPO=qe1WQ$uj}R80T#) ze)uD(%lCc3a>tU@jH?dkEq2;f({tIW(=7FlDcgxDe&JJcH-3I(HhuN~>DRC2EBNG_ zJiT(j+`-!Bz=~yRUqhJp#?Gp~qoBTP@m0GcZ?`_sxPB!hdzn$e*{ayw-n`%-z6$1( zyUTrcUe4)vju2m%aJTG#-!`%K&y9N3@oc%(yB#+;mXxCtp3emd&hEQTz=dANQIf_S4-S$UF~Bj zxc7v=&BqxIkp($HJGcIIT+T8(D2HiJ!6epWg(4wrCobLQnR5T1*;lRNK!;1F^#=1y zGnT!PGM_myU`j0WsWZOUf?gNuh%~&pAk+AhS%0tp2AS!CGoETltLSSii>+QTy=jk; z2iuIsNB#9ViZ^Ek=<8oB^AP)St4^M=wfN7&51bFKFOcA1?TU2E=xf-;aE|-JDxs|A zTQxJy5_n#?Wt?L!WJ&K6j<{_$&B1hoPWY{DmOAk~CjvDMc1JNDe&xPRHJZicdMVL zowxpaFUD`Xp0bKNXrylnY>OPz{iG0%J>G#_Rnr%VNIaj)^mtF)Y0w}*PMoi(lTohs z0pC5m9Kmd7tKJy*{{FGs;b+Mn*{#XP`C5yQ-u`13POBHe)%n*vf7 z_%0B?!2N>n8^aUbg}aiv8S{2J?RsKz`>4c0qc3*Z&o;eXzwP)+qtY#=EoP0y%Nz5i zJBWL{%UUZQ@YslXhm5mD#LmW|v6cifU~{FhucdumSZg)=|Y6K2FciHk0ilqoOSvRYj-LTyX8UCOD|h0_bCELW46 zQrMrq{8;Jic~90F2eX}D%=LZN*4imim%Du`O^v6Qzn>Gj-l+D(j?=MZcOfJ z_PO-+pRILhQSX$zz4hBqt-Crs=R!@w{k*BE%;z19{vLPubnx#slYo2qukYN;-EhW3 z;Kyw{1n)nx->>wr~1;@K-Q9nYV$1$&p7;a*>QM*L;+i$>@@#XPpbBX z-&B}6CA-n+wy#Po^GTNSSc~_0Mglbl9exTjC;#eae181?mkkLsg>J zOn;N3;lbGcy*~qg`xFHn3l!5xUsuHQp~{Cbu7Bm5sD?Q^PZY|CEWMFm`74w8;dU#P z^v4Tc_|~a4r`&n+d|vgne-3+`Ij^^rYreeoFW~5wY&Ykl0{Z;#KV8Ybv`+J|+m6#y zLYU7;al201%4q0)XxEM7zr1J8w&6c1GriI1^^~~hm)A+M9}Uvm4G_PrBiLs3$BWMwQVi)(fRBDC6_O-pIf~2tIQjl zUGd-M1SOPhJ>04{KH%!PB;V7#S}wWy zo@r0krqXksseI?Qd}q9zyvJ{y5#PoGv+gB4xOG6%UHZYZ&$B)=-mt0D>3sID;rky8 zt=q@!oDNvr?=^oWn|1$q@$-*6eCv$^cr}*an|_+}!oIWfva{mjes*tK9V%BbeUa0P z*sh=l(LIn+{c=q$mU~MzSWm1F=;Hob)%avj(1hZ(p&TctoW9h4O8oxXwQHrWvS@7V zzpsC4wdP(mb5@3`$$xcIm1((zUkh@cXImmBBxK$_dbcqN}oS@exkwF3i*G2oBNbhKC^QE zum3SO)!N=ZZ*v^S$&ZBseV_0DIeWil{{Nrz<3m<{y{f^wQG2au^Aqot0vYRNm#@4tt0a5Ux}Rcy-sQ+l`8C=1``zmPs%eE&8lSt% zRVmo~I??R4b6>&3rUw>%%}JaZ%*SL=|TS=(i^_+!B4Retvn(Y?)b- z!cQ-pkvHCXlI?^_QODV8Vqt*hOZ zBEL@mf%i$Hb$S9^6-=viY+FvdTQOd;IKR<;=J^*dxbCMgymqMFeXd=j|5;hdl*WWR z@#U-j&ar88v%I{dMO(0Er!CAAu&gWix<-0FtG5=ldxjk-G z&<9BV2GLyL71a3~y&Cg3{>o{8vM1<3v2F;*NgMGycR?BKik*UFMxwlK%9QBfChrfI z((OJ=9yI#R@p_Stw8k^DgWfIW3*Y~o_ug>F+^c2Zm^0@5-d_KE`{C;~XRoi|nO&=r z1zJ|f{MbjQgY#zKb;X~bqO??mFSWkrFE`Ym{VDy|$)BGd@&9|k|D{^;{o(sJEBf|K z{-|M=$TRQ8sbL>;G-3^~6`o+w6xafgU__XO7jI)hi)m7)* zNn;Sdq4sgsr2JpK?N!mN=Nk+j#_TxOQg$^g{6?i2=QPI5JBe<#4=q0LvEoTP?#|Bg z$c8QTa!TKE0ezE<0i}B;bIyZO2&pQq)+&HjvtLhiwCs!}8wAWj!dv+3gdF7?j^=}V5&YLGO z?Q!>FA4{|IoXab2pV=Xk$RJhm%;L~K0f9FSZyv@n7~7uMm3!cfhX!cF`@BuXZ*Fe& zHJ`=$OF^t341O-n9-808hbwNVQlnEceMlA zv*#pxt@D?$HsL=GTE|xN>q+3$2zgr`26>+2yi-K)r3Td8I51Q7HvcVFxrQ^W%Hj)R z&d6C7Jz4Z&-Q#5uMZMiT67#K3|4=`*#-F?I{QYvj1vPQ0*VJ~)9<*pOs{bRXyzt%G zN$Wg!F4OG!8DiBc*W6RZM2~yt+w~vaUyO`mj#p&>jiSqpWQX zKTpmm>D~P1?}-NEt~{d#pI@d2W6#?a8>&2(V?N1Xboz{U2TjFhyv*3(SxRo02P7N%9!X3Mn;oIVaJ_NXy(j(c=l_3Mp0j)R#RDd{KTmkGYe$at zu1hlKi#yg8>O6h6=Z&{xq#@I!?KhqaPmpnpOueSMk7d&1+=QErCfb!|jH{-^9e>Ld zdAqIJC)12+(NhNL6-*ZoXfHi~XMU;ICdPt0nF>+?Y*m)*$2sQZ+D|xLWh39Gcj5F2 zHM!}zbNrv)F0*<5s3PV=gxWc?dG4?FMy$~|AIGEexv~K?2M=nMhj8pYss&!`2HC5$ zN&wO-|5^pg-5-kAvd%I3tF*O0^3(yhtoS$w)4sy2`1JJUcb;FdoAZR@Tr1l0Qa#p_ z-J*XF&tUI~?Y?c`no)gPzFc);;^D30Q#lKz|BFAeSaIn1!_Q6oQr?O8?-%o8d{^WF z?M!PyC(v7h81_hfEj4SKb?VZEm~cTUo(|2m$IdQ&KI5XV!@FOm+odfYo2?JdGF7lO zzP9}Lq%S@W;>wGTx&Pv+(5zj@Da*F~O!zW?aq%7J7-j{%EvuTxTO}zOGuva*8_t-WTB5n~*j?SN-9b%zG)|_e8BOr9`uZYZ zdt?6UInO-LYP=J>(Z~B;atdGj%8hjgKkT?W&uGOmky-ar4;^86e(YD&&a+oTLti_CnjH&g6s>)rC!Bh1$H|t`xt66q4K=TR1nPS3W9!;$f79_M<4uNND`NND zVqJdBf$>C)$nB$V3>{`N=r=zRKHjhWbk?QpQ=6VDrB67sYtEBmJ25ZM>)+?`ii_MS z?PvVFciY{&PpS(h=UUgE(%N44plRPzwrQHIkD9I8$|shbec$z6#a_jt&gbdX{x)^q z8Ip`o7cby=RdwgvW?iS^I-M)QpKDJxd^+lReWUx$#F-51(?iO9JHHxpyyvTB*)}Fn6XM>-sDp&Sl_cf`Sz>AC+1Cr*12sz}Gh& zak3K2pqYdy)BB()P4`xZa`k-vl>=Igs_51tyT2vnmLmccIpNw`D$)GX0@_?S8#vl<+F2A zgtolSerc|^z5D!GwrBIo&aO$h^SrD%OXk7Lk9Ezr<942!GhZ(A+|ga%`F{JP%t@`9 z!|gm7R&r55m6w4O(VrXr>YI?fQjPhW;|fDHnX= zjn)}A#yS|;+U2sHVJR;y-KM>#yDp`nTr5LQ`clP;ooj^?&)@Nxq4crp)bGB+NsV_; zZcMaJ^WZZP@MZc|7M(8LXSny|0iy*y9y`)luKc*MLTJr)X_fc45)WiI@CY!U>S<+~ zpt;|!Dr5bro!>7m&zZ0%|GnPQnD_TGk4vcp7x5~5e*5U0DWyD-DMltrdW!(M{GA{yv>y4xbwUH>&hEN{|w)jah+HfwmL6u&ZV_dsY^mK z5^hctoT0i~_xhD1xiQa#?mYEjQF?T07xSCFha3#%Z*9=J;L~p~flJ{0bi3PyQ*4;m z=;ZHt$mVEz;dBd=etTKRvp)_dw|CedFQ{*k_Dz`XV8PAUZE)saY4-IKnQV(H?N)wY zD8cx^X8)Cadp;G!tPuGj2Ah6bECQR70!>9R=(}keoO``lbkb)p$BWMwZOgs=l}qE? z>nA5$KYcuJx>rtdrp=V~zgDfEBslrj|12%m1KoiaC)8*zUGObxr9fVI5NIQ>=pn;H zo*LSB6F%G!Sar(0)v@{fw6;|j5*xY}cWw5`*I#<2{*x$FCerG)^D&9LM`dMczpH z;3K4ydUeNgXE1*L)J*mI7Y*i1ELB^#o3-xR z71dhCc&=!+w0PB|m)6sob0>6btdx86dfH-MopNar<|8?;6+g~eux_2-RMXP3E!oo) zG_T){ZKhj)8yVw+WdUXthiJ;86%GV*o~9@pobTFd$NP@vm^k9y2cZFft`nx=oB zJGt9ug7{{>p9S;$ciwxedHtQ-<@P=Co!2Z*TrxaxBY0h7YSl#12dWNs50_p$-p`(< z`dDSRU)$#Li@V=EjOE#{uFIg%%}MuD5M)t_T0Vf$*jVFp2km+ zC;3;Lxz)V;&v*CE>uU37@A)8k@Hy-JaFtl*Gq1eQd98ivTV_#aP`8^iq3&5O!^h}n zcb{&*`8M5S`#G0*qX~cJEch|=fQE*`O~;$fdln@%T<6xe$#3B1U_Lsp?C&C7&m(=w z3zJ@LowVNAqi^Xo{k>0;7ce9$NTy3BEKBEfoi3?xjPaR;<%y=0-D^wrH?q|wOPMj{ zg=WolT)n=!-{^ugqb2|P!n@up?B}$WSgJ6eEt+2{*Pc2x=(dp^+i~U#GKastP;x)| zd3nQ|EY>ef`wuL3)0EV4S2#A2m8EbtV`|^SiUrgD>NI8@5NkN9$u@;CGLJi^u<*LX zlQf6bK^b2)s_hNu@BMd!ZQr*@ndTjNr%tWd>HBjV(}6cNGX2KAm)9K0xqa;Olg~07 z>^F9<|8BHCG}EI0bnd+Lf2GgwwiiREm} z2d7=ge%;ga>TTY}<7qJM zg}1*BHOxH4yykn^jo+7K+Sqq*?X^62z=-quj#Ig8$G*sJ&M}I}%gmeg-hJL&IboB> zI>P5%{f!)Bd(JGnGyCTWXXd@P{3eM1j$k^e61Q7s%I~VT&zpW#?Kx6abL2r~(B9*h zg)L56oL!uF{aa>lfzpa@qt|oKxXoLpf3tbF#>O;G9)EwqFRVKK?Vio4t>wPe71z(n z-kV;N@Lo?fKHKEVJIk-i!uMQfnZ8~U`QB9Fm|@tXuXf+wi)p+M{F@27r_Yp2Rj{02z^hYT zFh+&9PYO<$U)iRh|K7K*ol|{g zQML=G+1^tYryPtD<5-p`B>bFv-dvgJUcV`S_o)rfW0lRe(~8f}U;p5bro!$h#zhVr4u8-(sKs#RnRG6oK_1gvA2N9~b%WQt{w7($pP|7_rA^*JY|5?}X>{9km3KZSCTw=R;2CN5>B<|asou=zb{tu8Q(;a^?y2Q7*T&3aEDkM` zS-^Wj=!mP8sqxhI-yFBHL~M#@?>r*Bn7L6fXiDDY|2#gA#ll0wG}f$M$L78}>aUYV*d%HJ3(3?NKr`v~V+ph_mKj_VQvYWT<{h6vMn%nn%zjIe> zZ{3T=-!@Ngm3(`1ciHAihjzc)tA3~a{oaTBetYcRXCGrxf3I%;%*i|&_74(xRHQ|i zPZ_?QH8H?W|EHj8>~RPEXKI(Hzu9}TUs5MsdEq7o{X@IwE#kTTM0w%8NtP$x=^1NF zUhMwUR5fvasHf@DYh3S*4C=PuO_NlNEcoLmv~Iq*4)dwco!9mE6a;omPgCFjfA2$8 z=7-<+{JzVSbU@NvQexSgTi)w@EzXFaoST+#Yx>Nbxwn~~g{#C@OK#h}kMAJgX^VsU z(r2VhZd={fJj}M@aiN2r_q*BU(?7q~d}y+{C*j>Y)4ylulbiygy zXWP~)Uu*PdF?ejnyl6G=oKpF_=VhZOtzq5Iw(Ee-;+c0|?u`|-=3CEp|Jx25wciXc zBKY3k&MOa>nttQm^8%k!Tc-z|_6$3}X?o&k3BC_39e39hpWM3b^RsyU_1g8;Ts!=7 z_s^-2ulRFi-ySZ-A6X$Bkns^vm8Ah6F9D66oX}uBR>^pRfywVyY3%jqi+=p)*I3^0 zZdX{?`i2xezF;rMw_Ag_ppC($3%+NCrVCh`8j5T?e}jM1ep{0(p(|Q;uG|+SUNj~4 z@s&v_tBh=S-*}|7Cgt(1fcQ|Y@*Ni)#5LaL7@jaoQ2V)a>p~-wtD%~lvu_@1$uoS$ zsgWvX{CJ@j>kie0Yf2V3>N>_nAG%UepJBvtY$fXy&!x}I4n?vRs2^k76LWikRJ(-w zoF&-|mfw`D4W?(GyrFt(9pe+l>UlQu+kAVz-K^Tq-rdWu)xd3DxuAVwINJx_t!%%) zYOPk=ar*G?RafJE8pPu@4Aip9iUJ<&x!WLSvFv`u27d7w8-2gnZom0j&3E>`6#lob za`Jg)mtE6&YQR0K8D6x`RF8o_+Br)kj>DG#-` zv+gBVO}=@&T`#GIne#eJ`9wR9ou&abUpR{U`#Gk4H`2e^@Z*BxgNpSEGyk^pbiE9< z%RFBA`^7`&qKSfw7ijEM+tS_bsppqmA%4g=P36kX-3(8RwYD!~kv5lf=*zs`)ADI! z0N<&3HE*AS61>AQmf0=Y3NtV0omyvm;B@um_xlSD*2QnylFgj{OqKbpgHe)*$mYq7 zDGZ>abZ6d6`8CONcVFlAFS^ETTmftoBKtkBA1ErB`qGzemgi2kDXfRzM@X={R$O+SYFo@P&PvYll+c`=u5-t)VO2j8|IUJh#Y3g(42 z=^p=)`nFr4M`nR-Z1uk9k+v7)q{I^EOn*Z31Ib~H%-ma6uOB>^4QtX^RzcZZ7{3t^GLD|{2aYDQqyS?{#ExpoGqJrDqBTIv7sy$%sg< z4ZV@2&~^FDp5$jd{QL%scN{&i{pRUaylJ;*Wxf3>;S(M%@k7eyc5c-~#wVvf8CBbb zHl;btGSHiowqW<^1F{UMW=6KhrxY-6o02%W>Tdo8A4}7vkN(E4UASzSm5JFE&AYpf z%9(Rz+}m1v>D<-T`yPK3WDaXOz*fbR$8P$Lvm(vS$os&IBiX+udhStM!|jk~9*}l- zx@=Kn;Y`klOcT_3=9Np{=;Pzhu--g{_55XFwrkF}?96OdeBCJ6T;E#C+jj6Ewo;s|D(`O@N`E_Z_EvJxyuG$(d?we~>KfY5WYBkW3@lq)dif5Y z(_Wrcypzh$<%;X%pATBs_^|cEx@Nxf+m2W+)3@wvwJQ5EK_)d#L*CYD(^p02oI|@} zVkQJtovrfOVOMs>wchCQ0-LwLQY=clCcSRmd9tNc@X^-;tnrh|cy%_jOevhym{K)S zf6n)LDWD4Sx#Q18OJ1`(`RqCt8Fp)HqmclQ2J=as!U>I_G0jPjJ2V_-2ECq9(z|G} zOz`^o=Ps?gKg)Y}-#PH@F~=P~bu*>B_q_Hdg*oL(@0Rm*(MvoTEu#9O2qBQn`M_zfBeGv*}s~PoM(#igzZnKDt;#toZ_0amZXRdPyicEUel2M%2wHsG zFALe`6fTf{z3Odc;HumMF=ubA;L?4$n{7(rgvO+*Ni)lRB2B%|u`e)} zRM>s^t#{P~>72dmwuLpuu4OxY)|WSGn~C|VGrRU~z1gt+>^aw&CH?0M%zm&fDxCAu zbs7K62kREr$z86V`rD_aymSV`Ge4%iJWDk9rkRAi@m|JWdHqgLv*Ec-2aOryreran z?`it|V-)8Fgt+ zdp-8EO?c_K%zP$;zQWANlTwUZ^S1}BORl)SZmxCieWwcXrPr7HNifJ;3HV9LOfIP9 zv9L=s$XUey^NZ(u+cJx90_&}Fq-#&6zq3dUc(Zv@WdGlj>c#=*)MJC|{yt#tsobT1 zXT4#-_mZiOXWvvcAdv+ zk5!D7UY%_z*L-*@<@Ag)S>bh_d)OuwPJSwP+iK}Gul?61$)(0KovMuZwj}$RroFO* z+KFzXoH;2D5)OUI3om%TKdf43So2}&ca911Rrjl>H1Vpq2e5U$3}%}F+M;GC*L7Qu z{}a+MRyvT6evD8tbHBug14t+Mo`Q&7E~qxD;oaygIeX zcj3ZqL3#zDl`Ai;(7gC~QP$^UTbUl7GxOhiZ0XUPvhT8mFKm*XKBG4FPTtC^X2&cZ zvaR1<93pY!k(UAglzAyZ8yTH{O}LwwH%YnYg+1GZ!ldX~7UIwI3?kkXMBF>0liGY+ z_e`kX#U1K0FD{)`eWm(tbMcpwtt-D*6m8M>US`Iy{kX)7++fKcHx!B|&vuTyDb{>P zs`+`;&YPvCp|9-K-by8`TfLU+jDOl4;q&PcC$E?NUnn=Vr+kalmF*wzRO&PQQCphK zd{iZ-TvFolWFDExMR%{T7)YNf-_~B&{AlGz#p*sgIWC8J5-+D~`#6Xv#xd90ev3Hc zVHU9b%B^jJFRteQe(9JdUEt$iv|cxG&UBw!UrkhRmCe3+s=+|daGl}PtJd3mS3a-E zO7cm%eQhS^+Vg(CFAh()pYix{*?rF2c9{vbvs+6gRnF(m-g?`ZDYa_i_jmUe?t8L# z_e)r8Eg|Axaed$3mh!-+z3~Tl6z1EN+T5vq zuG#65y);T%!2ZvHy-~}rNLd`y-1q#Q@y(tm!9q{3eNkO)|MN_yd{#q)4GxPye25DbxM4?xXeD=j6Uzz+Lnff%h_c_MBioA9yc)cX|(u)B%BQzXt zrfclKESub%*q$(d{+UTrUhnw(m+joFm1_zE_7t60u%jrL=$&+P7q z&A43|{H{>s`NJQ7%+Af+-`kKpZ?oKWhdl-L3pMWh%UbC%96XpadURk$=>tWf_DebqX3QXt;jtSlwc|mG! z62qoldsL)PhNzV{UfRn$^K#6#%Dq+7U%o#oTXrFr$M$Wh+Jg;&ORrCf>X(=>E%%-R zyV&$;#gC1G=k;d6wtSb?a^@ zdFXBB4!Dzc%w=MeZ=^+WH)BFf_BnI2E2#_a2+fE;qm#n_HmQ2P{WM#?JY&b$1I24~ zwY9Z*XUQ&j>72LWuh+A@t=~^gn^$y}=Xsg+@`L*wKRt=qpSOAa*#|Qp=n1V;)={3c z{-tYPuHjapM^~lN)MgagEVy~f!SLxV2a}~2zQ{c0GESa(Da&h(<+PHl12ZA`O^{mb9zyoP6u+%V4%MY!@s}eNkF${oZ2bycG7-_nv(V zWU41MCVQ=IOa>n>xvt>*-E!@hzwX@J{BX{%DeprsZFTs`w0W{5^HzmC?n%5oFP+&Y ziC+79WA>JsGuu|GN7kPFH*@0uJxMwujB$o9e{~)&oT|C{TU?5R<+Oy&cboUzdvzeE z>YHTw#QC+;ro2wy>bHMW)zsp}3-3)-jXQoZ;8nQUL!J5q2X4fsv8PY7%f5LqLiHNk z1;I%>WxrR>H1)iGZ}A^R=J;)lC!3z}Oi|W3&XU7m;be3{=I~yYoim%?O!&iiQ2X|C z#>m$fRsVHdE9{SCI-$vU;%70(l*Sipe4-n2l5AO%yr(iqc(8Tk?zC)vx=HBwnn&Ae z|NWfaDP2-6*JT{Q7GcS6&~td!`#`p=#-IdAi)Uu<3?I)bXw__GE0SGi8))5@$GBZ5 zeC;BZTj>Um4XO`q?eA6kyX(W(CsWIN8h`xRw@2n!ICmZ6vnz&`A8!TS1|8J32edR2 zd5I*bn*+jHEf2IcSu3w^t?_aM-`2yl`E}LX7rZeX&-8iLZ{<2zraG1B&eJfiqUo!? zW`|3k*eV&37h(}!?VY*Cssg=8B*v*wy}{*{%R?@6CpIrHJ2ODD3kIeAOBezSS= zk!RZM*{`ln_L2G?P~TqFr@55vOylEs=fd{qZn%?udx!6RL*t3nyLeXo-n}&^@0(GM zo3r2()<4@M4T|IMqXv78@>)9Y1kasp(_Xr#c}}>#bF&_6#Y~3OrakWzkDPX}oEB@WAK5U+^7sM6+Z^w^ z8qSFOt3+S!_tF2f_}fng1NVn=pKtz{;b^qLW`0@jf-^Qx)#p_>E#Q%H_vqVxH?uCg z;@pE769aaf=CD{Mf3td$?U8O(+tUq2afK#RmdDz!2kmQg=@1v-`Qc^}_On!H>$L7a zdCd2|rxh8b)l6x)nU{Tc+852uJqKityFO**IUU&d?o+#%LgaSi2(ggOXRjsSGF@ln z7(XT7-QD7yu*&lVvrFI2-hZ~x>&mp#dyFQ;Ogs2dtU2k|WY*KFY{#3Pvz`pymV5Cg ztIku2+mk*Q#CL8ix41a_PmB!nn!JeZVH0?Cst;V#Ws0*4HqR^gz`Ez>o-{8;&zoA? zw>`dVd2DH%s<~8xUX5%kQx)e|ueaJF$K5tO-?_B!r1n#{O zYvtvrsXoTHI4`_?pU0~bzYQYXT>Q#4oieV!=!G$cNHrGc*3j!5=duUBb{JUQy2dBiLx z_0$&4smr#^Hp*Nuyr&R8)I+;pWxf5wcKVBw@}+ezJJY6I zUeIW;d3Ix>!_D7))j84guQ6r?t@~ZgbAxwM@*&f6MeS?L%Wl*K_cwlBa?m*QdP{lk z{J91*mfA=us4-R>o$>2yySdU(w{R9?`Z34CKR;e!hEK|Xko0g6uW_poAKKv z|7QpWT5s1}k$ryMTd!?wQ#`jEv%Hu1fyaRP(izWt8|Usz<$udG$#bXL!&x8J$==?c zZDy4BDR#O4nPx-2Pn^wKeea@|)oc{7b?Oqy!3!A-T_XHI52A@`v4 z(~fwCV#PNPV|!XZ6$X^w_pIF7SRB??dwp&?Ps#a}CcpPppRdZ8&Y8hB#dFub|9|#I zt~BMmuIDgw%Ig^=zNbtV>CbG*cKCU=-%d!b{)}Dvy&oQI#|687>Kw@Zw&e8=mI;p| zG=5DEY)Oefwj|qs_p&=u4t*1RPJZ3|LNZO`_n#C8NzMuLyH8t~&vePjV?J)@JhLdr zYh&ZnLmvZPxHhMGt-t@@u4!EfgU3LF&b+(7vbFq-9eI+Z$631gW0CH=jGDSmrtNq`fJ#g>q#w-|hFz z`}``pA@R~`-lVrSuWaX)cX39PT$c>DJQt<5K)bJ;X&raGvsX83%8_h_n!-uoYDo83 zu3M|Z9tlyW{Ec3Y`5Qqs4-A7Qg)~@?2Wl?Zy>4nK*NJtnx2^?UkhAr=s-opmkt^%A z1QqNK@^XAvq{Vt5TN`@l}&{YCJxa<$cns`9e|iwlLX?{$4HGU;_cgv zODmRNJjmDVSJg55@VA!_FQoUIt2|h1G+`abnebzsiLwWddNR)1dE$xE#=zuNSzoO* z4lnbU*pO=XDWQJ)-EZ^K9A@NxQDOeINAH^FF1Beez1?OVp7T}d`n8a@HY<5YR*A;LIX3*(nBOR6R_rkz^P`Ei!QlI%G~?>6e}$-eRLM{ir< z)tqtKCE$A5?%vIN&L5a*u>S6?ZC4LSHK@Iu^NHPA!nU#+} zYhFKK`1hpYTdQR;^KCl)wDx#U$SL5_U_O3e!!gI1Qwn?w#3$6)AB=m>dV>35>^2jR zuuoeVKmGAo@q6=NR+!uAc(BbVoVK`G#@+F!g~t4uJ*$0AZf!QoyzajeG-TM@ zY7`)*^W4o@@XgiiZB?TTUFdsE!wBB{{vyn&N-jfX*^S>9Y-?RJ8 zgEtpsn)feyRy~ckrZIWWlL#wW;q{?mx&>vf9%aX+489rV*W2-((&UKdJE^M2n0A+Q znXHSqke&+34ehJsL`gZ?Z^t@Je?Z)CK`SIKC-1@hS;rO0uN2dhotL@NcJrKSa zx=|gnQV6tK2#obyuPgrCx>RIB?Dgzu&5GYKpq=QGZ-+aDv!2vkdZ0{oYSZnh0bE7X zqct`3LMA(=Is2~kTBPn)&FgmhN`1`6)aHh1TV4h+Kl7EocBA#iuML%tLDkH1$rCCe z=g;;?)Pz}^-2Th>H+uNsfpwoAS#GYM_$eVuo?_GS9AJ+nVEuKe=pkwQOj`RT24 zFEY&xayb9a?OnKZp;E|{b=ZP~7v)?ckdw1SRYnZ8^e`=fQ za!K_ay$-rE57nAKzBACfzVqz7`s9RphW*?gk2{zz?09td+m5en$EJ!tmHK^T(vj?- zb(ZXTMh0H-rRmX|bIm>Sa<80F|25Hb{ksiscU*8V?Aye&XOmnC(;lfec4xP(-MZBC z?+KMO@#PcW~sc%{^Uc#jF1d*&+Ctw(jHWt%KPknrd^}{&oN(> zSbu>BQ>RAD-*9)h{;uHB4abAVenuPCeDvSuXKz${@=VCR+yovO=94Xzfq7>wG}>+p zKY02u7F7RO=owmxoV!za$l>O3$Ble4_e-Bmaro6I%yx|JsKwE837*LXye^NWjDK;O zN1nXC++$~1K-i_yYm0eI+{I@udCkt-r+?#9Blq`J=8_3&C%Ov*_ywP(KJYoTHE5l@ z%GF>0K&MKr{38`GPoDdz$BOnE6_L#Af-@LXEswDsE6m&ET*P+DU*O5t8IBtni>8(N z@*5@SSePBXlzq%;WB-xtrE&Yeu5EgHV>XX~u@F}PTT5f|sg;pc6T}2d?lMXc}{A1uWTRdxz7e~x@u2cOg!gYTxZKQ zLDb~=0ZaXF?wozRU5wceBKtNSG@7txU&?M?5o?|F1M}7{cgV3+nZcT4&a~wn+w?~Y zx65{(`S$Z@?pKB2Npq&E7T=$AR{EKD|5sMU?@#My7A$}2k-eLff&E0T{QQkm{3a_i z@;sIk{_r$Dp{kYdcK(ispT*wFxlhbETl@L8UZ~R9*GZoDi~ntn^_wzb`L^d%K{qHe zL2pomvcY0a_mV<+RQ?~*|Ks%I{r|uFU%&Uy`hT_K^;OU@5LbR(um5|!{rvww=j)Fe zc3=JY`1td9?)V3PZ`c3Mk1ss)+OgGOTg;+UuiEQgw12rbp?i`Q+eGtEq48fsAAl!-euRQ`(9rE{g0`_d+^qkmi!-W`2nf1HhrqstwD!NEDY1Tr@d|Q$&;S7 z2habHk5k^iyinf0o4@|Y;fL<^U)&ELxBpkT_umeE{dML$xBZ;={^z_8C;jU_Eh>J} z+W2Arzw7_2TI>ECuaEit^X{4a|GoEr^nRGwU*qz>{>J%FulK!seF$`BO&jQdEROx( zviC20E`I)ewPR|^p1mpvG~J#WqzGy9&e3Xlyu!AaElBxpVp@{In>&WW8l}tB zXC8UgIdPsr<^$`@fE)MTC{I4+&3Utky=ha{ugRz1F!5%vDjjdLdb`8wY)qbU#k&o~ zh4UxY9oTyA;BMIo>$d#P-O#;InrBviXjR!x$BO#$V2O9Rp;D#YcjYDCzt7?+4OM0O zHH+)cW3A@hj@HXO5AgV03!A=LUozre(5}eL>t9TjuQ8^_NvA$}%=VVKZ3&a+@|%K{$5471@4R%M z2BQmS-e$Tv^!B$#Htl`kI8SX&_MvZ;4bu$#Z2Qa)>x|is>^R9%6_~enQZ{pP z)ztTv)zh2yyzqDXqIiGd!~m9>xq-J#>jU0zvu9y2W{hLlbl$)0yM#iS1L($)*F4iU zgZgy8rd-{ullpi8%PEzF= zs=m2(dOY)~{M{L#e&J)K)jYQsNG7DoTJ#0@M1=4AB4xog>E^q}IJtYQ65L&jXX`k` z?Rd+#d3y4G_uA8uOxwIR-OqmTiZO1-*`l(|`%)RcrpClNu5UKHZI^SLqsF-7>!ZH`43Q{l5PzWc3ZqekL=&+Bd&+3e(1?6WEIxcSy7BY>IBtmSMbp ztsNO&lZk+=Y-;01#t&(~&)j8-cx@xtC%!<^JTh;yZhrh*+hZ!R#>eNCWFK?* zIOk64zR3BHe?H$W@z6~?ubVM>x{zMcA0>sY_Un&Mi4NAC#01)ey6-4x!P6oUaP2I% z8bsT?(F={Karf9g=Z9tC#y_B(*y!@-ieb2Nk?M{OX|f9*y!U=+*e!bCZ|!zf?9=T7(zI%%Tn|L5<~eziBJ*UnsLTX6?; zq$U66&6`g?UbnU4ZO9bHqCL;+zn9mmuV9g>jIY$c`F&~pucb_WeSg2@|Nr*EdjDtZ zrsQuQU6~)8|H@kMcmBW2^|RQ0_jx=rvsC>f^Yc>kfAu$~yYDlf<8LUQZ~yPH{k6~9 zHhh;K`2Tz2Kc# zI_~~2UAF7GObp34#d)W5%O-9=cHrl?3-=-f*>=5h&USWPp>599m+xM;EJ!hKO4Q@3V7If= z8D!ZmwUl#SdTXfW#-sP!iuK%%b5o)wSH*^gN@hujhK9>l?T-4&dhp2&2MNhnTc1yD z+~la27`x-_+a0Ibj<%FBex1xxc(d^D-M6zQp1Cx69caP+uB#4nE@jR6CdX)8&?9~3 z@q@IV7ta%TyjYE=t-al2>pSkhY-b#dln!*)Jvqq8|Gr4P^2&osmj)mC zPv_nm3q77AA^!C53FBW3i=R~8dQg#;=C$`!gYg8L>J}zzN7nq-kg*L zGajs4k=)K(!T&~B<-H@@iFW?C-#-Shf9Iayxyvr0q2|eiSQpM|wtKh()b?nzRXo%) z7JBt$Pj^kbONaP@HT#}e+dTYr=ccvjgVxVJhfMQ~7VwyOmrt&ms~W3);`HQog_8=W z$eRe%C7Zo_S=ap3T#AMHgvHUG)-J`kqKTS&>lUB)I_A1eUsCYV)c>{LF9xW@R!_Ko z**`GL_vY8h4}X^LvDMyL7Cy7Iag*bx;%)sbISG-f*AHwwSfsP}Tg&V1tN&Q_wRJsS zcyHmA>{FX;zutPTS^d(~&y@l@Fs(R*K$_-5qR%1wK_P5$}By|o?;4FA7)x;Tb3 z^vssI`?NCP+`%Fl(WQlfY$ul_9skO4;nm#l8&2m_4 z{W+P`bDr}*r8O5khsJiH-D*(R+VMT;G}~}(1xqdd%+_B``ahU<`s@gf zkvabM%;)FE-QAgo{_n7O<}|zZ&;19dJ)+v}KF>V=g2~#>Pi|77(qiV$g0@1Fofn=n z&CRt)iRrI>8eW(BW0C%^MU?`_B3ZcV-W;#fiP=%$xWQc@#YQ}#-P`v!_j$v-=Vtc( z{k3nBi;k?w==%NX(a%p32hM^Hw0#{l;q7w2xtE?-{;PdFNAO#ES{jRqgREbYP20z2 z8}~a7as2DMk3YK;|4B7|(RG1-*E#)fZNm3?*k#uzE6@1&f6i~l6$iZT%)8G2=Kz1q zlRy9Noc}v#-PzB_73$X2+!V z%JAgphdYc8|Kbbf517lH&Q7ylZ@qu+_pawho*x12;cdJBd++_r_cP+G|G%&3`4M&V z*!?T@pY#9qPAe`hzIE<@<-5bx=gS={_G!f2 zjsLYY{?h-@y!zMM>#~0w(*JX)a>L`je<#ZS6x`e1ptoN0-S4&cf9b{sGybk&Jer+g zZC`ySCSleo-hD3~*e1&#|MY*=hBGsd|GRttZ!BYh&2i9qfG_`t|FaNL+*wd9vVZoU z|L5|VUp+oQ?LYG$`E&1|+de9vRyt4m{QU2>^=E=geHC^Fv?lDHbSnPMx+y>W_X)kq zSZAoQCUCvM%PS1er%n1=wy>=G?mpWqVR?L4pU%EgZey4=;VS5AM5#k>D*E-FskK|* zP0TYr@g^%wqsLACqWYbbf~ZI>k9}tkl+TToDSX$id7RBL-}943j1lg^zM$c42Dauv}Amgk+f`GeWna_ z)9$ge$847!k#b<0#(I|Pz0r*AZ&ms(r}N}I=JEIMTk(Cy&7)HyH``emX=KP5Cmai0 z_GK36(iip0k`#>|KK|B&j{NVH9?rV-#*#U8+LW00_jdZe+jz|3=FZYO=G3YQSF88r zmMLz~o;{OCBRI=;d+qFmnV^NL4QW-AH4mz7=?)A4uk)^uwXgDceZX*n&jfMJ>t9sm zH`j7~-qfw35V`XDwvqt5ocfdr>aoE^z1=;Vc{GA&`QF+(C#5;%n8QQ0$9lpKTu+)d z_}nyAI@3MnHTU<*L#Fbdymsw-J}34>MZ@)I2m%L#AkHqFw2FU=nw&Z*x zZ~q;Ae^2VQmQQS3TbJ6N@}R=*rIq&XzRc@_lafz7qg^XxnvKtxIY=%jdtm0E$JkIbKZMYF4?>D-0|rPri9$z^h&KWVEv!Zd!!h5{k-Vk>h+fSRHeSh zrMRBSKK^A{)p4y8WI{m)`pA_{*Roqa%^P&#s9@Q2XU!M7VXYr_M-)Ds7bJJ(g8aXS z@~@01eEyGDtpH%++UH||6S69cDEqfUBi;Nz<&HuG5|I&G-dY(tm zMc<$Q&&|+2KmE>mafLm{YXk)pXFlg}c42tx%@KF|dfnUW=kDukS*_Z!^bgPf)Ac{~ ze@T9r7j*CJe|@it@3*${Q6KhUXzbL{O4PEHrC`RM3r^!@pNiQAR@mG(dO zAKCc-qy4|*A8PM^ul+Uqq}78{Wl?)9o`c$)uf2I<3f{5De74)%fBpQ%8pg)xv(A-Q)J{DeLVI_m14IkrcRFwa?%e==j4AvG>2mHf1JEuND0D<0j*anw3KPU6QQ# zr(10QBj1)?QG38}Kl`6|M}LdI0yRm$##prJGgr*7^yltpp7gUeDPH8fwq2c~3iB%m z)Ay3we+nu5oAbk7zW;Rh^Ml3yZ?(hnANXp8fR_XuEL%E-{r1!##TR0$f4$mtA#*}h zd}z{vTRQAJt}<*Ed>;Pvf+*Y6r&>#osV+0wwW}ss;!UQ>j&&jYMYUg_8CYjdNd3^m z+`ap>g?h~6b>E&{$Wid_G|kFfV^EN%gKyv@xt1)YfUjJGZG?imoUR1h4{cPLxZ`GD%$+@jwJ6CI)NgITF z+JqmN{^{e#hjBYkObL4|VQzknb<*0^T5onvt`Y`Of95l?}L7?Oz|=7%R(mhNYtPmet|~0*mL($UT$ubl<&s z2FVM~nYlSlY+4(6f?-Rev0|L?;=^9s6{i~I=79y7U)EL6Aaw=#fr&@ zVQ%@fNcYbNa=Kn#S4rI8a&NxnNsfd%f0pO0x)x{cjJRBU);4!OYVKJ9VzFF?gDUE9!*D|fmE3D{g*t2rUk>?uH zBAaD@ek_Yuxc%Vf!ked8KMlAo4J+DustGwng=-SSxlc4vGIqD}*|MtZVTI;$W=gK%L^p_r( zdfxe3Wz0T?2Rj*~4;1daeq8%~~Q ztmxL$es8(HT|ZrUh3i9=WAh?hR@&6A{h9pf5jRKOy!sF9^$W83w|%s@!}jUZggN5p zJM~$AC_OsTDZKv1`Oj<%Dr4_F+uOZPzv0LIf4A#{cT3cVSLW7CJoNh6^K<`$`ySUm z{m<}vkNcnd33Hzx|8Klb|IyD!zmMeBwe6XHr*DGH!P)x~8D^Bulm1`6Gws1&ws}AA zB*_0~|9PnC`Qf*F8ZsJo66lHo>v|6BMy<1Q1p}nd)tEca~w=S*G_;Zu=s_h!RyVl)GSrC)_;Pl6- z(Ppi@Y-d!ZueB_^m&SZfZ|B7ZZPnYey|10r&6_YeM*7z5RnGGn3;eAaVwWaM%Det7 z-QH-?d2Rc>BIk%wWAT1zr_h^h&3AbhF5Rco^JQzx#(!eF`x&=8e)EW*J$Jp@l-sWH zvvqgY2gmL_wd?wtZQc8~u6F)8jh881=8dDZdBdH{e(MXHWm2owu0Cb<>ZjI{)r&m? ze3HyJocp06wC-kD-T|3~GnZr^*tKt&*8-oF6`*sf?yTI%s2XE@yz&ae^eL}1o8u>~ zujZN6n6yC3fNhpE?-b5=SxP5PU%7udG2r(4(s%xkzJ@j54rG3EFYmVbrThtZWPeo| zWyncx$YuVvV@me-mV5Ko@yxPzTHaZga%gwMlepdTjj+|w@Kl{A;x?_3FY&YH+>O9kqAJ-IA-f{Y!wWZ=i1?E!?#@<`-rp13TLn$ZP@H-JehU(d&30QFwX;Q zO|}nCANSB@sc|*G>FzDsP|UX3WAWk~$%T^NB^jRC{IlRY+LU^3?c2KB4{yD5&MaRh z(jclmRYY23dDGen*865k^E^rO`?zX$ep$mA1xX3EB5#f_r%p|gouIk%nC`cYfv;@S zcHa&Axs9_t^7-;BQsq(>XAg*djEw!UXPw)e#T)+r@KU|P()RIJh1~Swg^RgPZw>Zp zEcDWR5Zm?Xz-|%fffh+qn?UQ^E2b~9;feQZI5?H%$fGtURgQ=Uk7jbG)|pwHjQLV5 z&1ipseg6K7iaoz~Tv%o^JNu@S2U{N_!viHb`J?x393;vo2!+nMukC1*r}uQzN12d= z3_I7jiyOUTj{C8uZ~Ni~kvVov9Sj-_Dt2P?x9(`!|s2O@2z6*JbqVUF6t`#`aQtz4f!^9AVqs?xvG`Je3` zn?38-6#2iNv+j}YL$mjysh=BE-?N4?+vLv^{#|L;AaeY3y;l7?jd|wp6Zf3m$WXrL z?C(>xhHMNOzoIMorf_YZfBaGU`QHcMI(Zzs`sBI5d3K)9^%JsK81%l~-z58^_jq8K z+}-pe*^jLnk3Y3M`d$2^^?}#@$K4(ZeXh6K-+SKfp831u?>*{%o7aCfKYfsGO(kzl zq_Em1XhXXwU+W;H}EO8&ij)|7(S_^me=>~gc+_t@E1>iChr zS=!z_Y1i9Jv-7V0ns)Xz%LbN&ttO#d8Z#%`*xnQ0=F7+SOfLLIQ~qAt^uzme@L&rMDI?;6Mx0uzZ%wJYM z4q(1zD*CO4cSGep-EUGm{fnJ@53W8~UGDuNCqL+>sbcIIbGC|^bMIUUSZ?>^)G032 zxZtR>lZ;+ZWMtY}6K1UUX^Eo=U!lMF=ZTGR4qN?SUT-OT=t`B49 zmHBQEw>|zv(Z7Fk+FezHXLp>NYZFgBsCoX4lllHcgM6*o>yVEpo-LH0FhgWA`U z&G%$~{jM@q-#LF?%56V+?@u z;Oj3bGh0nv%_u_cME0cz<*N@={N5IM&|t%v87tRD{ci1Mp^j>yE zDtu-)+c8I3GmU4=IsKjwW0y6zl*w8xIP!Y(@%{`Qk<-G*`)-xFxyc#}*sYRF`87#% z>oHfgk5U28%>0aQKeAY1{U)h-Y4fJ(iI3&(7mIzrA)7jB9p`(d4oPv>{GvDhVGF{| z^ncbhC%0Bf%KX;QsG3%5+g5SZE|o#jUDD%PPYTm+p04@T(>7&R^%Zu@iyJVXVAzsy zbJ~>1$4dLJF8Gm~Ut6{B%PiHsr~WK-D6|pzdy>O|Z9?ON=eeHtMi_own1?hjJ3 z>1%KAvoYbGBlvvQbjIxm4W2(W+k5Ww)7v*QR@GR3KRt8x9HtFPEH+GArZc-8FrOB4 zJV3AIv~=u~vrE3YU*ECC<+;m8yH~!;rbInw?5o}Fwf$z=?=7+(+lt+P@}x0;3SGTL zrzWpk^!cg#&vrh|U%uqHxx=^XMNf~%ov{pdsIh$NSZ+Cm{oYd0-cT+6J>Jm$INhOg zUEEXKA5LKi)7#R>sUYz2XInA5%*W3RH+~eE9+J6mpw&u%E8@YMqqRFaW4;u>jp8_I zBY(>IbAm^y&;qZY`U$O*PrRM~=j8l7N-E5sF4nqDk$ik>Bj167T=DO*T$5hbvd+<1 z$jbA%|7f+hq|WajMhwrVzWw6O~w;l5D#B-cvh`MvU`s7cBsC(kyK7ZaR z9|Le{@H$zG}jzKZP~t9x1r*aAUAMuU{_{#iR0BZuz&uI=T7x5C18%?{(9FI!*z5VO`#Ub0Htyj}73wUF(qCEKsHbv~4H{JiV--$#=- z9od>4cDr~*fW2|*)vs(HL!Zum8t^zoyQ2GIkSy;vsn;S*+bSPhS)N&v5&Vc(BRK5b zbfz`eSCr3s^5*QqLvi&x_m+Ko_=xG`=F7_8ZdLJ4$##zI-OJ8)hQa7z>{ipOS~s7W zPR#Q?X?mfj`%G=&6!yXz-d)z#GZ=F(WI5cue|eo;y4SYkPo|$IzVudmIqOKa)1F0E zw{BlqeCBU?o@s)qL7I$6-iHac=0U4D-!rY_{2?XvV)ASm;kCbcrm*Miy`CVMASa=4 zWp(`DlMNg1r0)Lz=1U8EMef{bug_R$9NM!@=t}DL^yTWTr#4?^yHGS)cGAxcv-v-q za%m7h7^@N`d}r%fyM}M??`GcqmT~)|GW*qbpPi<~lQcK8Eh+5N+z#5>#rba0k*EWE z&QD(V((_x~)5Ar*jn8(UV>qt9sSyY8Ryv`uvR6eLNib3N)4Q=Y=%q^QwpkXL9GHXnOB@#^jQD zo$d4=yGdof@kR}QemwqGnLb~T!6@_k`8|Ji+4l3DW2r2ZUOqGTRyfD$nG8>6RQTT7 zDzyG>Qb5)3+a^+4R;O6X823Avy#Auje3I+qCe^3cI=B^kTZMS66*kLNPi}m?Bla}M znQ!fxc27==R8MBibP%&B>*#y;iAmx)>xE;r7fa7M8+Y-Q*tGqApjZFoDSsRP?1D*+ zPbF>~-6zrz+gsq4>A7&p53}DrUb4cb{M#)KER{BHzwW(I*@kJa)KizAU)0Jc6*h}r zOZ~ohkJR#tV!kPnZquVWZx*ePy-~^Y?))yV-NpT(J)b6=$v*df_mm$@4g0dEX2l;Y zb?dIIYZcfNA$sUt(A51a;#YkVU+*2N_(9JVG!Q3PGTmFSZ!zdvjhN?w&$wSa+g@z= zUo`%s=r79;{hzY86-%3U8zm~ttgl(e#BCAOAhzJ()+|Mp&F3mLcc#jUOGrH4xN|{& z>Pee?hDmandGTD6_P=|*&rkg2pS`RFg(b<6KavzBSM;A}*Lbq^=y9hz{1+aY9?7j) z_9%jR?H=_VO;hG=S}!n(v65kO=`XuRrx?$?&qo>R#Vy$DlNl8fCQk~BNlBPhYr}V5 zQNB)0vFABc%jcua|L1F1KZ|+u*qg6TZ4L91DW8h$@;-k)z}oY?^U==_H$IxBzS@&t zlPS+?^YneQ823q=c$p_V=FZnW-}<|FuiW-{zDYmpC+fdtvs+oWL(1dXf1c+Lq8h$W zetzul51#JhZXb&mv{>C!d(iWIcD=t+%;QPLHn0EG_pP5jUvYio^+O-;xCvHdIxqOt zSGw=agNQo)9lYv=I?q|+e%?*8{{Hm&+5g3P&$o(rJo}qapQD)|-GBCfv6j}O!awgm zMm>J}^ui{GqJ>-s%a(?4Y}a1sbRag*)!YV`HfVWv|FWy)-?_1RF z_tQ3H9)7z`hkNSN*?Z!5u08lJUdn7utZqkYeR=ib#@ytL758M=s-jpMe825jTV`|M zR?_opm*jRIXPD8wkGCw5YfkvI=@KujH2804XRXlW|DvG1CT!dudhv;_Va_DOZ}%i+cbCYpPm#v&DPd%3Co+06B`Ze%+~xoSu|h$*p`yx zl?FY%0>4a?j`MO(;e0D4_37=76DrY{r`seu^muGt#x5C=HaF;XWc2;K*TuKD-zs|_ zes5dpF@;+VxBoTd-nPoFkMY=fPm6u#ME~P_w_AG|jr=}MY_2{mtKQEsp|HPjD(4p` z2O|a_%dazo%L=n!I~X~}IT*hl>2`azPKd-rKKr~LCU=F^&A;;V0z_vtYIUHyo<%ZvHB=e=}SdppZO zU%`_9Ouo_Hj}zN-?k05$shJ=?zx;qv-Y4Vy;smy7PgSIO zm{06G>%H#z+_bmV-WAUz=LqTVXPfYoS@N#1YFzrt>j#Y1ZCWs+L4S8gm)<9C{U`3u zg3nn0SjhyZ&3*41c5`dOjf0U3Z1^v%vDV?9@iwBoU$((i=+w2vpU(u@o-Uin_~F$J zo_VYXm+|k}qF{gSsOwE9iy6DGTbXal)!8|>Y5nSn-(}YGWxw65vUPtzQ&htBX$RC6 z&ufT0F!gU!#_t?0#wuflu$i0Q9@k8(f8!k1Y3j}VYDbFo>oakE6Ld~&JN{_1|NQ!G zanoDsbvFU7W|@z_eh8{rsz%9?zmC zB{$xvu(@5htkA#Fr>dJXnTbK;Gh0amhu!ke6MRHP8cx`~<37Q#>rJ$dO7X<=pC1%5 z#xrQhuREIl|Np=H|9>kvuohMD$+Rg^9Aeg7dTYL zSMttjKcDgL_2d z|8@P<{~M1w8NF^$c`t46d@tE))uY17i=SohySu!serWIY;U>Gp=l`9>pO(7o+)t~1 z75_%FZ@>PZ{ZG54?(OF2+amX&erD;u36K6h{?8_=@aNsJ$Dg9ORFv2K{b7Idf8o9x zk4!&TpMLLZ)ApaehI8`%`$1ckKvy!|ShwU;!ET{bhu;=y$Mq~`Yxe(D{d8B^*0x)( zjF_)iEe&}r^SxBEN77~T2cAD+({h7~Ob>=9JKufvG?mTB^TM6w%Zj{j>?z#aShllq zb!^YwqGqP89M2bt@4Wgz#DmSkde&;z^Rc;GnZ9gm<2q87Ro$mHH@*v%{oXap$vL((Oz7^)OF6&# zqG!Ky)_r-+;@q}1>ytA#_*6{)HSz6Fvm3wfTufTdfvtHx5Ls(X+gkvz&eA z0zHOVl_!?O3g2tJaotzGXm@-0#mRS)7x>g~I#7Kev7#o$AZNa;xW@bYo0ZS_NQgYP zla@K}SLtu0_j!S%Q3H?0afbC51(|b%AI4goEWXWK#@itITjYAzXJQD;roY}rnC1!Goum7iavBeK>2<|>$=y5N#zQte0HpL-Ze7!qgn>A05 z=0>};+kW$Hv?7+V&tzD?_&|Z$gPC@zdOLP>Fi+WO@Wg4dfc~M~8r$uvuV=QWG(Y|Q z&UW<$y{X~SGQoMZ^Hj2#A6oErP04O8mlQD;dnKo99C2>aI>Fjg44?jrpKEuQTeRla zzYh&}>uy}TxH!MYqrpeMsO5Q0hj_sm4~--5)$}$!QT|Tuj zrMKQFBTc^Zy5R|KhikiD%AVg7tGsxJ?+$UM3AHgHGJ>v}Wnq)%9yIbRQq*8R^rH6t z*CW|_C+=mxX862&^T)t%XTzHe%XheU$I)7t8t! z3bS(sXRzMfcK`h23o#n!rZ%lV%Avv57kYP-hl88lvXhM0A70l^QL&o=L0Wo+*wp6A*tH++xK+cxL3 zw{ro@tE1qZMNRLDRti*ggPTyT2X=>m#;CwImni;;Tl?c@p<$o*@z*Q@$_p4zHgFve z)SIop`&{?_($?P%e&=T1XA}5bv4+{nB3q_8`IuGz`L`U00{`4UVZVO0=mW9p*^8x5 z7VFup3$VFgBl&A73(K*`7W(U3RqG#D#53^beQtFwnJf5S`)W+@uK8?LxR<+s=bRnEJB~l{o_%y* zeof<%^E2jqX8m7!r1)WN!c3+Udn(R_@GtqMJH5j1&%96nr+hcx-+x|n--1)@mAdU= zGLyJNIkssp6?vk!JZQmgnMX<~&5Zh=jW`cVy~vz?nahOfY>%1JgRBL+UDp{ZFDl3} z&yP~SzCGvjt^n6dTN=~-tM^t-I^MSXsav^8Xxqt&d0+obYKaZssd=Z!c(Hw+QAeDx znWP2(x2-Mz-l;X84eG67+Ekczdv+GH^74WlZ}YX+e=LvA-x=xmEp4~&uCiF)R_4{V zW&ykolTV%9bhbfU;h5ku{>rVfJ&ZqW-Y=_4GYM|GE7A7b%4z>WbJgb#zi!OQtJv9S!r<=fVq^YDJ-o+asRYW(tH%#^U| zi0R8CjQP6urA#xvT%-NEF}9~s=|J~a!`}>@4`VO7-rHNed%?_q$=5hPSnbH4{t)#Y>%1!n#MbW^WCoJcVZv@+57y;bRL8I)#vZNvQ1mL zFNHZpCQT-p|6P)Z$lg_U*Mb^&NWlU>Nd?5b)M&e8Z{cT4L^xKo?uRl{2Qa8_NZ-|4@1MiCK)%TmF zeP(^#eW=>^qHmuA&yP*#wja5}e&c9n-|>vyYoDLqD8Aq(^MQuQgPV2lMxOgM>uur9 zWd;U$o9|wm=(U-5igFC|**ZIho9DZOK9s65Rx*5=Dsyqlp74rhhO((KDf;bc^Buz9 z87iFJWqtS}XW0CrZSzgCRU?(H+j0+V%*!wO9{FLeqv7-YU&We}9ba8i*lDmud+DJ~ z#q72G3cIHS*O)f+?C9tepLcrckIIcPS}pgMYJdiO>B%9Ez`(B!?6W5DQoOG^w z(yi?xdmFiT?NK@t$G!9cbVP%ztXniObc(0&m7}hldk^(gDxKg~-+Fn$)XI~+Tc>(8 zzI*>MDCg_jFzFt%uoW?qJC3Y9y7lPHqmpW!RU5XuCPtMqQ^o{K+|8>}9 zRxK&q$5`#POp`yoMs(?|DZZ04e3Q)op0N4;s!O+Mv8MF$<&pi)D=UJh&Ry^Go>6?0 z#i=>d^%)CROsty5d&BcXTHTib|KJ%CFZqlg*X}Aq)q zXXtmfF}k6yp|&Mkf%_fPoNAUcY>yW^bG>D16Fp;Uz4WPB^rQ@4o5ynfk|zHCy|;fd zrZlHBKlN-*u3LCKM>e3(n`w{6-eZZ&?%aB+d40!81|vOV)oT`KTdF4(^v?F-{MPq& zo9_gf%j@+0cBwu6#n+q!T4wZZqCe;`iOqW+i@dzLk55DRS?Liy7XLXGVt&#BmuK^+ z9AEPK2k)Delhs4_9W#H$^=a2*KFd=UCwH9EX-xVxF*3_$O5>KpCQ4Vb6+g}j4ES#7 zY$?rs)O>ZvzSMmy>mM|-^VCWH{<6YpPfgvXzje1K3Fs@#RGsi=+VXiE{=#=s6J(nA zz6chRNN@1rG~4jzfX|KT{q2`@Qkhc~Bovm}OL{Ehw>%fbHZ6I<^=^F|^#Ha$(_l;H zXX%V-j+?&gZFc$jC0l4?@`UNm>-C>kPc7`bnRc4vn8n$m*~SrUVfsv|*GhBvW;`|u zZizX^Y><6t%ABXIpRz2^iBC%&yuT-xo$ng7sk zpTN>Dv%ZR~5MA8Z*ch%+dMCa4$8Em_VoQ&GssHp}t@KXNl&1BscU66iTQ+I^`l(!r zpRS6%XMOLPbwB6}mxo>m_$Z_Uv3Z~qV?k%A3qFiKp!oD!kK3y7_4!NZB;5&Pn6T;T ztF9o&j~5)K&k4WtRFHX}B6EV*f|=2GZUw9p$~d&HA)8@K%Hy|O4_@W2-+ug7$^;+& z!pawKv$%54Ue(%rY^I#~3zluKwY^0Yo;{4p7CB~WcxiRr(_62Ks`r#t|1qncqt;yT zt7|puTATD^!4Lo3+w`h!gX6mQZ+|g0Ja1mi^P}%pv7B^9sF3-<_hRjr&1L66y=i z91qLgzneM>qd>)fP}_j$YJRUh}7F7>+f%rrP|UuJWE$j-mp zqC<*&Uz)zl-+iz!+@rAgt5f3^*hyhqzyL5ABfpRVSaBB;FZg?C@_!iFc8 zm-n^qes7b?@Mc2K{3fBs{$On6B~!(?2E)|rmFAMV2R=F7`s&PIH9>qr&t{)` zqt`txOnr?{x7*}inC)nkXY|15m1&>Rf?4nHMt^U3TtejUix_dIwb<71vF`fblF^iH|E{me<#zgXr_R>0Q5 zm@d+IGynIl_wfyB)0iH-DPwuTTG7|_;mvl&r!RCK8`U$E|E%37cY25AK7n0&sto61 zBjcC#MXqT`m})J(gsJ=DRMs9rKEs#SUiq4BxVxpYSwZNzxI`acQArJf&Yd{MR+s3O%=@d)V)^A7?-J`TPEm58)-(^_M$&^nuqbGlH)WfcLfo zK}$|VIO6?UK}%W>-@K~DdR(LQO{wT|k($`+ul+T5{K>f}s%W_$JP+8g`;J%RyCO}{ zX?&fH8k;B1Y+rNpU{Ta+mT6~9*yI`$4z0enerIT({>f`B*}gqrTKDy_sfKPh4{g1B zdwIw@od;$dOGS3B-+VCP%IRt0_p6E{@;`7l@O|5I>h9ONM?$RCyx%2dZYA@6XFgcU zb}zLl{0Q1f5%W)yyEtk6={mbYF&kX%zNi9Tzy$_hG5{7 zIN>{?oBo+q`?$GS8cZ&_n|r*pbX)tjZPzZ`ySJ<`c+UKtCmB9IxzSKHS(4Ya(=_$w zW#Pr&ez09*J95S=t=jIX)Z0XvDR1qI3i=&pPRX9Mru_XKEf2M~w}RK&-koKj@3m5M z>o>WlnNu?#Yvj+K8~Dg{gU_L_Z_e~M?fE95Q62fMuOQ*RUZbJs^*i_aSMNz~ciP=2 zZ~eqEj{SS4=LT^oR3WasfKS#Y;nSsTH)qZs-bsw93^Q+@lwwX@ zbmx~z!kM?1*>0%&XQh40Y))aA`9RNqms!L)r#&wM`}Usve($u$iq^mY?j(^bm8!A! zpFS{0X??xLVAg*mIxI>w~;-gQnz z-)~%h>C4viRK@=9lv8Us-!J01ovwNOOSU}!Qo%s3PgScQNO<&po+3L(c2cBLOlnMu z(1ynq8Ve$izr4XSjrEMA&Ut2I#e{cyi^Yx0Ex&2FM|`VGYmfEX$oPcgNK?iXS#}oX zZ`LL8I^Svo{+^V(Br5ynhs4kOcfC9Bzcl@}bHc338q-I{yy6wbYo;<* zEnT?zsKSQsOD~F;kNZv41zqS^$Ly?c_>Qx5>e5%Qmp(7w`m6c+isRzxl_eXz|DM=! zY{!-cea~xWOQTs1teI?b_gX}%c*E>NzqYRCZO9jnDcgR%t!TG`jQlIE;Kh3rb5^)N zmw5L+puaHJwe#2Xr#biY#3!=7+Oh46HuL&ewx_q#-4A_mn9i8JxoI;)?1MQ$`KJ!8 zKFyfgUK(etd96W@!OGfjjf391!x+-CcHGV<2&>-y>)bGmvZ#9MHh^sCoAQ7^UMiI}{fIXkevFy4Q+ z*BW;=-l*TZcpTi{npW*MXH1>4>~ryr9en~@d%bq%7~?j2?@4I zo;&7=Z}@ZMaZ`%WhFX~^&YPMysmC&(XxNmdF}vZZg;Lj(Y}L5g9((HAWzraK9Cr+C z;#JuE_O8~_vi2K|5*FKPC3UKuwrL;QG%aWPrk$tRZgP0AO^d%$$ve$hqV8qwdqIut zyAI*UIUDw-%s#N;=K_PGiEyO&==npJa6v*zq%p{97om~{@5K<`7x>GH1`Uo z&I4KxWWDD#CMrZOy}aWv!-hNY`(;mW@_r*zD4ig4H>GjwUGX1JcD%T@>D)&L3!$9b zX62K+-+T5=*j@1Z)cgM3w^xT0)n4`u=li!P-g>L;dJ&1`Q$P(t@K(OP-GcE&N(rT! zUX4bl4(HjJ?SGpEY95Ai9BuVte6uyAWz*|`Kes}-_N;sTb)`tjzI$6#JkDveZU>)T zzC38c?wC{Y5%FFzF>AJV+y8o1P&qU6&b653N75e5G*8 zmHlgsQk$=pX6G5+*vh@dH#_9go$G<}Y`Y60UtWL9!)&YjDmZNA*16mVnE%WO_sKW> z5WO$8d3p5pshk1szix+q>e23D({RmOHO>2N?Un6Z65eljGW~QgR=w@Z_H#-x^YNB~ zhf3zxrf^?6?YUO(wupq~QJoAg{z_RJzV-4EX)z+}EMDKce@Eok+n@X^LiSu@*yWRY zb)Z5T+A=oPXyH3gFT{w?;#nnFJk?Yy zYl(m7EoR%ZRqr*cpIi3vmU4ZtyuWQ`p>_J+@2$71cbs#WCm7JM$!WKd;4Rlxrtb`v zUQbqT)>=7l?lIMGDX%X+Jh-7WEy%lX_SU~s5{}2EDBKKQ-)_p6b;Mz2t@XC^EuEc) zmM5#r1D*E9dha~Jc7eh0w#N2l=8^)-u2hLD#(z;x@4S9{N$xBEH0!-5Iof9i=*gsb zttg!0xyP>T%LKWH6O!@s(G=I@h{Vj7c+-m2bUseGt)zx;gc!+D#_rA+Qi zp1W6i?14Ck+QnP$POj=Vh1dNx(<^!t$TlPLcp%%9^I1Am*ej08rT&_vxt*u$R3GA-y4yR=T8FF)+oR_l{|r^Nf)oIVz_WQ0|Io!p=P_cY%Hhhm@oY%^*_ zt{jS3QTb3MeS*(@qeHEFGJ;DD10!FR>g=w&-fbt<)skI4`)(#%oAQrM_Iiwu#d*3K zv!)47`uyql&3``cE6?vfbXvY<{{it0tSzhunPS3yu9g|ZXm_GG$89J?Td>5U2e!up6@5|)dV7P0K*B-M4x(7qg39Y_)>{FX`p1^}5x!&4a zdv3b)wR~6OK2Z9Om7`Bj_juvI7YUz#2rl@1{(aUI{nlq6Km868nlk&#(+1o1N59Ai zYt6egFPy7Ge>rHMtH=kpf?Crl?DwAram|>%O5}^4>v~m>bIyj_gB!|X*Xu4l@OoEV zz1P9#uU${Gf$oB6W zlqaw#ac)`kWLAN`(5jc`bJwj7$Tz&;7HRtYW#;DJD@1NLY}lq_5;A?2jP&yDmlI~* zi*t!L{LoeG6K|NjqQUo9Q{lEordG@AZT2%jPMs=gBqg z-en@zmGXKm+lj?&XB>OZhd4@$uay5$|uTnxGex#xV0z)-y%sQ|viA>(9@5P;qX-454f{2UqjT?Tv;7 zKDV|u8`Yj#7HiFVqWY=MZCAm9nu7ga>lvRt)>>~Td_&wB4bWaS3 zd2nn>_OHpDAFL`rx$Jm+#k29#-1K(>I^2`aS21l#u^3`I<$Pwcot^q}(R?!Rk`>RQ>H`uH}(^n;Add&OJFp#;&sKUs-nO_TUtJDqvn z?3%qN@c3!PZK-b(pH(>Reqwd|+s_Sp!so501>P^Y+*_CDwb`^y4EnnI7k|pHKHI%Fe_{08Ag&hi#h{V8pbarAM6Rrx60~9W9Pn)!jPI9TS<7(h zXt!WnU}ZsUrl?bKoTkI>b=RkH9elkjZoXE_h3mV*SSEeeV!1sv;NPMWP@Z`j#?|wg zY0olsHfH4o8r5-!Jye)otEwW|;|gn5Yk9qWl(V;?B5O+JNn5rFTbptmW)x++Sx?Q6 zOBb)rHr`&@+xWJMd2dyt;nPz)Hm>az)w+CaVH%rJg8R-=9>&9Wm#&%psUXdwTzU@E zIjeImpYLWWaJ?`R;&Nb_B6*iZXZ=QQonz(~uir`d{(NhJ{jZsfehxD1yN({1|NHTU zNl$nm6vrR)XMFTJZ@=sD>mj*fYo6<0V2F&F7;1h$Lww^myWAM@S6Qn=f1UkVmMa~8 z{^OY^9xvV-CcMqK=&>TM`PsQ|&kSx{PYtk=sj|8qQgk;USn8Iv_E%Mg#8lm?c~5s0 zgsGwm&t zl3MKLew&O3d$N!F%((qb^Lq4h^+OjfI7k>*+}l^Gb>^Ipl!L$2m2(`kma82<%(C*D zn%DZ5p=w7?AKr6}^RT(3`PJL5%s?(kw1#DAZ`lhLb`0UzuJHfKAiD^RPF?a#g} zpD71FOup%%ajn*8inG!D&MC>q1p{}S%r_Qbo6-2h!d=p$ZnvXRLr=4e>w@XiV|Lf1 zOgSHXZC_>iP3C<`OlDmdWV|=r|Ekw~o8u%?V!Rgb?A*`WWwTg!?%2D{S8vOKnZ-|J zpLZX$?0PISsc?4e$2ks0Nw!QS|H>_yWEM!u-hLWZQq*`vL*a(=j!kio&sbi|Wlpp_ zS;lkx*mKvJrnebiN!(&ha9=*{cn5>ti*q8?lM2`8NAERJuQX)n{^Y>3;P|GGe+;Kz zn(DQK``~uSwS(=C_U+rJav;uoDMPvHRHlbVHCT^UE>-y9b;|kE*0!f23eTrDZGK&q ztH~O7{p+s~F0c6PDrWKQ)`Zv)p*lv$4-PXUlGy&-E`9^v;&fe*5!7Dg(oAw{>Npb$W5lx7(ta)2d_H4(~Ym zMcG)aizRE)TJ>XWhh8MC|JBl%W_kbHpUS+RBT}2bH|@M^V;-lxt|mLVS3&NF>dDzp zr%f^~n&QrG<<$N5`{$6>cV=mR(^uHcyLnlq>+|M&JMy;Lrq6kQyCm_k=k?mAr-{vv zPkv1Ns(yKQk2Vhr^ZDa^?@ccpWtW=itA>VI1KxSi!>!{>i{^?ps{m%U-WKUe60OSY~0Su`huk=X5pi1kTS@FB~0iIPZDkxy*j%rfi3sr`Nw1*I+)w_5M`T9)?tg znLkfz9XuEFL_=tusq;;Sn~Fcrex7hfC?JhfM!&&G^`_iAQ~py9pDz2K^eij*b|qV$ zpH;+KVKbjf_Uvn#yW<$1ywEyc^u{9or>vww_C6!qGm;|ACl3^}BlI;(0P}x7LO-l{N^4&z_XcFz559s)D(V5lwp=YECWIOkcKs=dMLZ-UY9I z^6K5Ss7AYW-)CJlmo5m~|L9Rqv|enelPKM;Uw8ff(K(;Dk>js zZ8qY(Avh_r>Xzx#8_TTsn$Hx_Ul6%?Ax}f$L`lJ~4MFSP3oE$)^jPsbB=77lm-Cx+ zP5HbQ#_@B`5PkJ^!tz+=vm3vFHrUUvy2KEvdhNhQ>r-FU?9csJv3#BZN1fLO9+}lF zzgMbnO^KN@MVjCB)7RTPQyNp8_D0wxZ;**iVNVrWzxiwVj%uF;;gh7y0mQvXkPf5EHq*?R$zsFLy8V*}A^3fBDW{6z#ik)~>I+OJT0~Z6%xi zD~|7xn6&qM#nT58j5RiFT@5&iqjA&Q z=M{63=R~!?!Rt|=#B=I5J29>-1lj~{zpzSWB{r{%NvT=9;$tz5_do$}k;@Qdp> zm>)75bA^$kz04&9NvoA>4xnQNA^ zbuoH0_;y}mo5*B#YUOPyo(EZ?dRKEM@N``I?44>IlCfY^^YGi5GiEMI&1+i8m& zagDibr+dHJ$*o%E#uyjNcKGZ!n@WEv-aq-#druvxnR+aI;xgZv)_YqHGpqEOw+lXV zl|ECx?dt8fV%5G+i;h*s7wo?sz3QpS`nb~Mh~nS63(vee{rYXz%B#N*Na(m_d~9WU zpWL5$cCC3!+pDt+B;NK z-xfAs_KE!ZE!UVS<-O;ngil^$=YJz= zA#b_Ezo18B=Q8=5$DQBuyBEyfT*_J|YqLN#^#;q137}J6AI9!D@qOOz%LzZ0B+RT! ziAi}dBQ8ZXcK*jD*-!qST+VvZ@C5hI2o3*T`(`hBy}4YU;Zr5^li!8ilFX%cHag;# zPM=tJ|7~#8XN;Q?YOiwqM{oaxoWB7T#XRqg6xgP{4F1NF#MnI7?&R2H7gi~p<>pLhLN z@tG(y#|7 zO?>>gDo--hqA%-V`L2q9JyIuk?ycSWt4sOM!#7O3=4IvHI`Z}`-+`VAqaUmdFMXfY z2|i)HP}E-7X)f{Q(z}Oxr7WRmBex}UFb1y>fA_`h)ZXybPb5A1j*Bf;QHf{F`YO}- z*>%tJIsd%`=C?n|W;_kfRuy}%c^!PcHH<57y0@l=pJo_0&nT^lV@Jhyu6vx39ivzTwOE2ec0Gvt5b7wdd*4KUyt9ry+^riaKkI&Q*(!FiaB3JhkTfi=@8evXU<@yiktu zO_*+AFlj?!#Y^X76Yu7n7Yum5vGJ>8bBTlOi{yJn>ksNbJ-Q^5xt_t?Pt)(Cn01>_ zw!*Zaj0XOOA&C?aAJbiZk9*yKbLV6ZUySLwH zeYtk~ogDFH=G=263qu3*7G%CZc)}rk#%;62g!|IR+}RF&yIHvN)Q(pj_fi_>J`cz{ zKmAKq?}km^=NDz3S|a^sXULSifc2(N@9p6`wYsq)=6&BatL8gyt!0cSZRh%ONlCxR zJkwyX+R`u%a()J>O_`>Ojl^O;-^pPF??%-*~u`+k!B_gSBO-yOOA zd)KdPvsvz|Oe$tH$WhvpeWh;a@nddJl=5#|i9RdKx%ww%n&C&O?>7@G{Tg^cD;9&_ z8NQwpr~UPo%Pv#T>l^{c0>c`vubZ3Lf6(ypLcVwRrTb)7daA9tGiNPd`t7 zKW%YMd7h5Q!Z^M&&w2aKw{wfX3*J@gvnOq?P>$1HB?bGBGycw#Qei%k^Lgp?SnV^X zA6Ojvr2M(_y7==Ie_fq!q%8qcIt!c6mZVp9rmcKEcx>+z#O(rcS z>6!Ze2|G``(=qn{Dch8$FoXNBIB$XFw6{%RclG-weX2YyI4StRn#j{-F>i9&_JQtc zQ>+$L>biFC)k6PAC?ZZrBHG&xYkx?=Af zhPUB4o1X{l(AAIIzfUECWzPLguTC9*`p{y%$QQB2A`kSI2YskoJGJS0_FB*to0~cy1-S<1Dk$;~jQ?U;1a?vz=c%hkZhl{QT2z z{2M=AxiV$T-GA3=|2?nY7xQJuT7gs3oVN(<{l53T@4MY|8dCNZT#GoqHhSv%gP)&P zF7Nvv6T}6{iAUCL5#v2sxs;)NC+MPq5XA?2%OACVOlp<()--;nZ+nbE|DCqLD!I7k zmCJs0UC2M)%V(Ip{q}*iuA0}TJPWGgRmn5?vBV_6cIVfpi8&jbA9(Y>mFQc!K>Ekp z&`Prp-u{K5H{H%^eiM3K>a|dfb5>A>15bmpf%noQ-)st+Ea#bI&55dNGS4^3Fngf3 zbk_4u?tP`F{xy6xIlVOPn&CQ~RqJ$uJ*FRvmh4!+|L?R7av#hbT!a_bYH8-@YHTmw zs>Lbov1aX!B~M--;x>vYy=OenJb9)@D$9)1o4YU0&i}P1AUwMuGIr^Qb>FVBF+bUN z;bxwL{gvePTXlQ*zqcOzH?QEft~qB_;hDzolX|zmF8w6;+4#lV71N#l1;X9Ew|ec{ z9hLp|`NfO_HO+NtJHG7kQ=PQ^kV_u%4%xp~?_9dUT^EPQ-UT&VZS~%7 zZ7ApMvsm}hs#<2Bg2wdMJUfED&QF)$qh9-M-?!3jEvt%totFMGZ`!SD$NA<5bDEw8 zHmCkBm^nux_`PB6$=%Plam_27_|kQrvBI&`d+7}|1^@FLKOL;y{dR^d*XN>)d&`8f zd%J^fZq={VnX*<|NB9-1!DEg0_qShPFvBF9IgvSaYN)*Zs*>zU>mIL3@mj~27L)p5 z#**yzC&{}S7JiXZZ&1(|THl!L=CrU{4XykC(D&fz%N{6~Ihu06@6i->a`_1WA%hR8?e`c85SS+&O_rCA@ zUQeCS^Tu+;kz3bp9{>3Hw@>T-+uFJfA{DNN0jCphD9$`DWO=w|nhQhU@1427^_x<5 z^U5%vZ&-3Jzw4a#@2M4gPxd|DGv|IE>onP*>2^%3KJ2^rbl)77lizH_i*=ssAM-q? z&AM-TFjva@R%nI{ch-EM>sBeTZ_1B3`wAW&`jh)WEPUoy8y4jQq6hvwV7LFl0;g5jzGVXUg4sF~fq47}fdieCyonPaER;9J4G!OMKT_<^8JJPu{sOi!k&^>nACovJEqvgX-vi|4{DsXgas z2KpV)($o3A-q2#P%FN$PHxH;^c>Um>O8NBP5BSz^eBODO>&wGe*TSaWc)UZ}Z-Ka< z`8%Vf=Zn_4SDEB>#XVm4%*)!G@2ysAs z^AkVSzDj?{&tG@>wd#d#2K@xdtJgx>kNuLGy5)1#igaUdm+0mr%YeN>Ad&suT6;? z*8Aoe8=Rdkw&R=Em%J61s*+1rdObB2JAKdlpZo=R-+UtjAARHaRTqw*`OnNSd(xj{ zRfjH}3hg_Wt*G+0?9|okLR@9Ly*7wGNS!rnj)2AP>^D!ZS)Bg;y=s!F=k+zhw~qcg z__zAdLgwmczb8q`yC#Si?5P$%d40Fd$62M!sZDzro=iU8zv9WPDX)Xod8YISB<+2m zF@NXdmPP}E8k0MPpIT&{51Bq*u*dx7_l+qwQw|$tUSIy^5K{!(gvG0Q46Ie=3#u?5 zXQ>u^WcpqueL~M{nRE^2(|l*J<`h4`k8N+u1r!B>1xJNA8b8C8G^{emIs;-{fr<WIu@Bbx|>_ zxbLyhg0lxAyqlvPw;Wu%;NrQ*-^+i@ZBM>^u8v_wGGj__KhrM8S8pm5B-wvFo1M4m z@$_dZ;!dBYx)|JA6?)Hn?+l^uKW+v6UKErtCrFXU{poDX*^Irr2pu>pWLLK_ucJ23I4s?aXTaaq0O4$O4bPG zKEWF9QcVxGJ@y|v{af1QsyzD46QsTec7Fc%eSiEr(+ARbdcVW>r>UgKp0sN}e;+7wx?b@w zr~7xsy*H0dKkxfc-h4`<@9~Tu66?#CHoV>ycOTR;&OA9mW@^*zr(ueqd<|M5!uTn- zOfe))+`U1+fW2j#S(wxh3x&t0n4EgjnOYbYR5f2+Ce@yJXro4@8V}d>sX{q2_pFZT z-85vW3jB0NLhV-<<0ezK+uTA>4hi#9)Y;ZENA`KsqT zk7sXse(~-(oos~}-?yl&+5A1l`y|`$|5nxU*KZh3{Z)C1d9A*8*0vY_85nc+@SQt6 zolRxN{e8C@ZYS*Cl~a3TQ|8u#MxNIvH-6CDH<5kTa^C}>TKLe#!@pThSe(4QEw8lV zp6&9B0qy*6rqAAU{F>*EWly96mZkqZux~Hh$uFA1pPqVNZ!l``$^UecXBuOw({7I) zYBzr!`MCJrM4`H1OysUwf)_yH3Gs*U6?# z*~4ZBtb*Cje$hKVF)%Lg?F1e6n-69r=<_o$SIKsW-ubFzdtzQot)R;7k21?2`^s4J zpDjFDxb4c{qJlNWd!;7SRL|+%!?07@eC_u8;>^hkGaB>`NUZ2hz41l$wb?qumsh#Z zY1JOfnckg~WIaFF%6y&S^C$bZz59F4VblEkr`PV?|I_Q~nd!k?3Hq#CSBLK|-gAL_ zFNepr(vWIcI=b#V*HRKa`1c6uMh3^YxaA8G@IZf`BB~e z=gG>Cktg?Y9B7@uBfwZOMecZR%}>wOUVD7y4lVUscX6r0PiOgG6TCKX=YNi1cz5PZ zkKFv<;1if1h#J(sTspnP=J$%Cqy-Ww>Aea<9Ed~4@#?EnsSY4foQau#1qrgb7iGoOzQTiGeWIg>{&pe2IF@@%i2d3kSo!$KUEsnSFit=j;h*e#<%^{dUIp z)Y9H~oex%`Gtvr9SHIYMSCsACm!|t!8(ycLwb)XVXmI87n$I8p70EG3ZWk|~udrFK zxo&|(LaNV|-0eofSL^t`Rhhl2{Bb5_UqQkV@$bv^r9T|qm?mZ_@ZLVW{O;^Gdz0@O z{pYV(w?}NjjAEWlk?`Jq77BBEe}6P)zM^^e8TSM=>+jEcx3~6Y=kqT8_Cs*m&% zwV$)|@s5O<+#QdnB*|OKyt689SFmKOm}|!>P%M+Yphni?nCY@Tv+SN6dXjx;&$&5j zZ*K{&FP!$?)M6RSZFd(-lgsP>9BBQ`a%xGe@P}48BaXVq%KTX_BAwS6jKrl67*2Sz z;f?W>#}yh*dl;TYwDFoSpYb<(b#mGPL%*Vu$%_j*3n%@&^KoN<;3Ur9pUwv-%q+5; zwBFLr>I6&qQ+JoWcOOVL^nH*~lq_KDdl`6bS8nn2nO|956Xy9JS+-xY;Vi>V<^y|D ztPhpMeNk~w=sW)7uT0-fIYrBFw(g78JI8VCm82F{yg*Z zr22{MQUCgwzWnJuZ2RovBfDQKI9aq?QerY>(q*z(BA5?+tgHNZ=ZEz1pOt-cwD-#! zJj>@k-}$}mvx~>M`NrSkHlMrCv~NjA|M|~dzwM%@HmwCWnfDyca80u4Ud+|k<( z%B_qW9gH?`30&Ikt*^QF$c}AO?p_O>DmfufY{}Z)wOj8v{R+}t&1NPUeKuV3^`PNMtcajhEI_O`T-RR!n z|9#`}#oNWwrwAoit!UI=kiCFC;rPeBs&{t1QnP&EpwQr6X*S`!C4+&Svz~e0^2V5@ zj&cfICixN1`#t#$^t2bmR6H!*X}Qv3)s%+n`cGAR#aHL;3tVtUoN3CW$vJm#`EW$# zO31zlS|K*!+<+ zuy?`COKE9x!t0K`&dq&LnA($-(7z0q@kFFw1Khy%uBD7+j$yz zJ6^h~9eMrZqO;eQWml@^I~pxs@W^7tU$y!3ee6Fae$~7@x#r1-hXuzy=TGNhaCbOn z$u=*t>itK_-36Z}WsCft%6gJ1Wt*jjeot#rfZh5n*$ZyOK53tlS6g3kLE*>5cH2GO zf6oLj+cWF-j?)Z9GJ;1dG#o6s0?KSt#FORTxXv>Dd-8zcxlIQwi|5ozbKdBe{KIrm zQXswIjMeo@80_}yPoN!8^|#Jd~{n*!L2}I!bFwx4ie42Pz5f%JRbTVwP;G0{w34jqxYMjhrw5^CL5Dd(ig(1i9P}3S z6usDyyK%ywkNx#AuLYY5dtWm4ZU6a)$>Z~O#@igbTfH2O^gfE$JrvK9-2O50zQ|a`Lap&2g{1ahQ2UlP2aZ7ekvuji8UcNqIxyMj%yECf3RHe zsB@e0Y|@f5d*Y61FgDq;xj5)5cQLrigfi;yJ;`?emF>FqJhI;;94z1I^XccUYgpGA zdHm_D%WI1A9IiRU^xwWK!&Yt05*56-w#dIRT_*q6Bu&m|7BSg(;tog_Fdr#QDzvxc zn=X>kz4y8)+wVPgziO>>e!pcE?|6N!%Jb{emd&TD4;LR5-T!l$^qZae8@`|QKGpc- z*Q`|mp^*zKPkd4OUcUW>H{*Y$g<3uQ-*0_hx%qd_mES>|8uc}<-TK`Syg$l*`&YJo z2MU92Kd(If^$z3NZEB~UtS+rjnE%0a9}A;bxb&8y`iAMxIbU2lzs9JTIeMSNfv35T zo~w)BemGO#{>LL0kGS;nj4z&^=HB;*VO#Xujn!X|y6@d*qi8s%^q)NAr7s!bIg$Du zY!%vXY7aOrvzhn5+Q!bl`QJLXM!Wb^7ldt1v&0wPUHd9{xy-&*O&hiv{k`vM!}oZ> zw*2#MPHzj&-jpwN+S4a%nUGLpAY-+`f8{lf0K2+38?H5`$|TQ8aoM?*z2f5bnt=K} zkw#*meXUA+%G?W*K2QIgU?G-&g(ml>xjN6-99~Tb@)xa zj)v6xZVRS=*I+)?Qa-Wb?ZQ}ojjO*Ho1b%>ENn9}p3In5KCN)>=7|CPx9ZZgq!pM? z@tsyl`aMJA*A&Jl%P&mkJEjt2pL>B@LD^3KhFZco(8U8YKTYtdmwnA$JawXaBJ=tK z26>yOXYALtNq_xCNgp&>T391;oZ+zGG{zJL3#&7M+!uQGod0>WTf13`j z_u6FaQ8uB@@AgjF>baI;8+E_#u3al~H+EVaA1{wSgYovg^DCOaF`q58J{@tBDT8am z|N3wLHe0WI9re97x6|>Aq@)59W7Eu2lT@|YwV&%mZc?eXT>E6}x0}D`)aGSxzk7b; z{_MN|UN2@dh?G-cT;$LYvbW;aoEbaQ4*fX4{JULC)bZ-$TTDMZQ)_3%?a5{C{{X6L%<{{0W*|*M2&Tf3`w}N&3_bA-Elni>=JUgrUCMdQMxFov5ozZqAHmTB8e-fzye{n>^l z|HllMjS?<>l8O3%{LJV7&;I|J|9^7*?Ds!(_)oNiY(KPCcJqr_ueh?Cixz61C@r=2 z_*U4!&3ohT+xpP!p7%H=wa&M`|J7otLg~YQ(-(>5^p^Zz&3b72<@F}JRz($9=WJyt zpCQF^CoxN)&Rp4Y7sJHY$B(keD447cU;et%=5XTt%1>2?`ajNQT;9y@eCN3|r*FlFgv8yuY?vm*q#xbECwpi9fn3{wpR*fM4)8uIk(|0f_O*6QY2CEq zUAL;kj=pHfI=5V}w@?0Qf&6<-DYi2qXZMLrnDN(2eSWO}~2J z@f<(jIj3u$usoG$I^%shp=6=Cwei$C>?-kPvMsg8OU@aW-!YOYZru~(pLlOq@1*>MW5Rd^IBbQ@11Hj z?N#w-vY&qcrR%iEmEp?1$-+~ZCwX7Z4&Br}n`eSO%PGc_PV4X2f1f+4`Om}OE7w%~ zJy?B{R$%yvt!O zh12d~S6*vByk46T_O)v7gz0*VvW~uv`ugklnlj#|)`ZvYk{bX21fTR}JN0kfU5BfB zi+Hl<6_rjEo|Zf_>T6Ws`Zru!vQIAcZ`zRkYkkArdjAP}d7EBc7oD`%SzCZP<>B?4 z{hxFf#4MY-Zt<_XuB}=o;?s9DY}o(5oFSVvHLrMW*Wdji$NDN0Ztht4b=Sh1p#Z@o=G0xd^D78{nFpdAN@L|sOKPk z`PYRx=L&SB9@7kgod}2H9dfbalSo^Pb`ve|= zt%nb6ND5Kv%8EakAgFO||89Ypt%54nW(-<$qVE}Zto{7wzQI|W2ikX{o=mBfiAu=c z?-21&@A$>ml;12%uN9y9mV8U$$i=q`k}0?Q-*Rog);4wXoBE4y6>eI7u0QtgZM5Ad zx8FZhSFlDY+e&0Peq4~(_(V`A->+F=&%~B>T<-e>C!BaIJgM5$q4~GglBhyW#f`r{ zgf8HE(96EV_VbUY4C_z7e9;)_m(!NSUUP3xnWo~j&&PfJmK!O!uUjb)J7Jqd!fC@j zm-r{M?RnsDfAFQl@oyGa6K2bF|G9FyGUxf_g)C9#%-2E>J>$`~V>NS}>NevePcB~u z^QZj1|87S-&&qrJvO%kI%X!+jumUV74{%Oc?r}&cS>sJTKTa)5$`d*P;rqgUYi}c=k?pV zbw=tx7dK=qSW_^);I+;z(NEhC#WqCV*jhK)zNfA8P%Kv^W9nU(l`XTUuCxEW<-4!_ z6Dgh7a$F*-^LVG#|2q7>y8g$%-DiB+PAvQXrTx8dUuzuqLA{@+?yG8quMOR^Ouo*; zf$g~c-yM7>S-ZS9u4_p-SH!UCV|`!?t4w>>;y=&r3|@y@HtdXN{hfcYLMwE=ccT7= zKk~Kik{rvcWt=Tf9QBNwuD3|2Pg~>o2B)I8(L2AbU&Ca^E@=?{{YO2khV=jX|K;-2 z9_N3ESt#|R>1Ipn=igo$?^d^D+~+zcRrS*B`HtLw=kNW0|Nr-YP7S>ev4=OdCh*%` z{vO4-e}U=2?JYsq1F|o33$&NqWyxw>_w@Ja!YoI&~3&*S}8$ zWdG*voohLH0dI(W-H(OKq-)fF#$TG{x1D<;+cDO6*YCc+ooRe}i^I1#l)ACRe8QQ# zQ?)M5DmQ29kvbZ?{6>4k+bvw%%axC>Y;*q`&0*GH#&Ye><5xz^fr;1W zE?~ZNsBPz+Llxfg``v|Fc5Z%I$F9Ou^X^5kxwoPIhUKS>GHeRpc$o0;r&O%3ZA!ac zXR{#UYu<#DzR$04>9X}MFfQJ>bLH~>qx<^JrK4sGE-2|cSfI&KW}z5&?{0-z!QB5p zh1~9zpJJR}x5!xi&mkYC$6gJK1CsLId+xVC5Wdi)Ku2V*vCj4x(KVI{^@eTQ-iEc$ zV#K0$3w+)r^u4iNDC+z?DgP7}%ig?Ra>qP!hW0zj<0Z=PSS?@6tyZ`8W=I?#)PtJbrx8Ek^ui9%NueePQ zkIV0w?Ye8-^8N=Jz}5Z>gF~sua)Id?UO^`_b2{)8~sWw^WF% z*m@{d%D6#NL*3!|4|hY|1}TT{+VQ8^KfCS=+x<+5d;2qs|1Y1*7tJ}a=}@f7onQX; z{}%?ny!Ge3vA(3j`sPpH4flrZJ$LH5{XfOn)PO(XidP$UzSjy*-|1BJ)_Lc*#cO7S zi%;3f6Z$pwk?rU8wW11a2VOVmghb1qc3O4N=x@B?yoNQeN;wRgpE@S2L_@6J>Zdwfev#;fKM)@Mv7=RCVxI&o!Np!%M9c7aZ- z{il0fHFc3XGw&U<(ev$L2iQ(6*x^*fIo)nX!3-7@)#<#``zjobN zdg{wHg-Ye+6~=ufPDTHB%0}9`fRO(QDu0;*=u_ePkdv{ z6Q8qt)q~xlH|Nbs5p?+{zH(md?^#V;$yk?3lE=+L+<>&EFUCj%J_Zj;Irsu}9zSEl^Js%^jmA#e6L#b`$z9pmi1Q~_P*@gXfsXckw`*)YN_RKF};O58Sf~VID~!8 zea)1TxaUw_XnWnKi`ty`wywuaSL2`W{A}2K_|*Jm*?-3s?uE@n?60@{l2L|H-Am;w?FZ3VsG&@&xd;T%_;FKv~|+AzAnFi za^1pxKi)h(6U=rpzMgf4J>QMLCW?_ezFud%_+W>~*I!%Wd3S%A8}s1D<)Eil3X#`E zBi~vjRIYtgs?lBkb$9Ep$Nu(T{(aK7Ut21ysvh}0fMwSIAD{az*Br>_ohJHK>#y$j#GU+S zK26g$xvu!Ybj^Y@vg;m;F7SOU60W}UiSv4K&efaNzS~^8eyNe^_w8k`L+;%B`r$?J z@&4%_XRudgZx2|WEaSr*`!1{X3D+#GgmjB!-Kux()qgKI@4q*tIoA1f{&KM$_p%{9wCi^RxMRwlbrW(uH)`c& zXWuJh^${(}IrwpINMnU^VZCS(%fqaY67HIx@#*vUr{1smd^W0a{VK5uy<4_lZCW!? zP9|4s(rR%3N})Ug)W7Pyd_uFug?@!(5)q0xdDYt)PkLXojFvZ|?@WmNgi3ct- zrfy~oJ8%Cx;{D6x>(v<|-SRXd0)b?^4c>3dS~D6 zn~-=SdGFGl8(9((Z%)3bU>34>)@8mA>%SDAbLA?CtabSC@zKoV>zBTs7n^U-a?U&m%=yYEx1>|-oeNsYzeo>^$*#VC*L2nd3f#pp3h-SpKj;> z%{vrb8&exLu3Na{WIU_I zy~6(6?)G1&_p=E6SN%Nsztjhw1^;au!p#E|c82WMdw6Z@r_#3A>itJH z>^gOGe-Y2YP3sozxtujU@ZQ{_83zq3%tU7KcAeg0r_r8eQR-A=a-*d%y*!BV{8eAJ zbFtfZI(?3MxSr)%^g~I3@C3aHfA)9XzBB#lo7q|!e6yHlH*FYhYgoy7PrE#}c)nY_C};JgDK?)VzFigoSowPHN^uCW(#Gqq0# zaUXNLbvujkn#cG3+jvgK@*aZJIU(W&+gH!*47R;%A#1tD)~+&5-}>+{yD%GfL94|M zMt=s$4>9|#wapVI3*_rPpWGkk6)r9D^1VdL%UvFZ znhPH^=yDgce&IZQ?dfEth(nX-SLyuw$-1C9?dW0$=?9Oqe&^otxS*3C=25Xaackt& ztm|_wzBye{rR3-rs8cYfL54T@xzjm4@yHb$^=30H{>)(DXuQLWZ-S`dXX(xBpIfkt zKfbZ^a96}x|M{LTz8XHfbSmaqp7nioe;L2_(pPsnZ^Rc~+qq?b<)^H&>!Ej^wa$CD zDNEctxKQRCZ%25gl)>sGy;lbe_y4)Q{E{l$9#xZgyeP!9&O5c6X>aw*K*Q+_t9J|lw@Jud! zdH~}|hMAk^Z1|IRp!AGz(b^92@W>se>5&%OHoWFJ-S<*KQl|d*S8+oX*WF%IvoEPm zG1wk;Wwlcg-~KSeXw^6Qn_ii!N8Udf@+(MhLrfd%l+{`a%;`t>hV0jyx}lUeG;wFh zKDIM5PwM})mruCxs&2*CcrU-r200IS+FnoC)c^FyZm}P$uC6~=*p~eLezxeO-3!h{ zvK>%}RDJXR@BfAy3?UQl%wJcZdP;9e(yW5FERX*Gdw=i0?BxTwyUs6sWwze2SSNW- zcFf^5+6v(b?+z7)GCsdsIx$-=&+1^UhtAKVtWzA<7v>pX|C-^D+4%JG$32Ce-r@l} z=SKL|zuh*wK}Nu)Ozob%%=5YxrqitsuW>A9*p!sOc~&ujCnoo`U!JbOeU1syc^?#R zMD6dpUXcC!UXORq&ud@SX$fpuP`dpJ)Aj1LVq4x#i(;tOztVJN?-IQWdEvSY_qw7C z%r4yv=icVF%YLh_$GR-WcLrBmZzry1-5V_$K3RK>xB5Dna=wx#XMvC|E8nz?+_gzH zUq1XRsX91m-OMlgHj=%X9~d8beSNYxGB#rC)9LXQMh~;~4v3i)E(qQA%treO>zspn zADGYdF)PIF-ZN#xx)oP0|J`$WjhXCg&hw=)MKO%>CoUZ~S{^dpU6}FDf$+e!=5cju zedS8U%PprJ6aL5iB`00S(f(R*ZE;WNnz-0`yvlD4O7E>7bKB)D zC&+U@5#;6;4|~hZ62NlIsVV%?jU5XrZM+Y4Kd%;lyq#NL{8WsV-~1DWJ1;KxpL**4 zr<0|Vzx?t(|0V3%@yn)c|Li1UEbQmW^Um3R=lzkD4KFrV-gDt-$ou{Ln7;mzuUryO z{g`9rb!D2X87ywUTU=OIV{>!+`|F&0*X=HTxwz@InYmV z*5oqXmJ{6~0TI2?HqxilCa&LMFLdVdy^{YOds6@}t-Y4}~T;J#T#yM|fyFM$W zL?3bde&_d!2R|%6?P|OfZ)7g1qiwRt!gFQWU#|n3@)pLu-TUuXHs|S^vzod$A!m?Ky<%v5(_Di&)BgXn|0L@fx$oR@Mzl}3>+#&w8B^DPem`k_ z%(M0TwX^L{hyIFqruBcl9nXL9hIiJdS;Dk6#GmgBIlQhRn#sIlyBolrR34>kaJO4(PkZ}H zF@gJjx&qRf?^mCL~>roF`)*npNF1re)REYLsG&b1xRW@^YwbmKj-}NX)vFjVz=AolKJO| ze|o<|Cvb0IPC5Qwq9u#D=;wCMXvVm%37XHQ9+z35HvPJx$`jo?vHuFgoBKEl`@X-e z);K@0_|1-kOE=_w;E!-r*)Ac&6t-?%)^&#|yR}??rOk=nxkIa#d;a&?wQCsG$i(`6 ze#-r+m3bGl&fhZ2TU#}*=N!;!7rPS2dBY^$ZqvH;GR^!V>l)Wh5qtJ%4(kE!c~7NI z>9X%-kk}&6<6&D;5U)P}XG+u0*21pv&O;!6{Asg4tnkjXfUsG~t!KaG%Yt2K} z*QqY}v9zSWH7worTzLFRfj2=vck!QEe=?Sj)qwl3SRL;)%X7yF@)8XUdOJ(x!=%k~)_qE6JQH7g@AC4ZvcF%hito*5>Zt#J_xj%V_3P_X z4(I>gdGh|z54%ey?>xG!{`=kSoTqN~Z|b@+_uayM=ew>ief3qIx$o=h7{{Oe*$ejY z9S;?qWO+LKug3aPLD$!!8?qDi?>dVL{EP1U-~a!gJCo7OxL@J#m`mInZtU4Q;Y~%o zSb^UAS8uFd$rnxAd6@B};S&jI_I1xhH~f9ya_g1S?EDCaYS~T3Hr5MvL<{J&E9`12 z)=8dyq;^}}_kXu|WuJ(!e`$3B@t;qj?|Z23olvK>-P*hx)~3f_vATD5#n-+&``3S&{AS1Q%d+|ZrrG_G zE_=Sc#C(E}Zo*w(#IW?4cT=Jqc1^#!YkIktuEV=ktVzmu<+B)XcvQzbw?0|rxI=au z8)JDy*1`98Jwj6r_UJcQ%62yYX1HM(H{JA7=|* zMcDP5_eDp1|MDcFY5w2sQbFa5Z;Ni(xx;4u(en;V0-meO?VYuA$EWPM*$iiYKHao_ zozAgO#g*&U#Yerd{oC>=l)G^5Iq?Vf_V;#+FzB4Q#oiozoL{wqDRAm){i9!>2>qTr z`MIA8L-YHm5$7i)pL3kYoe}yp%5d|f$+2I4oYm%hyY6fLyh@w%`*Wwh+qL7vbK#7q zO5GAO=4phkk1fA0)Np&=g*rX6hI9YcIu_(PNBoJ_-WJ))$!DR0-cPY;h2?)mo0JMwPS!*$o=YAt`e)!81fa9;O& z!5l6Fwo^AvLz;?KmaY9%y0%PLB$~r4;-3O{xv0ax33e6hzyDk=|NOqwO5th0?>cdA zTsL9PU8l97yZ%``pQyF?S76uyZW-ouzfb*)$L;^Gm}IK(Pm5)acX+_AHl`DijMfJ$ z_Eu}uUw^l7)2*-absPczl6ReIkW`S?k98^RV($1oAxB0)n*GR8Pqt%*^A6-h1-?~V z6>>D}$!d$U3wAIRoXiY+E2VOs>jvjZ&htlI^(;?6egCd{%kOh~cfJ0)?>gbM>3{kG z0|BvG3nl z-D^M5taa>oMPck|BhJf)e2aFTEwz4NdC;=K*wJcP<437gbFXf6p85Jr;=6L~P}#ei z-sd_Ly~!_#db@e2_W#)q8ezGAG>&vTachcFPtfeSi7eNGi&q_qMsX!x7VK zJD3!95sQWiFqhsmfeHVmJ z@zm6ooG^IW5d9(Icfhj^T_yEpGu&x_%4nCDS`on3I%(eoveOLs&)V?FQtY~>;6MuVt?N$k1=Mw9b&-# zbAf$#>Cv4}0@fchy>j)klN;Y0KMlJ-C-(ixc*xxGn(^9SyV$aw_ad+8)Xo09uzKaB z{yL?*1@abml&_t)+wj<~RQIXL_0L>w=jYi;I(!HS;}L)KZeQ`cxVo1|8=iz$<^O;8 zbxqM)gX__TXZ}r&uT)(qVes17QZ~imj<`eE%U^4^*G*q_bzSdi-)YOw1hSoInBn~A zXS)3Nef%f>zT$4(Wp{GnzRAKZ!d>3w0rIshi?|imm-BADXFFxp^-q($%L9)3s@2!e zuT`Dy6c>{k>$tKam!ofY>)utXR`bm8=GeC9$^6TKVOP2r|5^TH_Y*C4j^h(VKD;Uu zoOJ=F{5T z8G0r0MYH~Y|Nqy%`v3d?pZ8y5u;gwydg1;t&mG%pp0GUK=d=DmjMGN$5b3ahcXo$& zuT*B7Hu>>AZgpl2?lo!-&)m;F5~&UkZ(!T&-Y4>Wdz)wUvkS`0rrJDXdA83vx^bsd zW^4Ly&4t(JJc&-+TRLa<#N3kq+t$Ck|D>X(V9jw0i~nW2gb(nWoih*Ojw<(tuM23p zow$;9!S~5g-#_K8JXBPEOJPdymh!7jnmQ>X945$`!=P z*@tF}3O=60#s6&DDc*gRy_>6+e!r4Domok~o9*FEhUbsuZmCbd@hft#)dF9Mbu!tf zPqebuF4!DmH?Q+;41d8Kzv&UCc^lY&`5oEUI!ilgY4)NpN>MgtHSQEggeKXmRy@ww#}1Blp}j z<9pH>`S-Sek9=jxN_-OhSiL$t*?QOKpp$n>pJ`~znb&>0_9uD2XQ83Iz=2O6_X(GM zI&$&ePKM{xRZ?E{+Dqf|(SAr|!n&_44_j_ix?y)%Y{>yKFwj;-$%GZCmXZ=#+ zwCADeyg%>(~1)>xHdIpZQ0*4u}@5=9Db~3NO^djt1PuVVE&YUlf1(N@tItC=z<+3 zf>SRuO?jE0{a5S1={>{x?(!tgy=+HfQW@qrUrxUB#j5|6MSK0Skf-`V%~@^@=as8PD7znpoJ`mskp?aP;$ z+gi$#=dml&a>?xWmy0Plbt=1U+o}!tp%*87< zfBO9BC(F7u_hc^I&2q_gSNFTaRq$kSpMe5vLF6QvHIjRWApk9zCea$#au}8M6>u=MY;A6IxqshlFP(A| zsgn+|;r^1U0?%hBpY0S=njh=W`k^^}=cV&UY#;8rvuD?wb^CLRX0KH@i8>r6TJrAS z)zF{EKCKrwUVp1y@^--0UDbI{4{5WoZMz$M=+E-y$Cw}aKl%17O|5GEzE45#?{2^M zqMY^Xqo}2?gATl2%5>`Qh1cKj|BNl;|N60g>7%diT*a&ks~i5tIed`L-y?YVlB)>& z%pE7UMr&x*Y99X;dF1upl4rKsV>;)wF}pl)X~T7X#=VDD*Ly{<9gqC^Yq>o0 ztmK{c5zmgl@s>3C|9t=dz4Cdn3P0c1Gavfp_iwt9?Xk|wYaW>v{5xL%C;FMj@92s8 zk7L({o_xn(ytJBU*6+$Q|2a;4mHQ?C_uo`)h3fNv%N?{ELPd95oq1{Xy*+i$p3|*q z;ThllFK){UpZe<7{}UT>4@Wz1;C3m0zy0pDixuMYEo)bmKiYAEPrl9X`!c3U{&Own zDPEL$c9QdZy-)wc&SZD)oNo&!%Ka*340sS7^Wu{3l5+o=^QM${WqUk?qv9 zkL9l|%#}Y_TdcLZ+;`ZnH9lW-!r${*J1Et?e3*wZ|<#)I#6l9 zy43!C=vIc@C3_c(E$Q8|`&Ve|6G5H(am^d5w|lWGNl8a8NIhT}z|$#R>ChMLu*z*p zQbYo4hooH9lZPeRowqgBXKtRMxbMzUhNt3npDV1+a}}Qqx7+YOoO8ER&r^c$m{O-b7*mEfc1T+)uR6&m08z+npm5_@O@5|yxsxp197o>uA84!Feg5| zx{lRd(%|}>wBt+tb84gPB|qrr$Lei+t#~Esp`o+h{(o!LkM|w_vGU%Lo5GQjF-sct zPTw&W7gNi#+^)pfC(HIKIs5nJQt_Sb=jK>VJbXRA*7ES`)+pv@=5f_azXv&dnw`Jr zTD9)6&|Q8JeGBhAEx%u9?7aRyx5u>obB^vxnsb+AQK-E%6BGoBKi^i)gx+1KPA@u`Iua`t># z`X`v7i1Q%ZNv`V91h(T1GdAmp|CIkP`F=-T{i&@?+kQ&coeh0=_~WeIci5l3Nw)kQ z`7he(Q~h7&4^{lrwQfF;U|>#T-NTThDe&!mcI)0V?AzO7(|7)ki*J9n>W12mzPIWM zxBc1Y?f!lz?{xdh&5Xxhx%TwW<(7C?e!k?=UcE_=DjYt$88LrD=0mDvopr{?nbd0X@+GrxJ3 z&$3(kWPXP4^04GTc~_aPL8lfn?&@w`P`)~=@mceNYkzC@uVBqle!DK}fZ3(J*VnTt z?p$^I$4$bY4`KS z)e=U>)rWlMq)pwpnd6G^^(u4b39W9-_wT3d_!!hA-yZt^pp4tXi`On6e=lsV-xhXR z_L*N(-hyog;up%7T3q-yZ|*e~5XHN{OlIW{HaiW57{4_J8K>1U(kd)2 z*j=sGTDSZ)`>*)ghbR9qD2o3{<8jnymvV{Dx0%MgS|)4ZubZmDGR+gJ`L@|@Jh<`o z`@>zYfB#rK{Zqs_|GDR~&wiY4ZF~LwwpG=6vdbSA#To5#Y_=*XsMi!Tm;cTZe#?+! zwOHI)*L8{4xGEascAhw}BW(A%bqhCL`l`)%Vg0wSQ4V?{`$50eD!@6p89_`m+#fL z|8H{l;r;sGp@%;4@Bg2+wn03C?YzRw#c$rfQPcY87vYznw_wc<@xmF7pZos?ybiki zi=S~z{hR->36c!g>!w`qsy=EIleS4FVBLW=`KhaRo<6kUspkLe0~-x;nNEsM@Vv2g zKexm5e^YlJKd_@rGgRgo!wWtG@xOcd&;Fm7z|-;H-C>Q_bqDk1twMc|_x|mVxb{i4 z&xtep|*4c`EtGRAmdpN7emT~Hxhyyc@ z?qHhHmugpd;HGHavx@h(Ue&z!;$UFPxu78*y29YalLb-Re@nM%?%x@`!8_6L_y!aE zxs}^u67Kp>z2!W6oH(C zKlu#ijWdg5+Ft6hJ2Zzqj%1D2E8?)29kyU6hl;eC#q(XSKYuwJb5K%5x+(s)+611S z)?DuMW^o}3w{~5rm7iW-*ZBHf?RN2!Hy;+3bTaCDgstIIN#9Yrr~mvMEqQ(8^h%p~ zJ1fkq^=HrHD_WypE~(O-T2TAy$VQP3c6Cn**5&`Ql8}$k|MS#2q$j;4@L&9nYL9Kb zR`bqn`)^)Yv$WyHwQZ{%BD1YZr4Lyz6x;A_S=57F(piqL^H#DREDz$=k$2hp?j^fx zY{%`4Uml0UxgWXRiu}8Z^_Xty!7}wLxjwwnpb;Rphvl1@w$91c9CJe|DO%>0FlTjxlnmGEYilocpSPWP;q1=0 za=$kmH8tBK_u$`@nm0dJ>O>rUEA~#uJ|bhw%R5DU{5yp8cw%<0d7QlbQ}aRL>*1GF z>;4?`diE}^yYTtx{J1&6OP047pMJ`=)FIf>WaqKX8+#_CJ-o1>RMX-5d-i(?;TMe; zo?S4t`)$77`eeqJS~=YL?E9S7wr*MOEOTL&<=H};bt@l5d|KIhyZBAx=KCi# zJ9XXZ<<93z8*ZdHd^mb$eb@=#(08pfH}7rDteoP`lq27l%W&`U-s3wjPZz)BDb8nC zv2N#0I~j}TeX-kv>w+ciXMbP2ZxZ9b&*$y0SO44jyh{Jix1aa8_5YZ0m;Zg&8(w{A zdFbx2ufHbuKat%pTJYO%*HQU>|I7TJW-IVcVJvDY?pa;NJMDhQ{?MK4rmkxZ;NJW1 z$zy)wJ63Za@!#`ySmvL+Yt9q?ohLqSw@KM~>Q0L2dQOe&?-qI-eLZWtj?VAb`q~Ed zGix=AXVm}K-M+)(n9Q?RI;TC&o+wGPAKvQ!^w#vE?eZ@n~XZ`k}N z?VM4=w9PRKcUYax?kj#im$hfJMug7%1=6<}?!Q*pE4PVvRxkJCbpbi{_m2KEliBmV zELy=V_6b8Q-^TLyM`kp&EG-Z(c&6a*x8wg;z6Y_zM(w8dk|xY)3$Gtfs$SM@!+3LB zaM7&BuP5)VoMBhC?G1Oy^?ftF12*ZFn~=>cXyQ zP@-SKdT4tvw}yNQIMM4)kj{L5wQ1+XGPnI%j33`#VY-vJl6%|XFz%xEg?Y|Jn;-Se zV>_VU_w;&g?3WU01*f%7j}>y6E;6}fa=~On+A_83^rX9o`)w}Go;mMSn|KCW&>efe z`35mZXKXq#dCwz;RV?=(_kU44C-?sEx0~*pZ(J+(KWe{&Veh5fD@X4Y```E2A-0T{ zrS)c$&4IMp3xs``!*-r_>e_wWHYYQuDAeog+e_{n?lXpTYww!y*lF?31KQo2D}8o( zJ*sP}zEEYSa(>&6#m9}qf81L2Zf;r?S9oJx--f(xBJXBh-~aJTh124sEaR>W*W}MW z4B9Wms(4$T+TGt#W%&7Ut26W0l8oe^tv5H8?0W0XsLxk^vXk$qVZo!#-K#9VpVQ2E zp4A-p^U4v$?-LK1J`mu(_)JKDUbt~&qgWyk5FsrD88D*NyLezdt?Xofv+0o$oVtM31bW!Svx+ODRq zkL65VrTkwL9k#x_@>a@AP(N>z!5e+17ROBmIic$vzf7NBKdJJR!!PYvx7uHY@7wR! z&;6@aJl+1^i^UC38=f#c?`NK}vW)-h&E@mc>NXX;$=@%S^w+h?P<^IR$ZzX)g_=*6 z?%KL1iae$69`>))@>y6y9kkL9Rn54VLjn_9?j2czwkyz72T?fG98ebw_^&69?R zm4bJY9A@u4S*w1t+G25ygV6`x1GaMSS1PwJjXPp(t0<|^t-~qNSH7pb;%uxLZ^L{u z+i&T!C9lc8UfO&nk?+J)qwRgg#;9i;nkAeb(5oepUw^Ajwlb-&A7|E6}({L z(X=RqpWXql_w9?n%CvoAnY-==>CB2>q1-Lzi^ZPsd4pDSvniHGtl~X!)*~*z$;0GG zgHijs+Z+#VG6EWtERVY{W?XJq`s~TcoCQ=Vb>{t+dAC^-r-Kae#|{xkh61FQB~vPk_N4I!@KVp z%yzE6n|zNm^UcleF|WBl&w0~Xa`xcwk9CSV@A3=No-@~oUwW(8y6#xDxVYt+$$PyS zCqIxh(Qa9Gdc_$*z6W!I7_=9}N9@X*V&wDdQ_(Y-X8+qWrR-;Kh>Uq;{P)hAN87mG zhK0s3n&|Cj$~rV#mib4i&4Ovw+-nZ5std`E*m9x#^$xv0XY){*`>hP6e8%ki|I9nd zQh9DWQ`|4@Yj?#PzDc)CFV{h&+dh`3x&yCUN3=P&5%z19J z&0Ff%xzA5rWXc^jt(z}2>G8e~v*Rl}i~o4NUuz!!cJIHgfY;*86Y6hQKiuw`u(O0W z)M=ye4CYDp|DXIVnfP^a&X0rDOSv@`@J!%se6P-U@zDCs4cFP)_@O*$c1kYCQFB@xC8AyDL6@=Qm_IdFRQc`l5-euCHy1 zOOWI#p7{UAW&X&Izx?ZeX&z@RW=*Ztjdr_#Y75(G&NJJ~1VcYfsOP%z&$7GfYRnU+ zbF3Zz|6LFIy30rZTv5}fTNNwYa(6s4xSpvP>-I8v=QG{^>Joe({=Tp0m@C#7`#bQP z9`o_nf3>a~1iVHr12pBeW3`yW zze!hit$%O6H6eG&-B9iiZnyT;U1fT3b`|$F>xE)Z_?&f5$hNUb_iPv5?y%i0CiUEh z&W4A1$u3K?`#!CFTy(1|d12vFMpJ9!xxHF`o86|lUEEixEFf)**vbT&mNuPp2v~#)L{OLcD2ci!VgW>XHnqlWZQn=`?0B0=f&JxJw2?* za_4@o^q&C>G^VZFa>AYIUG+D?y(ZIto{_2i&9>UussHgDrrZfx|39^)t395>wj(Yo z@JEhj|IE{Cn6@>=9a`P0E8X-xiov@)n5&3$yWZ_5Cg;-*8XjkwR{HyC#erS5>HCjw z)O9`jWYTG2ws!~OE4CL;Sx~2W?y8eR*&jK1&t1=dRLGQn&$rqz|MQYd?+(xWJx^Zs zQU2{~^FQCo`C0Ml-tF~Y?{PZR{XQFBmA_}1ML35}@r3yLrIXkH32IAZemXrq=;f}E z-PdfdWUt>hYh9t$DaKQ6hqmrKlOXwoYwf=$kG~g7C0vUY33yk=yY$i4L$L>bEaty| z{=)10q`Ufd*Y93F{?g!d^t9PJ>N8KrbXOJjK2_k}{_o%J{9jWyl(H|4Ucq#_tFl(G ze)_8G@oQS6iYJ${s{XNJ{CPWHXu{58M;!khmUsC0-uRD{!EC-hZG-;~AI+zB-8i(V zHGR54u0hP|`2U*!^h7t*>s?NYn;EB-{Qs@~QfX5%=_x1HrA9jcG9(rqVwdqdcO4ePsuPX55FDaS0bDz_C z<_i|5@3Nh&U@$be_F>X>wfJ*8*sgsEX}I+zq~YR09%j9S7%B6mR;%V*V_sT4ai8_U z%4c5LOA0mDuvZ=6Hy1O|JL|8WGIL$`f{n(1*G*#Dv193j)zv-Ln#UO&*00e^$=I^5 zQJ?L|Y8G4jVzbZv%a5NH=xI9iIap>^a^w;3ecLvCoRq!x(w88e%`-l?cys4J`@{5N z>eJSHIR}ahQ=it!ce1@(xkK&vBdIy>bkF%u-Sd#)$r;DED|fFs&70oMc+pOQypu0@?5*t&M8S+ZB@t-G7lRzClnQi|ld$^|W9yXQIWTYK5+e6v;6kBNK49juSn7&+Ww zZ>i<~ziNB_edm`3yUotqf1e$)>!jiYo*v;o=4qB^xhfe`L)VFZ2s*(nvbt&QsjXet z+qx=Nmg%}nYSc>woN;B_e!u2trq$V(TKj*Oy`S7~cjC^IpqINW&MvK9QGQudFV=bL zyM-ZppXtS0p|o^u)P!OPJ=AO0zcbW-}U0 zI8!+7bdJqIaf{=-&uluT?QuO*bkg+$mWsdLpZ%S;oi%E2{BfqP?$4{UYJ1o@y5BHv zc~;H;+FbI(tY@_k?{ZDDJazA?T~*h;iTibWq*$6$U;nsm9b?t;cIuazkMyp8uju8< zl6{``#5pVb*W4?m3!-mj^Zo(%P@#?WOqP?|!(ZRK_d4s~O^<4S-51iC*}p=$tKPfm zLT06SwmOtcNVPn2oZIIXX|{@K+SB^Ew#C^$HrZ_LKHZhQmhA>-znyr2%|u>{UgHUK zriLV2-`w!Zq+nBkH;2sZS-t>HqkL51f`ijpHt5JJ^*xcRt%>)>%*gH6^{% zdoelr^u(ucRx#w+cQdYD704VZ&va({{F@EwdivjEgpe0Y{&_U1K3+XV72$J*8=VYf#HWaUw?@ty@vK6b}|K*PG#(z_7{{2#PDvvtw`_Gr1Ek%8K zP5B2l=V}}&JDJbj@SV|7?i-g!{JgWJ`a09>*2V5$y-|j}vhLaZ?vkx4H8B;o=ChsO zEBi_|J)7}P+3C;PrtkUl>(_mMv-$kDdB1rh>hwNOYTWoSJicz>_bT~W_c>o&t>2Us zs{q>m6_1TEx8RAY_OGuu)#X(bxFprzJo-q7>nBVBmt}@}L`M-=7NUCT*2>l)W?{9fLyASiLpcCFVw(fbN z&)mgW{L+3W|4BvX1$W;1&-^D+;A8*Yc|+r;`5{~S7UnJTF=jbsA7FLz^@Kml7JQQD z^OpRoPv3uP;TwC)?wY?lpXjh#Nb5Jm+<83d_MhhsVX^jqEssCdkS?0~+9VjrX7xHl+;OA-0)+!Lt){3QMTXb>-AapX00#_-ER3imv8I4y?4W&{bpZr z%|zVbwQck-&uOy)vpg80FYi1O8F2CV@rw4#l9Hn)gILuUc>RE*dn#=m^>~wr2NAL6!S)Ypbi* zuVPJ6ejCf%bl+q4_4QE)cFRIX&<(CM-AP=*dOWsJ*7B5txK6pW%1s7tUHu~N^vzMP zUVREOdvL%=^n%^JoCgibS3Nfi_%Li(*fx8@Jsx(EZ{n}B7ZiFoOxTdv8dsvtI_s(2 z>2%pU-~2q!tw{>z>O1KymdC@8uI9%sasEiY#e`lzJ>4Hqe%Sqdv6QFvn)#PcKVP0% zE4FCOBjW3pD$>~+kKhG%DT`K=Hd2jl>%4Odl zadVa0-v50zpK03s-@X}pZ*BeaBz)8VC*jrW_kIdu_&D3JX6N^J(X6xXbN^U7b;JEr zuda2~?49eksq6Yp(~vUBtLrQNK9gSh>g()$wmYXR|0xttwdZR1_v*9%C0({t_iMgJ zwuNb5J8Jt(X12QjPNz-p7H)dDTJ8$1ta!E0Uj*U4Lp$s`JB}T_sbM;_s*T8EJ%_=-!;;p%s7q<<`?H&V>KFe4g{P z!p0fB2+xG3V~KyKS7}kAoUM zE-~1j5fK~3m@3Y+=Na=dz2m=@z7T3(ygP24w82`&ls#6b+ICq7neO^_f2N+B$*Wbj zc^Dck5^Q7zR{gmCU|YG9LVq=PK|Y&CQ}NwU&3URSkt;r(*`js#&_VvM=g#}76%=(E zx0h!w`|iWAX;I`&^G|25-uuenzw;nB>!H=KSxT zRPS`S)y_K4V71WBuZ-V+++Zk9(%_05^ieV?TBHQp>``c`!`n|1FK#rm(U|N8AuU&xMiO0_=`Upvol z^Mu#$on)SWzh7^^obd_MS=MPgPc4;y>Yp4vf2vZPR@`v`2Xz&719q4C@4kGVf$LwH zaPL=Jz|(iIDD-V`X>c{~i~>y~l0W|0_&~CjN`u51Ry9$-47!061AI2%mWR zY#y(`#OXE>PotE3icfgj$xkRx{hD;(Q7eO4We%fG(etFg@2p}Y-G0nHHsRRhn5%yo z_x^e?<$6rfT>r1j)YUf?^fs9sGySn<@xo)h&t!^%-Y;8!_N<4W!3*m$7sj>8wxUZd zPyJ$L>lD|Y^M0+Kc)93~rgM{u_sptgzR%HcrBw8X&C-tW2L1A|iK}Nve#y2|D7JK- zwfRMOPWZX4>*k(g=i%;WYd)S_t9Wa{jNdh%SJfo_p3fT*_tN%rib)mItWIxjm8cWn zUtKD(I`i%Ij+UTPs@M2U-K&g>o0fAuI2K@k{Fmu8XB*iI=jO7$XHS;?R9kxS$WO6T zx+1?%x$d8TSnq$O*4=bHv+Ysw=Rd7#+{w`p)#7Wo;o8o79_)|zZCLl4S;x9h$hW}2 zUX3Ar0?(1q%XOc(PG_1@f4lnWQ}Im!)9*YnkE^zHUh7-0dG`s^nM3PD-(51j;%%tH zx+jkBYE0^cKhIt#?A&oYe`SfR0?!1?Gb|lncj~zRTx+ND|6Tdg>=otruBBeN{Zis| z>N6$oz1LzzYGnof{#-6UE#Ngn8tYz>Zb?Y}H`xBoIp-1%Oo z{$HijrawFZ)>xPDh*Znur(tdns0a^FHUfXRH>&71K`h%sBXQ|G&KrMQ!=*2j12H zeQbYCVONFw$J!5h!kxVLY6#dg29FXzJ1%L|(CX6?D}x7O|J-Z1X4@@QR92l2qyxK*Y1d$w$h z`u-!&OC*wem)kD;t4xO{Ui-RQ><(XWbAh$bR)unjtj2c+CLAZVqS7C(Ylu8>rt^ha zfZC!$Gs)gfM{llV*wnD*>CuMc+%K)v6^;imuibraL0001mU|7!3u-mx#nW6OoCyv=hG>h;fY7hc={sUkn? zO$gKeuYE_YWGa7emSLY2&AU&2|2~-uHgk9F*)-vDl|7zDG3fIkNHVWPFZ#v7vOXrIipK={P=KI*DIqjTL#5%vvQU>i= z2lX$Uag1wEzQ8?;+k*S5SwEMBc>Ao!F?X{j?1^*S&412tuhX^-*{%nozTc0#c(Y>q zwRiJ(?7G*laBa81pQgn6`F2ZBTzhHvV3k*`(meUQ?<(V8p8qqkq>XoNvZR-~<-P5Z zTexGs7cbCFu6NqJH`)6{>7K=p|6a8^mzc3QZ{eT%59ij`ZgX6Yr#hg=e>aYdo~i!LD4^ zM4s1TUEbHt=WS#S{>(1vYy3ES&J#P8{a=rrzUe9w@bAIh`>9{Ecb-&T^Xu!Hirkny zBZWHC-OZPBLspjg?rNVjJ?8M*-u?gIMMs|DRw(YXJhiK(YJdDwDT&wCH!I${OKME_ zy0P@t*X!}8V*e>PuitsrY5o5H-&U8*-+5|R2h;KRx{r~4|Nre?&$P<^{mP2D4QpRl(vIkwFB|4O zVLCa@S~!4j-e+0)+cRg+JeT+Tiw8qU`6AG@f-H5xn z;6``Tjk#g3>m)NjXWf1NJt)>g?%=29m0~*of~HQW+23pg8X?JQd{=h0^~o7mK8K6( zpH@l~ecjb7&Z|>-LfiZE-p-7awJ{Ms1u}1pUin!Ge_)>CIPqU$uJh5HpC_fN9sHPA zKD%`?lI^6FALog`Y*PvjT>G|NDewKo!|X!e93sLx_#|p{9Qv)b=luF}#zpLamcou1 z5059D`⁢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⋘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 literal 508717 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�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 VULKAN_HEADERS_OVERRIDE_INCLUDE_DIR` to the path to beta vulkan headers. ## Starting From Extra Tutorial diff --git a/docs/vkrt_tuto_manyhits.md.htm b/docs/vkrt_tuto_manyhits.md.htm index 966e1d9..fc6a638 100644 --- a/docs/vkrt_tuto_manyhits.md.htm +++ b/docs/vkrt_tuto_manyhits.md.htm @@ -218,11 +218,11 @@ The size of each group can be described as follows: ~~~~ C++ // Sizes - uint32_t rayGenSize = baseAlignment; - uint32_t missSize = baseAlignment; + uint32_t rayGenSize = groupSizeAligned; + uint32_t missSize = groupSizeAligned; uint32_t hitSize = - ROUND_UP(groupHandleSize + static_cast(sizeof(HitRecordBuffer)), baseAlignment); - uint32_t newSbtSize = rayGenSize + 2 * missSize + 2 * hitSize; + nvh::align_up(groupHandleSize + static_cast(sizeof(HitRecordBuffer)), groupSizeAligned); + uint32_t newSbtSize = rayGenSize + 2 * missSize + 3 * hitSize; ~~~~ Then write the new SBT like this, where only Hit 1 has extra data. @@ -258,21 +258,23 @@ Then change the call to `m_alloc.createBuffer` to create the SBT buffer from `sb m_rtSBTBuffer = m_alloc.createBuffer(cmdBuf, sbtBuffer, vk::BufferUsageFlagBits::eRayTracingKHR); ~~~~ -Note: we are using this `define` for rounding up to the correct alignment -~~~~ C++ -#ifndef ROUND_UP -#define ROUND_UP(v, powerOf2Alignment) (((v) + (powerOf2Alignment)-1) & ~((powerOf2Alignment)-1)) -#endif -~~~~ - ## `raytrace` -Finally, since the size of the hit group is now larger than just the handle, we need to set the new value of the hit group stride in `HelloVulkan::raytrace`. +Finally, since the size of the hit group is now larger than just the handle, +we need to set the new value of the hit group stride in `HelloVulkan::raytrace`. ~~~~ C++ -vk::DeviceSize hitGroupStride = -ROUND_UP(m_rtProperties.shaderGroupHandleSize + sizeof(HitRecordBuffer), progOffset); +vk::DeviceSize hitGroupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize + sizeof(HitRecordBuffer), + m_rtProperties.shaderGroupBaseAlignment); + + +std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, hitGroupSize, hitGroupSize * 3}, // hit + Stride{0u, 0u, 0u}}; // callable ~~~~ !!! Note: diff --git a/docs/vkrt_tutorial.md.htm b/docs/vkrt_tutorial.md.htm index 5bfdfce..a99a8e2 100644 --- a/docs/vkrt_tutorial.md.htm +++ b/docs/vkrt_tutorial.md.htm @@ -36,78 +36,90 @@ verbosity and its potential for errors. # Environment Setup +**The preferred way** to download the project (including NVVK) is to use the +nvpro-samples `build_all` script. + +In a command line, clone the `nvpro-samples/build_all` repository from +https://github.com/nvpro-samples/build_all: + +~~~~~ +git clone https://github.com/nvpro-samples/build_all.git +~~~~~ + +Then open the `build_all` folder and run either `clone_all.bat` (Windows) or +`clone_all.sh` (Linux). + +**If you want to clone as few repositories as possible**, open a command line, +and run the following commands to clone the repositories you need: +~~~~~ +git clone https://github.com/nvpro-samples/shared_sources.git +git clone https://github.com/nvpro-samples/shared_external.git +git clone https://github.com/nvpro-samples/vk_raytracing_tutorial_KHR.git +~~~~~ + +## Generating the Solution + +One typical way to store the build system is to create a `build` directory below the +main project. You can use CMake-GUI or do the following steps. + +~~~~~ +cd vk_raytracing_tutorial_KHR +mkdir build +cd build +cmake .. +~~~~~ ## Beta Installation -The SDK 1.2.135 and up which can be found under https://vulkan.lunarg.com/sdk/home will work with this project. +The SDK 1.2.161 and up which can be found under https://vulkan.lunarg.com/sdk/home will work with this project. Nevertheless, if you are in the Beta period, it is suggested to install and compile all of the following and replace with the current environment. * Latest driver: https://developer.nvidia.com/vulkan-driver -* Latest Vulkan headers: https://github.com/KhronosGroup/Vulkan-Headers -* Latest glslangValidator: https://github.com/KhronosGroup/glslang - -## Structure - -This tutorial is a modification of [`ray_tracing__before`](https://github.com/nvpro-samples/vk_raytracing_tutorial_KHR/tree/master/ray_tracing__before), which loads are render OBJ scenes with Vulkan rasterizer. -All following instructions are based on the modification of this project. -The directory `ray_tracing__simple` is the end result of this tutorial. - -Besides the current repository, you will also need to clone or download the following repositories: - -* [shared_sources](https://github.com/nvpro-samples/shared_sources): The primary framework that all samples depend on. -* [shared_external](https://github.com/nvpro-samples/shared_external): Third party libraries that are provided pre-compiled, mostly for Windows x64 / MSVC. - -The directory structure should be looking like: - -********************************************************** -* \ -* | -* +-- 📂 shared_external -* | -* +-- 📂 shared_sources -* | -* +-- 📂 vk_raytracing_tutorial_KHR -* | | -* | +-- 📂 ray_tracing__before -* | | -* | ⋮ -* | -* ⋮ -********************************************************** - - -!!! Warning - **Run CMake** in vk_raytracing_tutorial_KHR. - -!!! Warning Beta - Modify `VULKAN > VULKAN_HEADERS_OVERRIDE_INCLUDE_DIR` to the path to beta vulkan headers. +* Vulkan headers: https://github.com/KhronosGroup/Vulkan-Headers +* Validator: https://github.com/KhronosGroup/Vulkan-ValidationLayers +* Vulkan-Hpp: https://github.com/KhronosGroup/Vulkan-Hpp !!! Tip Visual Assist To get auto-completion, edit vulkan.hpp and change two places from:
`namespace VULKAN_HPP_NAMESPACE` to `namespace vk` -The starting project is a simple framework allowing us to load OBJ files and rasterize them +# Compiling & Running + +Open the solution located in the build directory, then compile and run `vk_ray_tracing__before_KHR`. + +This will be the starting point of the tutorial. This project is a simple framework allowing us to load OBJ files and rasterize them using Vulkan. ![First Run](Images/resultRasterCube.png width="350px") +The following steps in the tutorial will be modifying this project +`vk_ray_tracing__before_KHR` and will add support for ray tracing. The +end result of the tutorial is the project `vk_ray_tracing__simple_KHR`. +It is possible to look in that project if something went wrong. + +The project `vk_ray_tracing__simple_KHR` will be the starting point for the +extra tutorials. + # Ray Tracing Setup Go to the `main` function of the `main.cpp` file, and find where we request Vulkan extensions with `nvvk::ContextCreateInfo`. -To request ray tracing capabilities, we need to explicitly -add the -[VK_KHR_ray_tracing](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VK_KHR_ray_tracing.html) -extension as well as its various dependencies. +To be able to use ray tracing, we will need VK_KHR_ACCELERATION_STRUCTURE and VK_KHR_RAY_TRACING_PIPELINE. +Those extensions have also dependencies on other extension, therefore all the following +extensions will need to be added. ```` C // #VKRay: Activate the ray tracing extension -vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; -contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); +vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; +contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); +vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; +contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); @@ -115,20 +127,20 @@ contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); ```` -Before creating the device, a linked structure of features must past. Not all extensions requires a set of features, but -ray tracing features must be enabled before the creation of the device. By providing -`raytracingFeature`, the context creation will query the capable features for ray tracing and will use the -filled structure to create the device. - +Before creating the device, a linked structure of features must past. Not all extensions +requires a set of features, but ray tracing features must be enabled before the creation of the device. +By providing `accelFeature`, and `rtPipelineFeature`, the context creation will query the capable features + for ray tracing and will use the filled structure to create the device. In the `HelloVulkan` class in `hello_vulkan.h`, add an initialization function and a member storing the capabilities of the GPU for ray tracing: ```` C // #VKRay -void initRayTracing(); -vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; +void initRayTracing(); +vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; ```` + At the end of `hello_vulkan.cpp`, add the body of `initRayTracing()`, which will query the ray tracing capabilities of the GPU using this extension. In particular, it will obtain the maximum recursion depth, ie. the number of nested ray tracing calls that can be performed from a single ray. This can be seen as the number @@ -144,15 +156,17 @@ creating the shader binding table in a later section. void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); } ```` ## main -In `main.cpp`, in the `main()` function, we call the initialization method right after `helloVk.updateDescriptorSet();` +In `main.cpp`, in the `main()` function, we call the initialization method right after +`helloVk.updateDescriptorSet();` ```` C // #VKRay @@ -188,12 +202,11 @@ This sample loads an OBJ file and stores its indices, vertices and material data model is referenced by an `ObjInstance` structure which also contains the transformation matrix of that particular instance. For ray tracing the `ObjModel` and `ObjInstance` will then naturally fit the BLAS and TLAS, respectively. -To simplify the ray tracing setup we use a helper class containing utility functions for acceleration structure builds. -In the header file, include the`raytrace_vkpp` helper +To simplify the ray tracing setup we use a helper class containing utility functions for +acceleration structure builds. In the header file, include the`raytrace_vkpp` helper ```` C // #VKRay -#define ALLOC_DEDICATED #include "nvvk/raytrace_vk.hpp" ```` @@ -224,11 +237,12 @@ nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); Its implementation will fill three structures -* vk::AccelerationStructureCreateGeometryTypeInfoKHR: that defines how the AS will be constructed. -* vk::AccelerationStructureGeometryKHR: the geometry for build the AS, in this case, from triangles. -* vk::AccelerationStructureBuildOffsetInfoKHR: the offset, which correspond to the actual wanted geometry when building. +* vk::AccelerationStructureGeometryTrianglesDataKHR: defines the data from which the AS will be constructed. +* vk::AccelerationStructureGeometryKHR: the geometry type for building the AS, in this case, from triangles. +* vk::AccelerationStructureBuildRangeInfoKHR: the offset, which correspond to the actual wanted geometry when building. -Multiple of the above structure can be combined to create a single blas. In this example, the array will always be a length of one. +Multiple of the above structure can be combined to create a single blas. In this example, +the array will always be a length of one. Note that we consider all objects opaque for now, and indicate this to the builder for potential optimization. @@ -239,44 +253,37 @@ potential optimization. // nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - // Setting up the creation info of acceleration structure - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - // Building part vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + uint32_t maxPrimitiveCount = model.nbIndices / 3; + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); // Setting up the build info of the acceleration vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); // The primitive itself - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(maxPrimitiveCount); offset.setPrimitiveOffset(0); offset.setTransformOffset(0); // Our blas is only one geometry, but could be made of many geometries nvvk::RaytracingBuilderKHR::Blas blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; @@ -817,7 +824,7 @@ void HelloVulkan::createRtDescriptorSet() m_rtDescSetLayout = m_rtDescSetLayoutBind.createLayout(m_device); m_rtDescSet = m_device.allocateDescriptorSets({m_rtDescPool, 1, &m_rtDescSetLayout})[0]; - vk::AccelerationStructureKHR tlas = m_rtBuilder.getAccelerationStructure(); + vk::AccelerationStructureKHR tlas = m_rtBuilder.getAccelerationStructure(); vk::WriteDescriptorSetAccelerationStructureKHR descASInfo; descASInfo.setAccelerationStructureCount(1); descASInfo.setPAccelerationStructures(&tlas); @@ -825,8 +832,8 @@ void HelloVulkan::createRtDescriptorSet() {}, m_offscreenColor.descriptor.imageView, vk::ImageLayout::eGeneral}; std::vector writes; - writes.emplace_back(m_rtDescSetLayoutBind.makeWrite(m_rtDescSet, 0, descASInfo)); - writes.emplace_back(m_rtDescSetLayoutBind.makeWrite(m_rtDescSet, 1, imageInfo)); + writes.emplace_back(m_rtDescSetLayoutBind.makeWrite(m_rtDescSet, 0, &descASInfo)); + writes.emplace_back(m_rtDescSetLayoutBind.makeWrite(m_rtDescSet, 1, &imageInfo)); m_device.updateDescriptorSets(static_cast(writes.size()), writes.data(), 0, nullptr); } ```` @@ -840,27 +847,27 @@ index buffers. Even though the vertex and index buffers will only be used by the descriptor set as they semantically fit the Scene descriptor set. ```` C - // Camera matrices (binding = 0) - m_descSetLayoutBind.addBinding( - vkDS(0, vkDT::eUniformBuffer, 1, vkSS::eVertex | vkSS::eRaygenKHR)); - // Materials (binding = 1) - m_descSetLayoutBind.addBinding( - vkDS(1, vkDT::eStorageBuffer, nbObj, vkSS::eVertex | vkSS::eFragment | vkSS::eClosestHitKHR)); - // Scene description (binding = 2) - m_descSetLayoutBind.addBinding( // - vkDS(2, vkDT::eStorageBuffer, 1, vkSS::eVertex | vkSS::eFragment | vkSS::eClosestHitKHR)); - // Textures (binding = 3) - m_descSetLayoutBind.addBinding( - vkDS(3, vkDT::eCombinedImageSampler, nbTxt, vkSS::eFragment | vkSS::eClosestHitKHR)); - // Materials (binding = 4) - m_descSetLayoutBind.addBinding( - vkDS(4, vkDT::eStorageBuffer, nbObj, vkSS::eFragment | vkSS::eClosestHitKHR)); - // Storing vertices (binding = 5) - m_descSetLayoutBind.addBinding( // - vkDS(5, vkDT::eStorageBuffer, nbObj, vkSS::eClosestHitKHR)); - // Storing indices (binding = 6) - m_descSetLayoutBind.addBinding( // - vkDS(6, vkDT::eStorageBuffer, nbObj, vkSS::eClosestHitKHR)); +// Camera matrices (binding = 0) +m_descSetLayoutBind.addBinding( + vkDS(0, vkDT::eUniformBuffer, 1, vkSS::eVertex | vkSS::eRaygenKHR)); +// Materials (binding = 1) +m_descSetLayoutBind.addBinding( + vkDS(1, vkDT::eStorageBuffer, nbObj, vkSS::eVertex | vkSS::eFragment | vkSS::eClosestHitKHR)); +// Scene description (binding = 2) +m_descSetLayoutBind.addBinding( // + vkDS(2, vkDT::eStorageBuffer, 1, vkSS::eVertex | vkSS::eFragment | vkSS::eClosestHitKHR)); +// Textures (binding = 3) +m_descSetLayoutBind.addBinding( + vkDS(3, vkDT::eCombinedImageSampler, nbTxt, vkSS::eFragment | vkSS::eClosestHitKHR)); +// Materials (binding = 4) +m_descSetLayoutBind.addBinding( + vkDS(4, vkDT::eStorageBuffer, nbObj, vkSS::eFragment | vkSS::eClosestHitKHR)); +// Storing vertices (binding = 5) +m_descSetLayoutBind.addBinding( // + vkDS(5, vkDT::eStorageBuffer, nbObj, vkSS::eClosestHitKHR)); +// Storing indices (binding = 6) +m_descSetLayoutBind.addBinding( // + vkDS(6, vkDT::eStorageBuffer, nbObj, vkSS::eClosestHitKHR)); ```` We set the actual contents of the descriptor set by adding those buffers in `updateDescriptorSet()`: @@ -884,14 +891,23 @@ We set the actual contents of the descriptor set by adding those buffers in `upd writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 6, dbiIdx.data())); ```` -Originally the buffers containing the vertices and indices were only used by the rasterization pipeline. The ray tracing -will need to use those buffers as storage buffers. We update the usage of the buffers in `loadModel`: +Originally the buffers containing the vertices and indices were only used by the rasterization pipeline. +The ray tracing will need to use those buffers as storage buffers (`VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT`), +the address to those buffers are needed to fill the `VkAccelerationStructureGeometryTrianglesDataKHR` structure, +and because they are use for constructing the acceleration structure, they also need +the `VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR` flag. + +We update the usage of the buffers in `loadModel`: ```` C - model.vertexBuffer = - m_alloc.createBuffer(cmdBuf, loader.m_vertices, vkBU::eVertexBuffer | vkBU::eStorageBuffer); - model.indexBuffer = - m_alloc.createBuffer(cmdBuf, loader.m_indices, vkBU::eIndexBuffer | vkBU::eStorageBuffer); +model.vertexBuffer = +m_alloc.createBuffer(cmdBuf, loader.m_vertices, + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); +model.indexBuffer = +m_alloc.createBuffer(cmdBuf, loader.m_indices, + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); ```` !!! Note: Array of Buffers @@ -1076,10 +1092,10 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); std::vector stages; @@ -1114,7 +1130,7 @@ shaders. // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -1192,9 +1208,10 @@ call as a miss. Note that it is preferable to keep the recursion level as low as formulation instead. ```` C - rayPipelineInfo.setMaxRecursionDepth(1); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(1); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = m_device.createRayTracingPipelineKHR({}, rayPipelineInfo); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); ```` Once the pipeline has been created we discard the shader modules: @@ -1279,23 +1296,29 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; ```` -We then fetch the handles to the shader groups of the pipeline, and let the allocator allocate the device memory and -copy the handles into the SBT: +We then fetch the handles to the shader groups of the pipeline, and let the allocator +allocate the device memory and copy the handles into the SBT. Note that SBT buffer need the +`VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR` flag and since we will need the address +of SBT buffer, therefore the buffer need also the `VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT` flag. ```` C std::vector shaderHandleStorage(sbtSize); m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, shaderHandleStorage.data()); - // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + + // Write the handles in the SBT + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddress + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -1304,7 +1327,7 @@ copy the handles into the SBT: for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -1366,12 +1389,21 @@ each shader. In our case the stride is simply the size of a shader group handle, shader-group-specific data within the SBT, resulting in a larger stride. ```` C - vk::DeviceSize progSize = m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize missStride = progSize; - vk::DeviceSize hitGroupOffset = 2u * progSize; // Jump over the previous shaders - vk::DeviceSize hitGroupStride = progSize; +// Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceSize hitGroupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize + sizeof(HitRecordBuffer), + m_rtProperties.shaderGroupBaseAlignment); + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); + + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, hitGroupSize, hitGroupSize * 3}, // hit + Stride{0u, 0u, 0u}}; // callable ```` @@ -1382,19 +1414,9 @@ three parameters are equivalent to the grid size of a compute launch, and repres we want to trace one ray per pixel, the grid size has the width and height of the output image, and a depth of 1. ```` C -vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); - -const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; -const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; -const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; -const vk::StridedBufferRegionKHR callableShaderBindingTable; - -cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // - m_size.width, m_size.height, 1); // + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // + m_size.width, m_size.height, 1); // m_debug.endLabel(cmdBuf); } @@ -1823,8 +1845,8 @@ The OBJ model is loaded in `main.cpp` by calling `helloVk.loadModel`. Let's load ```` C // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); ```` Since that model is larger, we can change the `CameraManip.setLookat` call to @@ -1860,7 +1882,7 @@ In the body of `createRtPipeline`, we need to define the new miss shader right a // simply indicates that no occlusion has been found vk::ShaderModule shadowmissSM = nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); ```` @@ -1880,7 +1902,7 @@ The pipeline now has to allow shooting rays from the closest hit program, which // hit points of the camera rays, hence a recursion level of 2. This number should be kept as low // as possible for performance reasons. Even recursive ray tracing should be flattened into a loop // in the ray generation to avoid deep recursion. - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth ```` At the end of the method, we destroy the shader module for the shadow miss shader: diff --git a/ray_tracing__advance/CMakeLists.txt b/ray_tracing__advance/CMakeLists.txt index 4a1c58b..3d537a1 100644 --- a/ray_tracing__advance/CMakeLists.txt +++ b/ray_tracing__advance/CMakeLists.txt @@ -1,31 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) -##################################################################################### +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") + + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -44,41 +51,27 @@ foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -91,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing__advance/hello_vulkan.cpp b/ray_tracing__advance/hello_vulkan.cpp index 6e086fd..3a25711 100644 --- a/ray_tracing__advance/hello_vulkan.cpp +++ b/ray_tracing__advance/hello_vulkan.cpp @@ -32,7 +32,6 @@ extern std::vector defaultSearchPaths; #define VMA_IMPLEMENTATION - #define STB_IMAGE_IMPLEMENTATION #include "fileformats/stb_image.h" #include "obj_loader.h" @@ -200,7 +199,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -234,8 +233,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreen.renderPass()); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions(std::vector{ {0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, @@ -254,6 +253,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -280,10 +280,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -378,9 +380,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -538,12 +541,16 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& void HelloVulkan::updateFrame() { static nvmath::mat4f refCamMatrix; + static float refFov{CameraManip.getFov()}; - auto& m = CameraManip.getMatrix(); - if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0) + const auto& m = CameraManip.getMatrix(); + const auto fov = CameraManip.getFov(); + + if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0 || refFov != fov) { resetFrame(); refCamMatrix = m; + refFov = fov; } m_pushConstants.frame++; } diff --git a/ray_tracing__advance/main.cpp b/ray_tracing__advance/main.cpp index 28ce493..a87c55a 100644 --- a/ray_tracing__advance/main.cpp +++ b/ray_tracing__advance/main.cpp @@ -44,6 +44,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "nvvk/commands_vk.hpp" #include "nvvk/context_vk.hpp" +#include "imgui_camera_widget.h" #include ////////////////////////////////////////////////////////////////////////// @@ -64,47 +65,46 @@ void renderUI(HelloVulkan& helloVk) { static int item = 1; bool changed = false; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) - { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); - changed = true; - } - changed |= ImGui::RadioButton("Point", &helloVk.m_pushConstants.lightType, 0); - ImGui::SameLine(); - changed |= ImGui::RadioButton("Spot", &helloVk.m_pushConstants.lightType, 1); - ImGui::SameLine(); - changed |= ImGui::RadioButton("Infinite", &helloVk.m_pushConstants.lightType, 2); - if(helloVk.m_pushConstants.lightType < 2) - { - changed |= ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstants.lightPosition.x, - -20.f, 20.f); - } - if(helloVk.m_pushConstants.lightType > 0) - { - changed |= ImGui::SliderFloat3("Light Direction", &helloVk.m_pushConstants.lightDirection.x, - -1.f, 1.f); - } - if(helloVk.m_pushConstants.lightType < 2) - { - changed |= - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstants.lightIntensity, 0.f, 500.f); - } - if(helloVk.m_pushConstants.lightType == 1) - { - float dCutoff = rad2deg(acos(helloVk.m_pushConstants.lightSpotCutoff)); - float dOutCutoff = rad2deg(acos(helloVk.m_pushConstants.lightSpotOuterCutoff)); - changed |= ImGui::SliderFloat("Cutoff", &dCutoff, 0.f, 45.f); - changed |= ImGui::SliderFloat("OutCutoff", &dOutCutoff, 0.f, 45.f); - dCutoff = dCutoff > dOutCutoff ? dOutCutoff : dCutoff; - helloVk.m_pushConstants.lightSpotCutoff = cos(deg2rad(dCutoff)); - helloVk.m_pushConstants.lightSpotOuterCutoff = cos(deg2rad(dOutCutoff)); + changed |= ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) + { + changed |= ImGui::RadioButton("Point", &helloVk.m_pushConstants.lightType, 0); + ImGui::SameLine(); + changed |= ImGui::RadioButton("Spot", &helloVk.m_pushConstants.lightType, 1); + ImGui::SameLine(); + changed |= ImGui::RadioButton("Infinite", &helloVk.m_pushConstants.lightType, 2); + + + if(helloVk.m_pushConstants.lightType < 2) + { + changed |= ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstants.lightPosition.x, + -20.f, 20.f); + } + if(helloVk.m_pushConstants.lightType > 0) + { + changed |= ImGui::SliderFloat3("Light Direction", &helloVk.m_pushConstants.lightDirection.x, + -1.f, 1.f); + } + if(helloVk.m_pushConstants.lightType < 2) + { + changed |= ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstants.lightIntensity, 0.f, + 500.f); + } + if(helloVk.m_pushConstants.lightType == 1) + { + float dCutoff = rad2deg(acos(helloVk.m_pushConstants.lightSpotCutoff)); + float dOutCutoff = rad2deg(acos(helloVk.m_pushConstants.lightSpotOuterCutoff)); + changed |= ImGui::SliderFloat("Cutoff", &dCutoff, 0.f, 45.f); + changed |= ImGui::SliderFloat("OutCutoff", &dOutCutoff, 0.f, 45.f); + dCutoff = dCutoff > dOutCutoff ? dOutCutoff : dCutoff; + + helloVk.m_pushConstants.lightSpotCutoff = cos(deg2rad(dCutoff)); + helloVk.m_pushConstants.lightSpotOuterCutoff = cos(deg2rad(dOutCutoff)); + } } - changed |= ImGui::InputInt("Max Frames", &helloVk.m_maxFrames); - helloVk.m_maxFrames = std::max(helloVk.m_maxFrames, 1); + + changed |= ImGui::SliderInt("Max Frames", &helloVk.m_maxFrames, 1, 1000); if(changed) helloVk.resetFrame(); } @@ -134,7 +134,7 @@ int main(int argc, char** argv) // Setup camera CameraManip.setWindowSize(SAMPLE_WIDTH, SAMPLE_HEIGHT); - CameraManip.setLookat(nvmath::vec3f(5, 4, -4), nvmath::vec3f(0, 1, 0), nvmath::vec3f(0, 1, 0)); + CameraManip.setLookat({8.440, 9.041, -8.973}, {-2.462, 3.661, -0.286}, {0.000, 1.000, 0.000}); // Setup Vulkan if(!glfwVulkanSupported()) @@ -148,19 +148,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); @@ -175,11 +172,17 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + // #VKRay: Activate the ray tracing extension + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); // Creating Vulkan base application nvvk::Context vkctx{}; @@ -199,7 +202,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -208,9 +211,9 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creating scene - helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths, true), nvmath::scale_mat4(nvmath::vec3f(0.5f)) * nvmath::translation_mat4(nvmath::vec3f(0.0f, 0.0f, 6.0f))); @@ -222,7 +225,6 @@ int main(int argc, char** argv) for(int n = 0; n < 50; ++n) { - ObjInstance inst; inst.objIndex = wusonIndex; inst.txtOffset = 0; @@ -284,14 +286,15 @@ int main(int argc, char** argv) // Start the Dear ImGui frame ImGui_ImplGlfw_NewFrame(); - ImGui::NewFrame(); // Updating camera buffer helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGui::NewFrame(); + ImGuiH::Panel::Begin(); bool changed = false; // Edit 3 floats representing a color changed |= ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); @@ -304,7 +307,9 @@ int main(int argc, char** argv) renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -357,6 +362,7 @@ int main(int argc, char** argv) // Rendering tonemapper offscreen.draw(cmdBuff, helloVk.getSize()); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing__advance/offscreen.cpp b/ray_tracing__advance/offscreen.cpp index 21445e8..98b7b71 100644 --- a/ray_tracing__advance/offscreen.cpp +++ b/ray_tracing__advance/offscreen.cpp @@ -74,7 +74,7 @@ void Offscreen::createFramebuffer(VkExtent2D& size) | vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eStorage); - nvvk::Image image = m_alloc->createImage(colorCreateInfo); + nvvk::Image image = m_alloc->createImage(colorCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, colorCreateInfo); m_colorTexture = m_alloc->createTexture(image, ivInfo, vk::SamplerCreateInfo()); m_colorTexture.descriptor.imageLayout = VK_IMAGE_LAYOUT_GENERAL; @@ -153,9 +153,9 @@ void Offscreen::createPipeline(vk::RenderPass& renderPass) std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_pipelineLayout, renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_pipeline = pipelineGenerator.createPipeline(); diff --git a/ray_tracing__advance/raytrace.cpp b/ray_tracing__advance/raytrace.cpp index 6d6e07a..4bd6492 100644 --- a/ray_tracing__advance/raytrace.cpp +++ b/ray_tracing__advance/raytrace.cpp @@ -30,6 +30,7 @@ #include "nvh/fileoperations.hpp" #include "nvvk/descriptorsets_vk.hpp" +#include "nvh/alignment.hpp" #include "nvvk/shaders_vk.hpp" #include "obj_loader.h" @@ -47,9 +48,10 @@ void Raytracer::setup(const vk::Device& device, m_graphicsQueueIndex = queueFamily; // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, allocator, m_graphicsQueueIndex); m_debug.setup(device); @@ -69,45 +71,36 @@ void Raytracer::destroy() //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas Raytracer::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput Raytracer::objectToVkGeometryKHR(const ObjModel& model) { - // Setting up the creation info of acceleration structure - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - // Building part vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); // Setting up the build info of the acceleration vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation); // For AnyHit asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); // Nb triangles offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -116,18 +109,9 @@ nvvk::RaytracingBuilderKHR::Blas Raytracer::objectToVkGeometryKHR(const ObjModel //-------------------------------------------------------------------------------------------------- // Returning the ray tracing geometry used for the BLAS, containing all spheres // -nvvk::RaytracingBuilderKHR::Blas Raytracer::implicitToVkGeometryKHR(const ImplInst& implicitObj) +nvvk::RaytracingBuilderKHR::BlasInput Raytracer::implicitToVkGeometryKHR( + const ImplInst& implicitObj) { - - // Setting up the creation info of acceleration structure - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eAabbs); - asCreate.setIndexType(vk::IndexType::eNoneKHR); - asCreate.setVertexFormat(vk::Format::eUndefined); - asCreate.setMaxPrimitiveCount(static_cast(implicitObj.objImpl.size())); // Nb triangles - asCreate.setMaxVertexCount(0); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - vk::DeviceAddress dataAddress = m_device.getBufferAddress({implicitObj.implBuf.buffer}); vk::AccelerationStructureGeometryAabbsDataKHR aabbs; @@ -135,21 +119,20 @@ nvvk::RaytracingBuilderKHR::Blas Raytracer::implicitToVkGeometryKHR(const ImplIn aabbs.setStride(sizeof(ObjImplicit)); // Setting up the build info of the acceleration - vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); - asGeom.setFlags(vk::GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation); // For AnyHit - asGeom.geometry.setAabbs(aabbs); + VkAccelerationStructureGeometryKHR asGeom{VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR}; + asGeom.geometryType = VK_GEOMETRY_TYPE_AABBS_KHR; + asGeom.flags = VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR; // For AnyHit + asGeom.geometry.aabbs = aabbs; - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(static_cast(implicitObj.objImpl.size())); // Nb aabb offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -158,7 +141,7 @@ nvvk::RaytracingBuilderKHR::Blas Raytracer::implicitToVkGeometryKHR(const ImplIn void Raytracer::createBottomLevelAS(std::vector& models, ImplInst& implicitObj) { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(models.size()); for(const auto& obj : models) { @@ -266,16 +249,15 @@ void Raytracer::createRtPipeline(vk::DescriptorSetLayout& sceneDescLayout) vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -286,7 +268,7 @@ void Raytracer::createRtPipeline(vk::DescriptorSetLayout& sceneDescLayout) VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR}; stages.push_back({{}, vk::ShaderStageFlagBits::eRaygenKHR, raygenSM, "main"}); rg.setGeneralShader(static_cast(stages.size() - 1)); - m_rtShaderGroups.push_back(rg); + m_rtShaderGroups.push_back(rg); // 0 // Miss vk::RayTracingShaderGroupCreateInfoKHR mg{vk::RayTracingShaderGroupTypeKHR::eGeneral, @@ -294,19 +276,19 @@ void Raytracer::createRtPipeline(vk::DescriptorSetLayout& sceneDescLayout) VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR}; stages.push_back({{}, vk::ShaderStageFlagBits::eMissKHR, missSM, "main"}); mg.setGeneralShader(static_cast(stages.size() - 1)); - m_rtShaderGroups.push_back(mg); + m_rtShaderGroups.push_back(mg); // 1 // Shadow Miss stages.push_back({{}, vk::ShaderStageFlagBits::eMissKHR, shadowmissSM, "main"}); mg.setGeneralShader(static_cast(stages.size() - 1)); - m_rtShaderGroups.push_back(mg); + m_rtShaderGroups.push_back(mg); // 2 // Hit Group0 - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::ShaderModule ahitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rahit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rahit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -315,19 +297,19 @@ void Raytracer::createRtPipeline(vk::DescriptorSetLayout& sceneDescLayout) hg.setClosestHitShader(static_cast(stages.size() - 1)); stages.push_back({{}, vk::ShaderStageFlagBits::eAnyHitKHR, ahitSM, "main"}); hg.setAnyHitShader(static_cast(stages.size() - 1)); - m_rtShaderGroups.push_back(hg); + m_rtShaderGroups.push_back(hg); // 3 // Hit Group1 - Closest Hit + Intersection (procedural) vk::ShaderModule chit2SM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace2.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace2.rchit.spv", true, paths, true)); vk::ShaderModule ahit2SM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace2.rahit.spv", true, paths)); + nvh::loadFile("shaders/raytrace2.rahit.spv", true, paths, true)); vk::ShaderModule rintSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rint.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rint.spv", true, paths, true)); { vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eProceduralHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -338,7 +320,7 @@ void Raytracer::createRtPipeline(vk::DescriptorSetLayout& sceneDescLayout) hg.setAnyHitShader(static_cast(stages.size() - 1)); stages.push_back({{}, vk::ShaderStageFlagBits::eIntersectionKHR, rintSM, "main"}); hg.setIntersectionShader(static_cast(stages.size() - 1)); - m_rtShaderGroups.push_back(hg); + m_rtShaderGroups.push_back(hg); // 4 } // Callable shaders @@ -348,22 +330,23 @@ void Raytracer::createRtPipeline(vk::DescriptorSetLayout& sceneDescLayout) vk::ShaderModule call0 = nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/light_point.rcall.spv", true, paths)); + nvh::loadFile("shaders/light_point.rcall.spv", true, paths, true)); vk::ShaderModule call1 = nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/light_spot.rcall.spv", true, paths)); + nvh::loadFile("shaders/light_spot.rcall.spv", true, paths, true)); vk::ShaderModule call2 = - nvvk::createShaderModule(m_device, nvh::loadFile("shaders/light_inf.rcall.spv", true, paths)); + nvvk::createShaderModule(m_device, + nvh::loadFile("shaders/light_inf.rcall.spv", true, paths, true)); stages.push_back({{}, vk::ShaderStageFlagBits::eCallableKHR, call0, "main"}); callGroup.setGeneralShader(static_cast(stages.size() - 1)); - m_rtShaderGroups.push_back(callGroup); + m_rtShaderGroups.push_back(callGroup); // 5 stages.push_back({{}, vk::ShaderStageFlagBits::eCallableKHR, call1, "main"}); callGroup.setGeneralShader(static_cast(stages.size() - 1)); - m_rtShaderGroups.push_back(callGroup); + m_rtShaderGroups.push_back(callGroup); // 6 stages.push_back({{}, vk::ShaderStageFlagBits::eCallableKHR, call2, "main"}); callGroup.setGeneralShader(static_cast(stages.size() - 1)); - m_rtShaderGroups.push_back(callGroup); + m_rtShaderGroups.push_back(callGroup); //7 vk::PipelineLayoutCreateInfo pipelineLayoutCreateInfo; @@ -393,10 +376,10 @@ void Raytracer::createRtPipeline(vk::DescriptorSetLayout& sceneDescLayout) m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -422,18 +405,24 @@ void Raytracer::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc->createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc->createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddress + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -442,7 +431,7 @@ void Raytracer::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc->unmap(m_rtSBTBuffer); @@ -479,27 +468,22 @@ void Raytracer::raytrace(const vk::CommandBuffer& cmdBuf, | vk::ShaderStageFlagBits::eCallableKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders - vk::DeviceSize callableGroupOffset = 5u * progSize; // Jump over the previous shaders - vk::DeviceSize sbtSize = (vk::DeviceSize)m_rtShaderGroups.size() * progSize; + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable = { - m_rtSBTBuffer.buffer, callableGroupOffset, progSize, sbtSize}; + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 2}, // hit + Stride{sbtAddress + 5u * groupSize, groupStride, groupSize * 3}}; // callable - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // size.width, size.height, 1); // - m_debug.endLabel(cmdBuf); } diff --git a/ray_tracing__advance/raytrace.hpp b/ray_tracing__advance/raytrace.hpp index 43b4247..9084c18 100644 --- a/ray_tracing__advance/raytrace.hpp +++ b/ray_tracing__advance/raytrace.hpp @@ -43,8 +43,8 @@ public: uint32_t queueFamily); void destroy(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - nvvk::RaytracingBuilderKHR::Blas implicitToVkGeometryKHR(const ImplInst& implicitObj); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + nvvk::RaytracingBuilderKHR::BlasInput implicitToVkGeometryKHR(const ImplInst& implicitObj); void createBottomLevelAS(std::vector& models, ImplInst& implicitObj); void createTopLevelAS(std::vector& instances, ImplInst& implicitObj); void createRtDescriptorSet(const vk::ImageView& outputImage); @@ -65,7 +65,7 @@ private: nvvk::DebugUtil m_debug; // Utility to name objects - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; diff --git a/ray_tracing__advance/shaders/light_inf.rcall b/ray_tracing__advance/shaders/light_inf.rcall index bc70cf3..a89034e 100644 --- a/ray_tracing__advance/shaders/light_inf.rcall +++ b/ray_tracing__advance/shaders/light_inf.rcall @@ -3,7 +3,7 @@ #extension GL_GOOGLE_include_directive : enable #include "raycommon.glsl" -layout(location = 0) callableDataInEXT rayLight cLight; +layout(location = 3) callableDataInEXT rayLight cLight; layout(push_constant) uniform Constants { diff --git a/ray_tracing__advance/shaders/light_point.rcall b/ray_tracing__advance/shaders/light_point.rcall index 389273c..bdca9fa 100644 --- a/ray_tracing__advance/shaders/light_point.rcall +++ b/ray_tracing__advance/shaders/light_point.rcall @@ -3,7 +3,7 @@ #extension GL_GOOGLE_include_directive : enable #include "raycommon.glsl" -layout(location = 0) callableDataInEXT rayLight cLight; +layout(location = 3) callableDataInEXT rayLight cLight; layout(push_constant) uniform Constants { diff --git a/ray_tracing__advance/shaders/light_spot.rcall b/ray_tracing__advance/shaders/light_spot.rcall index b845f0a..1214d29 100644 --- a/ray_tracing__advance/shaders/light_spot.rcall +++ b/ray_tracing__advance/shaders/light_spot.rcall @@ -3,7 +3,7 @@ #extension GL_GOOGLE_include_directive : enable #include "raycommon.glsl" -layout(location = 0) callableDataInEXT rayLight cLight; +layout(location = 3) callableDataInEXT rayLight cLight; layout(push_constant) uniform Constants { diff --git a/ray_tracing__advance/shaders/raytrace.rahit b/ray_tracing__advance/shaders/raytrace.rahit index 8ef6d33..cf611a5 100644 --- a/ray_tracing__advance/shaders/raytrace.rahit +++ b/ray_tracing__advance/shaders/raytrace.rahit @@ -30,7 +30,7 @@ void main() uint seed = prd.seed; // We don't want to modify the PRD if(mat.dissolve == 0.0) - ignoreIntersectionEXT(); + ignoreIntersectionEXT; else if(rnd(seed) > mat.dissolve) - ignoreIntersectionEXT(); + ignoreIntersectionEXT; } diff --git a/ray_tracing__advance/shaders/raytrace.rchit b/ray_tracing__advance/shaders/raytrace.rchit index 503032b..5e350fd 100644 --- a/ray_tracing__advance/shaders/raytrace.rchit +++ b/ray_tracing__advance/shaders/raytrace.rchit @@ -36,7 +36,7 @@ layout(push_constant) uniform Constants } pushC; -layout(location = 0) callableDataEXT rayLight cLight; +layout(location = 3) callableDataEXT rayLight cLight; void main() @@ -97,7 +97,7 @@ void main() cLight.outLightDistance = 10000000; } #else - executeCallableEXT(pushC.lightType, 0); + executeCallableEXT(pushC.lightType, 3); #endif // Material of the object diff --git a/ray_tracing__advance/shaders/raytrace2.rahit b/ray_tracing__advance/shaders/raytrace2.rahit index a71a877..624891c 100644 --- a/ray_tracing__advance/shaders/raytrace2.rahit +++ b/ray_tracing__advance/shaders/raytrace2.rahit @@ -26,7 +26,7 @@ void main() uint seed = prd.seed; // We don't want to modify the PRD if(mat.dissolve == 0.0) - ignoreIntersectionEXT(); + ignoreIntersectionEXT; else if(rnd(seed) > mat.dissolve) - ignoreIntersectionEXT(); + ignoreIntersectionEXT; } diff --git a/ray_tracing__advance/shaders/raytrace2.rchit b/ray_tracing__advance/shaders/raytrace2.rchit index e267a5d..dc88972 100644 --- a/ray_tracing__advance/shaders/raytrace2.rchit +++ b/ray_tracing__advance/shaders/raytrace2.rchit @@ -37,7 +37,7 @@ layout(push_constant) uniform Constants } pushC; -layout(location = 0) callableDataEXT rayLight cLight; +layout(location = 3) callableDataEXT rayLight cLight; void main() @@ -71,7 +71,7 @@ void main() } cLight.inHitPosition = worldPos; - executeCallableEXT(pushC.lightType, 0); + executeCallableEXT(pushC.lightType, 3); // Material of the object WaveFrontMaterial mat = materials[nonuniformEXT(gl_InstanceCustomIndexEXT)].m[impl.matId]; diff --git a/ray_tracing__before/CMakeLists.txt b/ray_tracing__before/CMakeLists.txt index 1ca7679..316f8df 100644 --- a/ray_tracing__before/CMakeLists.txt +++ b/ray_tracing__before/CMakeLists.txt @@ -1,30 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) -SET(PROJNAME vk_${PROJNAME}_KHR) +set(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) +SET(VULKAN_TARGET_ENV vulkan1.2) UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -34,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -88,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing__before/hello_vulkan.cpp b/ray_tracing__before/hello_vulkan.cpp index 27bc7f5..00bf5e8 100644 --- a/ray_tracing__before/hello_vulkan.cpp +++ b/ray_tracing__before/hello_vulkan.cpp @@ -174,8 +174,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions(std::vector{ {0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, @@ -194,6 +194,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -293,7 +294,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -311,9 +312,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -527,9 +529,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); diff --git a/ray_tracing__before/hello_vulkan.h b/ray_tracing__before/hello_vulkan.h index 4d1f1ec..3b36931 100644 --- a/ray_tracing__before/hello_vulkan.h +++ b/ray_tracing__before/hello_vulkan.h @@ -62,8 +62,8 @@ public: // The OBJ model struct ObjModel { - uint32_t nbIndices{0}; - uint32_t nbVertices{0}; + uint32_t nbIndices{0}; + uint32_t nbVertices{0}; nvvk::Buffer vertexBuffer; // Device buffer of all 'Vertex' nvvk::Buffer indexBuffer; // Device buffer of the indices forming triangles nvvk::Buffer matColorBuffer; // Device buffer of array of 'Wavefront material' @@ -125,8 +125,8 @@ public: vk::PipelineLayout m_postPipelineLayout; vk::RenderPass m_offscreenRenderPass; vk::Framebuffer m_offscreenFramebuffer; - nvvk::Texture m_offscreenColor; + nvvk::Texture m_offscreenColor; vk::Format m_offscreenColorFormat{vk::Format::eR32G32B32A32Sfloat}; - nvvk::Texture m_offscreenDepth; + nvvk::Texture m_offscreenDepth; vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; }; diff --git a/ray_tracing__before/main.cpp b/ray_tracing__before/main.cpp index 480c56f..d8ed7be 100644 --- a/ray_tracing__before/main.cpp +++ b/ray_tracing__before/main.cpp @@ -37,6 +37,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -62,19 +63,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -119,19 +117,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceDescriptorIndexingFeaturesEXT indexFeature; - vk::PhysicalDeviceScalarBlockLayoutFeaturesEXT scalarFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo; + contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); #ifdef _WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); @@ -143,8 +138,8 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); - contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, false, &indexFeature); - contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, false, &scalarFeature); + contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); + contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); // Creating Vulkan base application nvvk::Context vkctx{}; @@ -164,7 +159,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -173,7 +168,7 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths, true)); helloVk.createOffscreenRender(); helloVk.createDescriptorSetLayout(); @@ -206,13 +201,15 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -259,6 +256,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing__simple/CMakeLists.txt b/ray_tracing__simple/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing__simple/CMakeLists.txt +++ b/ray_tracing__simple/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing__simple/hello_vulkan.cpp b/ray_tracing__simple/hello_vulkan.cpp index 4a870f2..6efb4aa 100644 --- a/ray_tracing__simple/hello_vulkan.cpp +++ b/ray_tracing__simple/hello_vulkan.cpp @@ -35,6 +35,7 @@ extern std::vector defaultSearchPaths; #include "obj_loader.h" #include "hello_vulkan.h" +#include "nvh/alignment.hpp" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvvk/commands_vk.hpp" @@ -54,6 +55,7 @@ struct CameraMatrices nvmath::mat4f projInverse; }; + //-------------------------------------------------------------------------------------------------- // Keep the handle on the device // Initialize the tool to do all our allocations: buffers, images @@ -161,7 +163,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -192,8 +194,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions(std::vector{ {0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, @@ -212,6 +214,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -238,10 +241,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -314,7 +319,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -332,7 +337,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); @@ -554,9 +559,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -620,55 +625,49 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - // Setting up the creation info of acceleration structure - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - // Building part vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + uint32_t maxPrimitiveCount = model.nbIndices / 3; + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); // Setting up the build info of the acceleration vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); // The primitive itself - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(maxPrimitiveCount); offset.setPrimitiveOffset(0); offset.setTransformOffset(0); // Our blas is only one geometry, but could be made of many geometries - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; @@ -680,7 +679,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { @@ -766,16 +765,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -802,7 +800,7 @@ void HelloVulkan::createRtPipeline() // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -838,10 +836,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -860,18 +858,23 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddress + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -880,7 +883,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -909,24 +912,21 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{0u, 0u, 0u}}; // callable - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // m_size.width, m_size.height, 1); // diff --git a/ray_tracing__simple/hello_vulkan.h b/ray_tracing__simple/hello_vulkan.h index f7fb46a..33dd335 100644 --- a/ray_tracing__simple/hello_vulkan.h +++ b/ray_tracing__simple/hello_vulkan.h @@ -133,18 +133,18 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; diff --git a/ray_tracing__simple/main.cpp b/ray_tracing__simple/main.cpp index e448f03..bdc39c0 100644 --- a/ray_tracing__simple/main.cpp +++ b/ray_tracing__simple/main.cpp @@ -37,6 +37,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -61,19 +62,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -115,17 +113,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); @@ -138,8 +135,12 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); @@ -165,7 +166,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -174,8 +175,8 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); helloVk.createOffscreenRender(); @@ -220,15 +221,18 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -281,6 +285,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_animation/CMakeLists.txt b/ray_tracing_animation/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing_animation/CMakeLists.txt +++ b/ray_tracing_animation/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_animation/README.md b/ray_tracing_animation/README.md index e8c89c2..783bdbe 100644 --- a/ray_tracing_animation/README.md +++ b/ray_tracing_animation/README.md @@ -6,7 +6,7 @@ This is an extension of the Vulkan ray tracing [tutorial](https://nvpro-samples.github.io/vk_raytracing_tutorial_KHR). -We will implement two animation methods: animating only the transformation matrices, and animating the geometry itself. +We will implement two animation methods: only the transformation matrices, and animating the geometry itself. ## Animating the Matrices @@ -76,13 +76,10 @@ Next, we update the buffer that describes the scene, which is used by the raster m_debug.endLabel(cmdBuf); genCmdBuf.submitAndWait(cmdBuf); m_alloc.destroy(stagingBuffer); - - m_rtBuilder.updateTlasMatrices(m_tlas); - m_rtBuilder.updateBlas(2); } ~~~~ -:warning: **Note:** + **Note:** We could have used `cmdBuf.updateBuffer(m_sceneDesc.buffer, 0, m_objInstance)` to update the buffer, but this function only works for buffers with less than 65,536 bytes. If we had 2000 Wuson models, this call wouldn't work. @@ -153,144 +150,22 @@ In the `for` loop, add at the end The last point is to call the update at the end of the function. ~~~~ C++ -m_rtBuilder.updateTlasMatrices(m_tlas); + m_rtBuilder.buildTlas(m_tlas, m_rtFlags, true); ~~~~ ![](images/animation1.gif) -### nvvk::RaytracingBuilder::updateTlasMatrices (Implementation) +### nvvk::RaytracingBuilder::buildTlas (Implementation) -We currently use `nvvk::RaytracingBuilder` to update the matrices for convenience, but -this could be done more efficiently if one kept some of the buffer and memory references. Using a -memory allocator, such as the one described in the [Many Objects Tutorial](vkrt_tuto_instances.md.htm), -could also be an alternative for avoiding multiple reallocations. Here's the implementation of `nvvk::RaytracingBuilder::updateTlasMatrices`. +We are using `nvvk::RaytracingBuilder` to update the matrices for convenience. There +is only a small variation with constructing the matrices and updating them. The main +differences are: -#### Staging Buffer +* The `VkAccelerationStructureBuildGeometryInfoKHR` mode will be set to `VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR` +* We will **not** create the acceleration structure, but reuse it. +* The source and destination of `VkAccelerationStructureCreateInfoKHR` will both use the previously created acceleration structure. -As in the rasterizer, the data needs to be staged before it can be copied to the buffer used for -building the TLAS. - -~~~~ C++ - void updateTlasMatrices(const std::vector& instances) - { - VkDeviceSize bufferSize = instances.size() * sizeof(VkAccelerationStructureInstanceKHR); - // Create a staging buffer on the host to upload the new instance data - nvvkBuffer stagingBuffer = m_alloc.createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, -#if defined(ALLOC_VMA) - VmaMemoryUsage::VMA_MEMORY_USAGE_CPU_TO_GPU -#else - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT -#endif - ); - - // Copy the instance data into the staging buffer - auto* gInst = reinterpret_cast(m_alloc.map(stagingBuffer)); - for(int i = 0; i < instances.size(); i++) - { - gInst[i] = instanceToVkGeometryInstanceKHR(instances[i]); - } - m_alloc.unmap(stagingBuffer); -~~~~ - -#### Scratch Memory - -Building the TLAS always needs scratch memory, and so we need to request it. If -we hadn't set the `eAllowUpdate` flag, the returned size would be zero and the rest of the code -would fail. - -~~~~ C++ - // Compute the amount of scratch memory required by the AS builder to update - VkAccelerationStructureMemoryRequirementsInfoKHR memoryRequirementsInfo{ - VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR}; - memoryRequirementsInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_KHR; - memoryRequirementsInfo.accelerationStructure = m_tlas.as.accel; - memoryRequirementsInfo.buildType = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR; - - VkMemoryRequirements2 reqMem{VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2}; - vkGetAccelerationStructureMemoryRequirementsKHR(m_device, &memoryRequirementsInfo, &reqMem); - VkDeviceSize scratchSize = reqMem.memoryRequirements.size; - - // Allocate the scratch buffer - nvvkBuffer scratchBuffer = - m_alloc.createBuffer(scratchSize, VK_BUFFER_USAGE_RAY_TRACING_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT); - VkBufferDeviceAddressInfo bufferInfo{VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO}; - bufferInfo.buffer = scratchBuffer.buffer; - VkDeviceAddress scratchAddress = vkGetBufferDeviceAddress(m_device, &bufferInfo); -~~~~ - -#### Update the Buffer -In a new command buffer, we copy the staging buffer to the device buffer and -add a barrier to make sure the memory finishes copying before updating the TLAS. - -~~~~ C++ - // Update the instance buffer on the device side and build the TLAS - nvvk::CommandPool genCmdBuf(m_device, m_queueIndex); - VkCommandBuffer cmdBuf = genCmdBuf.createCommandBuffer(); - - VkBufferCopy region{0, 0, bufferSize}; - vkCmdCopyBuffer(cmdBuf, stagingBuffer.buffer, m_instBuffer.buffer, 1, ®ion); - - //VkBufferDeviceAddressInfo bufferInfo{VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO}; - bufferInfo.buffer = m_instBuffer.buffer; - VkDeviceAddress instanceAddress = vkGetBufferDeviceAddress(m_device, &bufferInfo); - - - // Make sure the copy of the instance buffer are copied before triggering the - // acceleration structure build - VkMemoryBarrier barrier{VK_STRUCTURE_TYPE_MEMORY_BARRIER}; - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR; - vkCmdPipelineBarrier(cmdBuf, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, - 0, 1, &barrier, 0, nullptr, 0, nullptr); -~~~~ - -#### Update Acceleration Structure - -We update the TLAS using the same acceleration structure for source and -destination to update it in place, and using the VK_TRUE parameter to trigger the update. - -~~~~ C++ - VkAccelerationStructureGeometryDataKHR geometry{VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR}; - geometry.instances.arrayOfPointers = VK_FALSE; - geometry.instances.data.deviceAddress = instanceAddress; - VkAccelerationStructureGeometryKHR topASGeometry{VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR}; - topASGeometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR; - topASGeometry.geometry = geometry; - - const VkAccelerationStructureGeometryKHR* pGeometry = &topASGeometry; - - VkAccelerationStructureBuildGeometryInfoKHR topASInfo{VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR}; - topASInfo.flags = m_tlas.flags; - topASInfo.update = VK_TRUE; - topASInfo.srcAccelerationStructure = m_tlas.as.accel; - topASInfo.dstAccelerationStructure = m_tlas.as.accel; - topASInfo.geometryArrayOfPointers = VK_FALSE; - topASInfo.geometryCount = 1; - topASInfo.ppGeometries = &pGeometry; - topASInfo.scratchData.deviceAddress = scratchAddress; - - uint32_t nbInstances = (uint32_t)instances.size(); - VkAccelerationStructureBuildOffsetInfoKHR buildOffsetInfo = {nbInstances, 0, 0, 0}; - const VkAccelerationStructureBuildOffsetInfoKHR* pBuildOffsetInfo = &buildOffsetInfo; - - // Build the TLAS - - // Update the acceleration structure. Note the VK_TRUE parameter to trigger the update, - // and the existing TLAS being passed and updated in place - vkCmdBuildAccelerationStructureKHR(cmdBuf, 1, &topASInfo, &pBuildOffsetInfo); - - genCmdBuf.submitAndWait(cmdBuf); -~~~~ - -#### Cleanup - -Finally, we release all temporary buffers. - -~~~~ C++ - m_alloc.destroy(scratchBuffer); - m_alloc.destroy(stagingBuffer); - } -~~~~ +What is happening is the buffer containing all matrices will be updated and the `vkCmdBuildAccelerationStructuresKHR` will update the acceleration in place. ## BLAS Animation @@ -484,14 +359,15 @@ In `main.cpp`, after the other resource creation functions, add the creation fun helloVk.createCompPipelines(); ~~~~ -In the rendering loop, after the call to `animationInstances`, call the object animation function. +In the rendering loop, **before** the call to `animationInstances`, call the object animation function. ~~~~ C++ helloVk.animationObject(diff.count()); ~~~~ -:warning: **Note:** At this point, the object should be animated when using the rasterizer, but should still be immobile when using the ray tracer. +**Note:** Always update the TLAS when BLAS are modified. This will make sure that the TLAS knows about the new bounding box sizes. +**Note:** At this point, the object should be animated when using the rasterizer, but should still be immobile when using the ray tracer. ## Update BLAS diff --git a/ray_tracing_animation/hello_vulkan.cpp b/ray_tracing_animation/hello_vulkan.cpp index dcaf651..0924906 100644 --- a/ray_tracing_animation/hello_vulkan.cpp +++ b/ray_tracing_animation/hello_vulkan.cpp @@ -39,6 +39,7 @@ extern std::vector defaultSearchPaths; #include "nvvk/descriptorsets_vk.hpp" #include "nvvk/pipeline_vk.hpp" +#include "nvh/alignment.hpp" #include "nvh/fileoperations.hpp" #include "nvvk/commands_vk.hpp" #include "nvvk/renderpasses_vk.hpp" @@ -162,7 +163,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -193,8 +194,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -212,6 +213,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -238,10 +240,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -314,7 +318,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -332,9 +336,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -560,9 +565,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -626,49 +631,43 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); - // Consider the geometry opaque for optimization + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); // Nb triangles offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -701,8 +700,10 @@ void HelloVulkan::createTopLevelAS() rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; m_tlas.emplace_back(rayInst); } - m_rtBuilder.buildTlas(m_tlas, vk::BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace - | vk::BuildAccelerationStructureFlagBitsKHR::eAllowUpdate); + + m_rtFlags = vk::BuildAccelerationStructureFlagBitsKHR::ePreferFastTrace + | vk::BuildAccelerationStructureFlagBitsKHR::eAllowUpdate; + m_rtBuilder.buildTlas(m_tlas, m_rtFlags); } //-------------------------------------------------------------------------------------------------- @@ -762,16 +763,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -798,7 +798,7 @@ void HelloVulkan::createRtPipeline() // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -833,10 +833,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -855,18 +855,23 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddress + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -875,7 +880,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -904,23 +909,22 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); - // m_sbtBuffer holds all the shader handles: raygen, n-miss, hit... - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); + + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{0u, 0u, 0u}}; // callable + + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // m_size.width, m_size.height, 1); // m_debug.endLabel(cmdBuf); @@ -966,7 +970,7 @@ void HelloVulkan::animationInstances(float time) genCmdBuf.submitAndWait(cmdBuf); m_alloc.destroy(stagingBuffer); - m_rtBuilder.updateTlasMatrices(m_tlas); + m_rtBuilder.buildTlas(m_tlas, m_rtFlags, true); } void HelloVulkan::animationObject(float time) @@ -1016,10 +1020,9 @@ void HelloVulkan::createCompPipelines() m_compPipelineLayout = m_device.createPipelineLayout(layout_info); vk::ComputePipelineCreateInfo computePipelineCreateInfo{{}, {}, m_compPipelineLayout}; - computePipelineCreateInfo.stage = - nvvk::createShaderStageInfo(m_device, - nvh::loadFile("shaders/anim.comp.spv", true, defaultSearchPaths), - VK_SHADER_STAGE_COMPUTE_BIT); + computePipelineCreateInfo.stage = nvvk::createShaderStageInfo( + m_device, nvh::loadFile("shaders/anim.comp.spv", true, defaultSearchPaths, true), + VK_SHADER_STAGE_COMPUTE_BIT); m_compPipeline = static_cast( m_device.createComputePipeline({}, computePipelineCreateInfo)); m_device.destroy(computePipelineCreateInfo.stage.module); diff --git a/ray_tracing_animation/hello_vulkan.h b/ray_tracing_animation/hello_vulkan.h index 7a904c5..d384493 100644 --- a/ray_tracing_animation/hello_vulkan.h +++ b/ray_tracing_animation/hello_vulkan.h @@ -132,18 +132,18 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; @@ -154,8 +154,8 @@ public: vk::Pipeline m_rtPipeline; nvvk::Buffer m_rtSBTBuffer; - std::vector m_tlas; - std::vector m_blas; + std::vector m_tlas; + std::vector m_blas; struct RtPushConstant { @@ -180,4 +180,6 @@ public: vk::DescriptorSet m_compDescSet; vk::Pipeline m_compPipeline; vk::PipelineLayout m_compPipelineLayout; + + vk::BuildAccelerationStructureFlagsKHR m_rtFlags; }; diff --git a/ray_tracing_animation/main.cpp b/ray_tracing_animation/main.cpp index 7e8e548..4e353a6 100644 --- a/ray_tracing_animation/main.cpp +++ b/ray_tracing_animation/main.cpp @@ -36,6 +36,7 @@ #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -62,19 +63,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -116,19 +114,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); #ifdef _WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); @@ -143,11 +138,16 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); // Creating Vulkan base application nvvk::Context vkctx{}; @@ -167,7 +167,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -176,13 +176,13 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true), nvmath::scale_mat4(nvmath::vec3f(2.f, 1.f, 2.f))); - helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths, true)); HelloVulkan::ObjInstance inst = helloVk.m_objInstance.back(); for(int i = 0; i < 5; i++) helloVk.m_objInstance.push_back(inst); - helloVk.loadModel(nvh::findFile("media/scenes/sphere.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/sphere.obj", defaultSearchPaths, true)); helloVk.createOffscreenRender(); @@ -232,21 +232,23 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // #VK_animation std::chrono::duration diff = std::chrono::system_clock::now() - start; - helloVk.animationInstances(diff.count()); helloVk.animationObject(diff.count()); + helloVk.animationInstances(diff.count()); // Start rendering the scene helloVk.prepareFrame(); @@ -298,6 +300,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_anyhit/CMakeLists.txt b/ray_tracing_anyhit/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing_anyhit/CMakeLists.txt +++ b/ray_tracing_anyhit/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_anyhit/README.md b/ray_tracing_anyhit/README.md index 1365641..4c7a465 100644 --- a/ray_tracing_anyhit/README.md +++ b/ray_tracing_anyhit/README.md @@ -17,7 +17,7 @@ The any hit shader can be useful for discarding intersections, such as for alpha used for simple transparency. In this example we will show what is needed to do to add this shader type and to create a transparency effect. -:warning: **Note:** + **Note:** This example is based on many elements from the [Antialiasing Tutorial](vkrt_tuto_jitter_cam.md.htm). @@ -49,7 +49,7 @@ layout(binding = 1, set = 1, scalar) buffer MatColorBufferObject { WaveFrontMate // clang-format on ~~~~ -:warning: **Note:** + **Note:** You can find the source of `random.glsl` in the Antialiasing Tutorial [here](../ray_tracing_jitter_cam/README.md#toc1.1). @@ -205,11 +205,11 @@ uint flags = gl_RayFlagsSkipClosestHitShaderEXT; For a more interesting scene, you can replace the `helloVk.loadModel` calls in `main()` with the following scene: ~~~~ C++ - helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/sphere.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/sphere.obj", defaultSearchPaths, true), nvmath::scale_mat4(nvmath::vec3f(1.5f)) * nvmath::translation_mat4(nvmath::vec3f(0.0f, 1.0f, 0.0f))); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); ~~~~ ## OBJ Materials @@ -259,7 +259,7 @@ And we need to add the following to the ray tracing pipeline, a copy of the prev Create two new files `raytrace_0.ahit` and `raytrace_1.ahit`, and rename `raytrace.ahit` to `raytrace_ahit.glsl` -:warning: **Note:** + **Note:** Cmake need to be re-run to add the new files to the project. In `raytrace_0.ahit` add the following code @@ -390,7 +390,7 @@ m_rtShaderGroups.push_back(hg); At the end of the function, delete the shader module `ahit1SM`. -:warning: **Note:** Re-Run + **Note:** Re-Run Everything should work as before, but now it does it right. diff --git a/ray_tracing_anyhit/hello_vulkan.cpp b/ray_tracing_anyhit/hello_vulkan.cpp index 1460d7a..300e755 100644 --- a/ray_tracing_anyhit/hello_vulkan.cpp +++ b/ray_tracing_anyhit/hello_vulkan.cpp @@ -39,6 +39,7 @@ extern std::vector defaultSearchPaths; #include "nvvk/descriptorsets_vk.hpp" #include "nvvk/pipeline_vk.hpp" +#include "nvh/alignment.hpp" #include "nvh/fileoperations.hpp" #include "nvvk/commands_vk.hpp" #include "nvvk/renderpasses_vk.hpp" @@ -165,7 +166,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -196,8 +197,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -215,6 +216,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -241,10 +243,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -317,7 +321,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -335,9 +339,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -556,9 +561,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -622,50 +627,43 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation); // Avoid double hits asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -673,7 +671,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { @@ -759,16 +757,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -796,10 +793,10 @@ void HelloVulkan::createRtPipeline() // Payload 0 vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::ShaderModule ahitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rahit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rahit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR}; @@ -812,7 +809,7 @@ void HelloVulkan::createRtPipeline() // Payload 1 vk::ShaderModule ahit1SM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace_1.rahit.spv", true, paths)); + nvh::loadFile("shaders/raytrace_1.rahit.spv", true, paths, true)); hg.setClosestHitShader(VK_SHADER_UNUSED_KHR); // Not used by shadow (skipped) stages.push_back({{}, vk::ShaderStageFlagBits::eAnyHitKHR, ahit1SM, "main"}); hg.setAnyHitShader(static_cast(stages.size() - 1)); @@ -843,9 +840,9 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = m_device.createRayTracingPipelineKHR({}, rayPipelineInfo).value; + m_rtPipeline = m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo).value; m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -866,18 +863,23 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddressKHR + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -886,7 +888,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -919,24 +921,23 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - // m_sbtBuffer holds all the shader handles: raygen, n-miss, hit... - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // - m_size.width, m_size.height, 1); // + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{0u, 0u, 0u}}; // callable + + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // + m_size.width, m_size.height, + 1); // m_debug.endLabel(cmdBuf); @@ -949,12 +950,16 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& void HelloVulkan::updateFrame() { static nvmath::mat4f refCamMatrix; + static float refFov{CameraManip.getFov()}; - auto& m = CameraManip.getMatrix(); - if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0) + const auto& m = CameraManip.getMatrix(); + const auto fov = CameraManip.getFov(); + + if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0 || refFov != fov) { resetFrame(); refCamMatrix = m; + refFov = fov; } m_rtPushConstants.frame++; } diff --git a/ray_tracing_anyhit/hello_vulkan.h b/ray_tracing_anyhit/hello_vulkan.h index 10ce562..9d6279f 100644 --- a/ray_tracing_anyhit/hello_vulkan.h +++ b/ray_tracing_anyhit/hello_vulkan.h @@ -132,19 +132,19 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); void resetFrame(); void updateFrame(); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; diff --git a/ray_tracing_anyhit/main.cpp b/ray_tracing_anyhit/main.cpp index 3d38da3..55a6fa7 100644 --- a/ray_tracing_anyhit/main.cpp +++ b/ray_tracing_anyhit/main.cpp @@ -36,6 +36,7 @@ #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -61,19 +62,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -115,19 +113,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); @@ -141,8 +136,15 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); + // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); + contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); @@ -166,7 +168,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -175,11 +177,11 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/sphere.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/sphere.obj", defaultSearchPaths, true), nvmath::scale_mat4(nvmath::vec3f(1.5f)) * nvmath::translation_mat4(nvmath::vec3f(0.0f, 1.0f, 0.0f))); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); helloVk.createOffscreenRender(); @@ -224,15 +226,17 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -285,6 +289,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_anyhit/shaders/raytrace.rahit b/ray_tracing_anyhit/shaders/raytrace.rahit index 6af0802..def0fe8 100644 --- a/ray_tracing_anyhit/shaders/raytrace.rahit +++ b/ray_tracing_anyhit/shaders/raytrace.rahit @@ -35,7 +35,7 @@ void main() return; if(mat.dissolve == 0.0) - ignoreIntersectionEXT(); + ignoreIntersectionEXT; else if(rnd(prd.seed) > mat.dissolve) - ignoreIntersectionEXT(); + ignoreIntersectionEXT; } diff --git a/ray_tracing_anyhit/shaders/raytrace_rahit.glsl b/ray_tracing_anyhit/shaders/raytrace_rahit.glsl index a1fb942..12918cd 100644 --- a/ray_tracing_anyhit/shaders/raytrace_rahit.glsl +++ b/ray_tracing_anyhit/shaders/raytrace_rahit.glsl @@ -39,7 +39,7 @@ void main() return; if(mat.dissolve == 0.0) - ignoreIntersectionEXT(); + ignoreIntersectionEXT; else if(rnd(prd.seed) > mat.dissolve) - ignoreIntersectionEXT(); + ignoreIntersectionEXT; } diff --git a/ray_tracing_callable/CMakeLists.txt b/ray_tracing_callable/CMakeLists.txt index 590ec4f..c374896 100644 --- a/ray_tracing_callable/CMakeLists.txt +++ b/ray_tracing_callable/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,6 +42,7 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" "shaders/*.rcall" @@ -44,41 +51,27 @@ foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -91,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_callable/README.md b/ray_tracing_callable/README.md index b190cc8..c536bc9 100644 --- a/ray_tracing_callable/README.md +++ b/ray_tracing_callable/README.md @@ -101,9 +101,9 @@ m_device.destroy(call2); Here are the source of all shaders -* [light_point.rcall](https://github.com/nvpro-samples/vk_raytracing_tutorial_KHR/blob/master/ray_tracing_callable/shaders/light_point.rcall) -* [light_spot.rcall](https://github.com/nvpro-samples/vk_raytracing_tutorial_KHR/blob/master/ray_tracing_callable/shaders/light_spot.rcall) -* [light_inf.rcall](https://github.com/nvpro-samples/vk_raytracing_tutorial_KHR/blob/master/ray_tracing_callable/shaders/light_inf.rcall) +* [light_point.rcall](shaders/light_point.rcall) +* [light_spot.rcall](shaders/light_spot.rcall) +* [light_inf.rcall](shaders/light_inf.rcall) ### Passing Callable to traceRaysKHR @@ -116,19 +116,19 @@ In `HelloVulkan::raytrace()`, we have to tell where the callable shader starts. Therefore, the callable starts at `4 * progSize` ~~~~ C++ -vk::DeviceSize callableGroupOffset = 4u * progSize; // Jump over the previous shaders -vk::DeviceSize callableGroupStride = progSize; + std::array strideAddresses{ + stride{sbtAddress + 0u * progSize, progSize, progSize * 1}, // raygen + stride{sbtAddress + 1u * progSize, progSize, progSize * 2}, // miss + stride{sbtAddress + 3u * progSize, progSize, progSize * 1}, // hit + stride{sbtAddress + 4u * progSize, progSize, progSize * 1}}; // callable ~~~~ Then we can call `traceRaysKHR` ~~~~ C++ -const vk::StridedBufferRegionKHR callableShaderBindingTable = { - m_rtSBTBuffer.buffer, callableGroupOffset, progSize, sbtSize}; - -cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // - m_size.width, m_size.height, 1); // + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // + m_size.width, m_size.height, 1); // ~~~~ ## Calling the Callable Shaders diff --git a/ray_tracing_callable/hello_vulkan.cpp b/ray_tracing_callable/hello_vulkan.cpp index 8df376c..aa65458 100644 --- a/ray_tracing_callable/hello_vulkan.cpp +++ b/ray_tracing_callable/hello_vulkan.cpp @@ -39,6 +39,7 @@ extern std::vector defaultSearchPaths; #include "nvvk/descriptorsets_vk.hpp" #include "nvvk/pipeline_vk.hpp" +#include "nvh/alignment.hpp" #include "nvh/fileoperations.hpp" #include "nvvk/commands_vk.hpp" #include "nvvk/renderpasses_vk.hpp" @@ -162,7 +163,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -193,8 +194,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -212,6 +213,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -238,10 +240,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -314,7 +318,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -332,9 +336,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -553,9 +558,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -619,47 +624,46 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - nvvk::RaytracingBuilderKHR::Blas blas; - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices + nvvk::RaytracingBuilderKHR::BlasInput blas; + vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); + // Consider the geometry opaque for optimization asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); offset.setPrimitiveOffset(0); offset.setTransformOffset(0); + blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -667,7 +671,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { @@ -753,16 +757,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -789,7 +792,7 @@ void HelloVulkan::createRtPipeline() // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -805,12 +808,13 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule call0 = nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/light_point.rcall.spv", true, paths)); + nvh::loadFile("shaders/light_point.rcall.spv", true, paths, true)); vk::ShaderModule call1 = nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/light_spot.rcall.spv", true, paths)); + nvh::loadFile("shaders/light_spot.rcall.spv", true, paths, true)); vk::ShaderModule call2 = - nvvk::createShaderModule(m_device, nvh::loadFile("shaders/light_inf.rcall.spv", true, paths)); + nvvk::createShaderModule(m_device, + nvh::loadFile("shaders/light_inf.rcall.spv", true, paths, true)); stages.push_back({{}, vk::ShaderStageFlagBits::eCallableKHR, call0, "main"}); callGroup.setGeneralShader(static_cast(stages.size() - 1)); @@ -850,10 +854,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -875,18 +879,23 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddressKHR + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -895,7 +904,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -928,28 +937,23 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eCallableKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders - vk::DeviceSize hitGroupStride = progSize; - vk::DeviceSize callableGroupOffset = 4u * progSize; // Jump over the previous shaders - vk::DeviceSize callableGroupStride = progSize; - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable = { - m_rtSBTBuffer.buffer, callableGroupOffset, progSize, sbtSize}; + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{sbtAddress + 4u * groupSize, groupStride, groupSize * 1}}; // callable - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // m_size.width, m_size.height, 1); // + m_debug.endLabel(cmdBuf); } diff --git a/ray_tracing_callable/hello_vulkan.h b/ray_tracing_callable/hello_vulkan.h index 662dcea..85f25ed 100644 --- a/ray_tracing_callable/hello_vulkan.h +++ b/ray_tracing_callable/hello_vulkan.h @@ -136,18 +136,18 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; diff --git a/ray_tracing_callable/main.cpp b/ray_tracing_callable/main.cpp index f3604bf..58a332f 100644 --- a/ray_tracing_callable/main.cpp +++ b/ray_tracing_callable/main.cpp @@ -37,6 +37,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -61,35 +62,32 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light", ImGuiTreeNodeFlags_DefaultOpen)) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); - } - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Spot", &helloVk.m_pushConstant.lightType, 1); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 2); - if(helloVk.m_pushConstant.lightType < 2) - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - if(helloVk.m_pushConstant.lightType > 0) - ImGui::SliderFloat3("Light Direction", &helloVk.m_pushConstant.lightDirection.x, -1.f, 1.f); - if(helloVk.m_pushConstant.lightType < 2) - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 500.f); - if(helloVk.m_pushConstant.lightType == 1) - { - float dCutoff = rad2deg(acos(helloVk.m_pushConstant.lightSpotCutoff)); - float dOutCutoff = rad2deg(acos(helloVk.m_pushConstant.lightSpotOuterCutoff)); - ImGui::SliderFloat("Cutoff", &dCutoff, 0.f, 45.f); - ImGui::SliderFloat("OutCutoff", &dOutCutoff, 0.f, 45.f); - dCutoff = dCutoff > dOutCutoff ? dOutCutoff : dCutoff; + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Spot", &helloVk.m_pushConstant.lightType, 1); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 2); - helloVk.m_pushConstant.lightSpotCutoff = cos(deg2rad(dCutoff)); - helloVk.m_pushConstant.lightSpotOuterCutoff = cos(deg2rad(dOutCutoff)); + if(helloVk.m_pushConstant.lightType < 2) + ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + if(helloVk.m_pushConstant.lightType > 0) + ImGui::SliderFloat3("Light Direction", &helloVk.m_pushConstant.lightDirection.x, -1.f, 1.f); + if(helloVk.m_pushConstant.lightType < 2) + ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 500.f); + if(helloVk.m_pushConstant.lightType == 1) + { + float dCutoff = rad2deg(acos(helloVk.m_pushConstant.lightSpotCutoff)); + float dOutCutoff = rad2deg(acos(helloVk.m_pushConstant.lightSpotOuterCutoff)); + ImGui::SliderFloat("Cutoff", &dCutoff, 0.f, 45.f); + ImGui::SliderFloat("OutCutoff", &dOutCutoff, 0.f, 45.f); + dCutoff = dCutoff > dOutCutoff ? dOutCutoff : dCutoff; + + helloVk.m_pushConstant.lightSpotCutoff = cos(deg2rad(dCutoff)); + helloVk.m_pushConstant.lightSpotOuterCutoff = cos(deg2rad(dOutCutoff)); + } } } @@ -132,19 +130,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); #ifdef _WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, false); @@ -159,11 +154,17 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); + // Creating Vulkan base application nvvk::Context vkctx{}; @@ -183,7 +184,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -192,8 +193,8 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); helloVk.createOffscreenRender(); @@ -238,15 +239,17 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -299,6 +302,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_gltf/CMakeLists.txt b/ray_tracing_gltf/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing_gltf/CMakeLists.txt +++ b/ray_tracing_gltf/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_gltf/README.md b/ray_tracing_gltf/README.md index 75a03c9..de6c23f 100644 --- a/ray_tracing_gltf/README.md +++ b/ray_tracing_gltf/README.md @@ -95,7 +95,7 @@ Then we will flatten the scene graph and grab the information we will need using nvh::GltfAttributes::Normal | nvh::GltfAttributes::Texcoord_0); ~~~~ -The next par is to allocate the buffers to hold the information, such as the positions, normals, texture coordinates, etc. +The next part is to allocate the buffers to hold the information, such as the positions, normals, texture coordinates, etc. ~~~~C m_vertexBuffer = @@ -145,35 +145,26 @@ The function is similar, only the input is different. // nvvk::RaytracingBuilderKHR::Blas HelloVulkan::primitiveToGeometry(const nvh::GltfPrimMesh& prim) { - // Setting up the creation info of acceleration structure - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(prim.indexCount / 3); // Nb triangles - asCreate.setMaxVertexCount(prim.vertexCount); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - - // Building part + // Building part vk::DeviceAddress vertexAddress = m_device.getBufferAddress({m_vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({m_indexBuffer.buffer}); vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(nvmath::vec3f)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(prim.vertexCount); // Setting up the build info of the acceleration vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation); // For AnyHit asGeom.geometry.setTriangles(triangles); - - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(prim.vertexOffset); offset.setPrimitiveCount(prim.indexCount / 3); offset.setPrimitiveOffset(prim.firstIndex * sizeof(uint32_t)); @@ -181,7 +172,6 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::primitiveToGeometry(const nvh::Glt nvvk::RaytracingBuilderKHR::Blas blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -283,7 +273,7 @@ Camera position Scene ~~~~C - helloVk.loadScene(nvh::findFile("media/scenes/cornellBox.gltf", defaultSearchPaths)); + helloVk.loadScene(nvh::findFile("media/scenes/cornellBox.gltf", defaultSearchPaths, true)); ~~~~ Light Position @@ -310,12 +300,16 @@ Add the following two functions in `hello_vulkan.cpp`: void HelloVulkan::updateFrame() { static nvmath::mat4f refCamMatrix; + static float refFov{CameraManip.getFov()}; - auto& m = CameraManip.getMatrix(); - if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0) + const auto& m = CameraManip.getMatrix(); + const auto fov = CameraManip.getFov(); + + if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0 || refFov != fov) { resetFrame(); refCamMatrix = m; + refFov = fov; } m_rtPushConstants.frame++; } @@ -505,7 +499,7 @@ First initialize the `payload` and variable to compute the accumulation. Now the loop over the trace function, will be like the following. -:warning: **Note:** the depth is hardcode, but could be a parameter to the `push constant`. + **Note:** the depth is hardcode, but could be a parameter to the `push constant`. ~~~~C for(; prd.depth < 10; prd.depth++) @@ -528,6 +522,6 @@ Now the loop over the trace function, will be like the following. } ~~~~ -:warning: **Note:** do not forget to use `hitValue` in the `imageStore`. +**Note:** do not forget to use `hitValue` in the `imageStore`. diff --git a/ray_tracing_gltf/hello_vulkan.cpp b/ray_tracing_gltf/hello_vulkan.cpp index 66fc308..d0a8dbd 100644 --- a/ray_tracing_gltf/hello_vulkan.cpp +++ b/ray_tracing_gltf/hello_vulkan.cpp @@ -46,6 +46,7 @@ extern std::vector defaultSearchPaths; #include "nvvk/renderpasses_vk.hpp" #include "nvvk/shaders_vk.hpp" +#include "nvh/alignment.hpp" #include "shaders/binding.glsl" // Holding the camera matrices @@ -182,8 +183,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescriptions( {{0, sizeof(nvmath::vec3)}, {1, sizeof(nvmath::vec3)}, {2, sizeof(nvmath::vec2)}}); gpb.addAttributeDescriptions({ @@ -205,6 +206,7 @@ void HelloVulkan::loadScene(const std::string& filename) tinygltf::TinyGLTF tcontext; std::string warn, error; + LOGI("Loading file: %s", filename.c_str()); if(!tcontext.LoadASCIIFromFile(&tmodel, &error, &warn, filename)) { assert(!"Error while loading scene"); @@ -223,10 +225,12 @@ void HelloVulkan::loadScene(const std::string& filename) m_vertexBuffer = m_alloc.createBuffer(cmdBuf, m_gltfScene.m_positions, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); m_indexBuffer = m_alloc.createBuffer(cmdBuf, m_gltfScene.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); m_normalBuffer = m_alloc.createBuffer(cmdBuf, m_gltfScene.m_normals, vkBU::eVertexBuffer | vkBU::eStorageBuffer); m_uvBuffer = m_alloc.createBuffer(cmdBuf, m_gltfScene.m_texcoords0, @@ -525,9 +529,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -591,54 +595,46 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a GLTF primitive in the Raytracing Geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::primitiveToGeometry(const nvh::GltfPrimMesh& prim) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::primitiveToGeometry( + const nvh::GltfPrimMesh& prim) { - // Setting up the creation info of acceleration structure - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(prim.indexCount / 3); // Nb triangles - asCreate.setMaxVertexCount(prim.vertexCount); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - // Building part vk::DeviceAddress vertexAddress = m_device.getBufferAddress({m_vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({m_indexBuffer.buffer}); vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(nvmath::vec3f)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(prim.vertexCount); // Setting up the build info of the acceleration vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eNoDuplicateAnyHitInvocation); // For AnyHit asGeom.geometry.setTriangles(triangles); - - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(prim.vertexOffset); offset.setPrimitiveCount(prim.indexCount / 3); offset.setPrimitiveOffset(prim.firstIndex * sizeof(uint32_t)); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -649,7 +645,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::primitiveToGeometry(const nvh::Glt void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_gltfScene.m_primMeshes.size()); for(auto& primMesh : m_gltfScene.m_primMeshes) { @@ -738,16 +734,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/pathtrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/pathtrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/pathtrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/pathtrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -774,7 +769,7 @@ void HelloVulkan::createRtPipeline() // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/pathtrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/pathtrace.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -810,10 +805,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -832,18 +827,24 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + if(result != vk::Result::eSuccess) + LOGE("Fail getRayTracingShaderGroupHandlesKHR: %s", vk::to_string(result)); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddressKHR + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -852,7 +853,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -883,25 +884,23 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{0u, 0u, 0u}}; // callable - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // - m_size.width, m_size.height, 1); // + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // + m_size.width, m_size.height, + 1); // m_debug.endLabel(cmdBuf); @@ -914,12 +913,16 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& void HelloVulkan::updateFrame() { static nvmath::mat4f refCamMatrix; + static float refFov{CameraManip.getFov()}; - auto& m = CameraManip.getMatrix(); - if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0) + const auto& m = CameraManip.getMatrix(); + const auto fov = CameraManip.getFov(); + + if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0 || refFov != fov) { resetFrame(); refCamMatrix = m; + refFov = fov; } m_rtPushConstants.frame++; } diff --git a/ray_tracing_gltf/hello_vulkan.h b/ray_tracing_gltf/hello_vulkan.h index 9d71ca9..190f107 100644 --- a/ray_tracing_gltf/hello_vulkan.h +++ b/ray_tracing_gltf/hello_vulkan.h @@ -127,7 +127,7 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - nvvk::RaytracingBuilderKHR::Blas primitiveToGeometry(const nvh::GltfPrimMesh& prim); + nvvk::RaytracingBuilderKHR::BlasInput primitiveToGeometry(const nvh::GltfPrimMesh& prim); void initRayTracing(); void createBottomLevelAS(); @@ -140,7 +140,7 @@ public: void updateFrame(); void resetFrame(); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; diff --git a/ray_tracing_gltf/main.cpp b/ray_tracing_gltf/main.cpp index c8469a4..bd6eb4f 100644 --- a/ray_tracing_gltf/main.cpp +++ b/ray_tracing_gltf/main.cpp @@ -37,6 +37,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -61,19 +62,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -115,18 +113,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #else @@ -138,13 +134,17 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_SHADER_CLOCK_EXTENSION_NAME); + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); // Creating Vulkan base application @@ -166,7 +166,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -175,7 +175,7 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadScene(nvh::findFile("media/scenes/cornellBox.gltf", defaultSearchPaths)); + helloVk.loadScene(nvh::findFile("media/scenes/cornellBox.gltf", defaultSearchPaths, true)); helloVk.createOffscreenRender(); @@ -219,15 +219,17 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -280,6 +282,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_instances/CMakeLists.txt b/ray_tracing_instances/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing_instances/CMakeLists.txt +++ b/ray_tracing_instances/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_instances/README.md b/ray_tracing_instances/README.md index 4b47ce6..95f586f 100644 --- a/ray_tracing_instances/README.md +++ b/ray_tracing_instances/README.md @@ -30,9 +30,9 @@ Then replace the calls to `helloVk.loadModel` in `main()` by ~~~~ C++ // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); std::random_device rd; // Will be used to obtain a seed for the random number engine std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd() @@ -55,7 +55,7 @@ Then replace the calls to `helloVk.loadModel` in `main()` by } ~~~~ -:warning: **Note:** + **Note:** This will create 3 models (OBJ) and their instances, and then add 2000 instances distributed between green cubes and cubes with one color per face. @@ -73,7 +73,7 @@ Remove the previous code and replace it with the following std::normal_distribution disn(0.05f, 0.05f); for(int n = 0; n < 2000; ++n) { - helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths, true)); HelloVulkan::ObjInstance& inst = helloVk.m_objInstance.back(); float scale = fabsf(disn(gen)); @@ -85,7 +85,7 @@ Remove the previous code and replace it with the following inst.transformIT = nvmath::transpose(nvmath::invert((inst.transform))); } - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); ~~~~ The example might still work, but the console will print the following error after loading 1363 objects. All other objects allocated after the 1363rd will fail to be displayed. diff --git a/ray_tracing_instances/hello_vulkan.cpp b/ray_tracing_instances/hello_vulkan.cpp index 0f74645..de3247f 100644 --- a/ray_tracing_instances/hello_vulkan.cpp +++ b/ray_tracing_instances/hello_vulkan.cpp @@ -41,6 +41,7 @@ extern std::vector defaultSearchPaths; #include "nvvk/descriptorsets_vk.hpp" #include "nvvk/pipeline_vk.hpp" +#include "nvh/alignment.hpp" #include "nvh/fileoperations.hpp" #include "nvvk/commands_vk.hpp" #include "nvvk/renderpasses_vk.hpp" @@ -178,7 +179,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -209,8 +210,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -228,6 +229,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -254,10 +256,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -330,7 +334,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -348,9 +352,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -575,9 +580,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -641,47 +646,43 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - nvvk::RaytracingBuilderKHR::Blas blas; - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); - // Consider the geometry opaque for optimization + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); // nb triangles offset.setPrimitiveOffset(0); offset.setTransformOffset(0); + + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -689,7 +690,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { @@ -775,16 +776,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -811,7 +811,7 @@ void HelloVulkan::createRtPipeline() // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -846,10 +846,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -868,18 +868,23 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddressKHR + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -888,7 +893,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -917,25 +922,22 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - // m_sbtBuffer holds all the shader handles: raygen, n-miss, hit... - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{0u, 0u, 0u}}; // callable + + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // m_size.width, m_size.height, 1); // - m_debug.endLabel(cmdBuf); } diff --git a/ray_tracing_instances/hello_vulkan.h b/ray_tracing_instances/hello_vulkan.h index 5134f27..0eac12e 100644 --- a/ray_tracing_instances/hello_vulkan.h +++ b/ray_tracing_instances/hello_vulkan.h @@ -145,18 +145,18 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; diff --git a/ray_tracing_instances/main.cpp b/ray_tracing_instances/main.cpp index 27a9f1c..baa43c3 100644 --- a/ray_tracing_instances/main.cpp +++ b/ray_tracing_instances/main.cpp @@ -38,6 +38,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -62,19 +63,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -116,20 +114,17 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #else @@ -143,11 +138,16 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); // Creating Vulkan base application nvvk::Context vkctx{}; @@ -167,7 +167,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -182,7 +182,7 @@ int main(int argc, char** argv) std::normal_distribution disn(0.05f, 0.05f); for(int n = 0; n < 2000; ++n) { - helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths, true)); HelloVulkan::ObjInstance& inst = helloVk.m_objInstance.back(); float scale = fabsf(disn(gen)); @@ -194,7 +194,7 @@ int main(int argc, char** argv) inst.transformIT = nvmath::transpose(nvmath::invert((inst.transform))); } - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); helloVk.createOffscreenRender(); helloVk.createDescriptorSetLayout(); @@ -238,15 +238,17 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -299,6 +301,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_intersection/CMakeLists.txt b/ray_tracing_intersection/CMakeLists.txt index 36119de..c374896 100644 --- a/ray_tracing_intersection/CMakeLists.txt +++ b/ray_tracing_intersection/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -39,46 +45,33 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -91,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_intersection/README.md b/ray_tracing_intersection/README.md index 8eb8428..8d2344a 100644 --- a/ray_tracing_intersection/README.md +++ b/ray_tracing_intersection/README.md @@ -190,11 +190,11 @@ In `main.cpp`, where we are loading the OBJ model, we can replace it with ~~~~ C++ // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); helloVk.createSpheres(); ~~~~ -:warning: **Note:** it is possible to have more OBJ models, but the spheres will need to be added after all of them. + **Note:** it is possible to have more OBJ models, but the spheres will need to be added after all of them. The scene will be large, better to move the camera out @@ -248,7 +248,7 @@ Just before building the TLAS, we need to add the following rayInst.instanceId = static_cast(tlas.size()); // gl_InstanceID rayInst.blasId = static_cast(m_objModel.size()); rayInst.hitGroupId = 1; // We will use the same hit group for all objects - rayInst.flags = vk::GeometryInstanceFlagBitsKHR::eTriangleCullDisable; + rayInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR; tlas.emplace_back(rayInst); } ~~~~ diff --git a/ray_tracing_intersection/hello_vulkan.cpp b/ray_tracing_intersection/hello_vulkan.cpp index 6ff3db6..998b71d 100644 --- a/ray_tracing_intersection/hello_vulkan.cpp +++ b/ray_tracing_intersection/hello_vulkan.cpp @@ -43,6 +43,7 @@ extern std::vector defaultSearchPaths; #include "nvvk/commands_vk.hpp" #include "nvvk/renderpasses_vk.hpp" +#include "nvh/alignment.hpp" #include "nvvk/shaders_vk.hpp" #include @@ -172,7 +173,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -203,8 +204,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -222,6 +223,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -248,10 +250,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -324,7 +328,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -342,9 +346,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -568,9 +573,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -634,50 +639,44 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); // Setting up the build info of the acceleration vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); // Nb triangles offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -685,37 +684,30 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod //-------------------------------------------------------------------------------------------------- // Returning the ray tracing geometry used for the BLAS, containing all spheres // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::sphereToVkGeometryKHR() +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::sphereToVkGeometryKHR() { - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eAabbs); - asCreate.setMaxPrimitiveCount((uint32_t)m_spheres.size()); // Nb triangles - asCreate.setIndexType(vk::IndexType::eNoneKHR); - asCreate.setVertexFormat(vk::Format::eUndefined); - asCreate.setMaxVertexCount(0); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - - vk::DeviceAddress dataAddress = m_device.getBufferAddress({m_spheresAabbBuffer.buffer}); + vk::AccelerationStructureGeometryAabbsDataKHR aabbs; aabbs.setData(dataAddress); aabbs.setStride(sizeof(Aabb)); - // Setting up the build info of the acceleration - vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); - asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); - asGeom.geometry.setAabbs(aabbs); + // Setting up the build info of the acceleration (C version, c++ gives wrong type) + vk::AccelerationStructureGeometryKHR asGeom(vk::GeometryTypeKHR::eAabbs, aabbs, + vk::GeometryFlagBitsKHR::eOpaque); + //asGeom.geometryType = vk::GeometryTypeKHR::eAabbs; + //asGeom.flags = vk::GeometryFlagBitsKHR::eOpaque; + //asGeom.geometry.aabbs = aabbs; - vk::AccelerationStructureBuildOffsetInfoKHR offset; + + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount((uint32_t)m_spheres.size()); // Nb aabb offset.setPrimitiveOffset(0); offset.setTransformOffset(0); - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -754,11 +746,11 @@ void HelloVulkan::createSpheres(uint32_t nbSpheres) // Creating two materials MaterialObj mat; - mat.diffuse = vec3f(0, 1, 1); + mat.diffuse = nvmath::vec3f(0, 1, 1); std::vector materials; std::vector matIdx(nbSpheres); materials.emplace_back(mat); - mat.diffuse = vec3f(1, 1, 0); + mat.diffuse = nvmath::vec3f(1, 1, 0); materials.emplace_back(mat); // Assign a material to each sphere @@ -787,7 +779,7 @@ void HelloVulkan::createSpheres(uint32_t nbSpheres) void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { @@ -892,16 +884,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -928,7 +919,7 @@ void HelloVulkan::createRtPipeline() // Hit Group0 - Closest Hit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); { vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, @@ -942,10 +933,10 @@ void HelloVulkan::createRtPipeline() // Hit Group1 - Closest Hit + Intersection (procedural) vk::ShaderModule chit2SM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace2.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace2.rchit.spv", true, paths, true)); vk::ShaderModule rintSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rint.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rint.spv", true, paths, true)); { vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eProceduralHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -983,10 +974,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -1007,18 +998,23 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddressKHR + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -1027,7 +1023,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -1056,25 +1052,22 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - // m_sbtBuffer holds all the shader handles: raygen, n-miss, hit... - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{0u, 0u, 0u}}; // callable + + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // m_size.width, m_size.height, 1); // - m_debug.endLabel(cmdBuf); } diff --git a/ray_tracing_intersection/hello_vulkan.h b/ray_tracing_intersection/hello_vulkan.h index 0521ea6..7e0f7f5 100644 --- a/ray_tracing_intersection/hello_vulkan.h +++ b/ray_tracing_intersection/hello_vulkan.h @@ -132,18 +132,18 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; @@ -175,7 +175,7 @@ public: nvmath::vec3f maximum; }; - nvvk::RaytracingBuilderKHR::Blas sphereToVkGeometryKHR(); + nvvk::RaytracingBuilderKHR::BlasInput sphereToVkGeometryKHR(); std::vector m_spheres; // All spheres nvvk::Buffer m_spheresBuffer; // Buffer holding the spheres diff --git a/ray_tracing_intersection/main.cpp b/ray_tracing_intersection/main.cpp index 700edaa..1c63c05 100644 --- a/ray_tracing_intersection/main.cpp +++ b/ray_tracing_intersection/main.cpp @@ -37,6 +37,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -61,19 +62,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -200.f, 200.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 1000.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); ImGui::Text("Nb Spheres and Cubes: %d", helloVk.m_spheres.size()); } @@ -116,20 +114,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #else @@ -143,11 +137,17 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + // #VKRay: Activate the ray tracing extension + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); // Creating Vulkan base application nvvk::Context vkctx{}; @@ -167,7 +167,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -176,8 +176,8 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - // helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + // helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); helloVk.createSpheres(2000000); helloVk.createOffscreenRender(); @@ -222,15 +222,17 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -283,6 +285,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_jitter_cam/CMakeLists.txt b/ray_tracing_jitter_cam/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing_jitter_cam/CMakeLists.txt +++ b/ray_tracing_jitter_cam/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_jitter_cam/README.md b/ray_tracing_jitter_cam/README.md index 6612e71..a7b7076 100644 --- a/ray_tracing_jitter_cam/README.md +++ b/ray_tracing_jitter_cam/README.md @@ -150,18 +150,22 @@ The implementation of `updateFrame` resets the frame counter if the camera has c ~~~~ C++ //-------------------------------------------------------------------------------------------------- -// If the camera matrix has changed, resets the frame. +// If the camera matrix or the the fov has changed, resets the frame. // otherwise, increments frame. // void HelloVulkan::updateFrame() { static nvmath::mat4f refCamMatrix; + static float refFov{CameraManip.getFov()}; - auto& m = CameraManip.getMatrix(); - if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0) + const auto& m = CameraManip.getMatrix(); + const auto fov = CameraManip.getFov(); + + if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0 || refFov != fov) { resetFrame(); refCamMatrix = m; + refFov = fov; } m_rtPushConstants.frame++; } @@ -195,23 +199,20 @@ The frame number should also be reset when any parts of the scene change, such a ~~~~ C++ void renderUI(HelloVulkan& helloVk) { - static int item = 1; - bool changed = false; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + bool changed = false; + + changed |= ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); - changed = true; + auto& pc = helloVk.m_pushConstant; + changed |= ImGui::RadioButton("Point", &pc.lightType, 0); + ImGui::SameLine(); + changed |= ImGui::RadioButton("Infinite", &pc.lightType, 1); + + changed |= ImGui::SliderFloat3("Position", &pc.lightPosition.x, -20.f, 20.f); + changed |= ImGui::SliderFloat("Intensity", &pc.lightIntensity, 0.f, 150.f); } - changed |= - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - changed |= - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - changed |= ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - changed |= ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + if(changed) helloVk.resetFrame(); } @@ -242,8 +243,7 @@ int m_maxFrames{100}; and also add a way to control it in `renderUI()`, making sure that `m_maxFrames` cannot be set below 1: ~~~~ C++ -changed |= ImGui::InputInt("Max Frames", &helloVk.m_maxFrames); -helloVk.m_maxFrames = std::max(helloVk.m_maxFrames, 1); +changed |= ImGui::SliderInt("Max Frames", &helloVk.m_maxFrames, 1, 100); ~~~~ Then in `raytrace()`, immediately after the call to `updateFrame()`, return if the current frame has exceeded the max frame. diff --git a/ray_tracing_jitter_cam/hello_vulkan.cpp b/ray_tracing_jitter_cam/hello_vulkan.cpp index 5dfcb47..29fafd2 100644 --- a/ray_tracing_jitter_cam/hello_vulkan.cpp +++ b/ray_tracing_jitter_cam/hello_vulkan.cpp @@ -39,6 +39,7 @@ extern std::vector defaultSearchPaths; #include "nvvk/descriptorsets_vk.hpp" #include "nvvk/pipeline_vk.hpp" +#include "nvh/alignment.hpp" #include "nvh/fileoperations.hpp" #include "nvvk/commands_vk.hpp" #include "nvvk/renderpasses_vk.hpp" @@ -162,7 +163,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -193,8 +194,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -212,6 +213,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -238,10 +240,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -314,7 +318,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -332,9 +336,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -553,9 +558,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -619,47 +624,43 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - nvvk::RaytracingBuilderKHR::Blas blas; - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); - // Consider the geometry opaque for optimization + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); // Nb triangles offset.setPrimitiveOffset(0); offset.setTransformOffset(0); + + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -667,7 +668,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { @@ -753,16 +754,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -789,7 +789,7 @@ void HelloVulkan::createRtPipeline() // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -824,10 +824,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -846,18 +846,23 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddressKHR + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -866,7 +871,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -899,43 +904,44 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - // m_sbtBuffer holds all the shader handles: raygen, n-miss, hit... - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{0u, 0u, 0u}}; // callable + + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // m_size.width, m_size.height, 1); // - m_debug.endLabel(cmdBuf); } //-------------------------------------------------------------------------------------------------- -// If the camera matrix has changed, resets the frame. +// If the camera matrix or the the fov has changed, resets the frame. // otherwise, increments frame. // void HelloVulkan::updateFrame() { static nvmath::mat4f refCamMatrix; + static float refFov{CameraManip.getFov()}; - auto& m = CameraManip.getMatrix(); - if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0) + const auto& m = CameraManip.getMatrix(); + const auto fov = CameraManip.getFov(); + + if(memcmp(&refCamMatrix.a00, &m.a00, sizeof(nvmath::mat4f)) != 0 || refFov != fov) { resetFrame(); refCamMatrix = m; + refFov = fov; } m_rtPushConstants.frame++; } diff --git a/ray_tracing_jitter_cam/hello_vulkan.h b/ray_tracing_jitter_cam/hello_vulkan.h index cbcd794..4d3fb0c 100644 --- a/ray_tracing_jitter_cam/hello_vulkan.h +++ b/ray_tracing_jitter_cam/hello_vulkan.h @@ -132,19 +132,19 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); void resetFrame(); void updateFrame(); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; @@ -154,7 +154,7 @@ public: vk::PipelineLayout m_rtPipelineLayout; vk::Pipeline m_rtPipeline; nvvk::Buffer m_rtSBTBuffer; - int m_maxFrames{100}; + int m_maxFrames{10}; struct RtPushConstant { diff --git a/ray_tracing_jitter_cam/main.cpp b/ray_tracing_jitter_cam/main.cpp index 9f75d76..257aa06 100644 --- a/ray_tracing_jitter_cam/main.cpp +++ b/ray_tracing_jitter_cam/main.cpp @@ -37,6 +37,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -61,25 +62,22 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - bool changed = false; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + bool changed = false; + + changed |= ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); - changed = true; + auto& pc = helloVk.m_pushConstant; + changed |= ImGui::RadioButton("Point", &pc.lightType, 0); + ImGui::SameLine(); + changed |= ImGui::RadioButton("Infinite", &pc.lightType, 1); + + changed |= ImGui::SliderFloat3("Position", &pc.lightPosition.x, -20.f, 20.f); + changed |= ImGui::SliderFloat("Intensity", &pc.lightIntensity, 0.f, 150.f); } - changed |= - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - changed |= - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - changed |= ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - changed |= ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); - changed |= ImGui::InputInt("Max Frames", &helloVk.m_maxFrames); - helloVk.m_maxFrames = std::max(helloVk.m_maxFrames, 1); + + + changed |= ImGui::SliderInt("Max Frames", &helloVk.m_maxFrames, 1, 100); if(changed) helloVk.resetFrame(); } @@ -123,20 +121,17 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #else @@ -149,12 +144,18 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); - // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); + contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + // #VKRay: Activate the ray tracing extension + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); // Creating Vulkan base application nvvk::Context vkctx{}; @@ -174,7 +175,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -183,8 +184,8 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); helloVk.createOffscreenRender(); @@ -229,8 +230,9 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); bool changed = false; // Edit 3 floats representing a color changed |= ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); @@ -242,7 +244,8 @@ int main(int argc, char** argv) renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -295,6 +298,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_manyhits/CMakeLists.txt b/ray_tracing_manyhits/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing_manyhits/CMakeLists.txt +++ b/ray_tracing_manyhits/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_manyhits/README.md b/ray_tracing_manyhits/README.md index 89c2952..e677161 100644 --- a/ray_tracing_manyhits/README.md +++ b/ray_tracing_manyhits/README.md @@ -19,14 +19,14 @@ Then you can change the `helloVk.loadModel` calls to the following: ~~~~ C++ // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths, true), nvmath::translation_mat4(nvmath::vec3f(-1, 0, 0))); HelloVulkan::ObjInstance inst; inst.objIndex = 0; inst.transform = nvmath::translation_mat4(nvmath::vec3f(1, 0, 0)); inst.transformIT = nvmath::transpose(nvmath::invert(inst.transform)); helloVk.m_objInstance.push_back(inst); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); ~~~~ ## Adding a new Closest Hit Shader @@ -60,7 +60,7 @@ This new shader needs to be added to the raytracing pipeline. So, in `createRtPi ~~~~ C++ vk::ShaderModule chit2SM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace2.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace2.rchit.spv", true, paths, true)); ~~~~ Then add a new hit group group immediately after adding the first hit group: @@ -103,7 +103,7 @@ struct sceneDesc }; ~~~~ -:warning: **Note:** + **Note:** The solution will not automatically recompile the shaders after this change to `wavefront.glsl`; instead, you will need to recompile all of the SPIR-V shaders. ### `hello_vulkan.cpp` @@ -131,7 +131,7 @@ When creating the [Shader Binding Table](https://www.khronos.org/registry/vulkan This information can be used to pass extra information to a shader, for each entry in the SBT. -:warning: **Note:** + **Note:** Since each entry in an SBT group must have the same size, each entry of the group has to have enough space to accommodate the largest element in the entire group. The following diagram represents our current SBT, with the addition of some data to `HitGroup1`. As mentioned in the **note**, even if @@ -184,7 +184,7 @@ void main() } ~~~~ -:warning: **Note:** + **Note:** Adding a new shader requires to rerun CMake to added to the project compilation system. @@ -335,7 +335,7 @@ Finally, we need to add the new entry as well at the end of the buffer, reusing pBuffer += hitSize; ~~~~ -:warning: **Note:** +**Note:** Adding entries like this can be error-prone and inconvenient for decent scene sizes. Instead, it is recommended to wrap the storage of handles, data, and size per group in a SBT utility to handle this automatically. diff --git a/ray_tracing_manyhits/hello_vulkan.cpp b/ray_tracing_manyhits/hello_vulkan.cpp index 897d102..14af8e8 100644 --- a/ray_tracing_manyhits/hello_vulkan.cpp +++ b/ray_tracing_manyhits/hello_vulkan.cpp @@ -39,16 +39,12 @@ extern std::vector defaultSearchPaths; #include "nvvk/descriptorsets_vk.hpp" #include "nvvk/pipeline_vk.hpp" +#include "nvh/alignment.hpp" #include "nvh/fileoperations.hpp" #include "nvvk/commands_vk.hpp" #include "nvvk/renderpasses_vk.hpp" #include "nvvk/shaders_vk.hpp" -#ifndef ROUND_UP -#define ROUND_UP(v, powerOf2Alignment) (((v) + (powerOf2Alignment)-1) & ~((powerOf2Alignment)-1)) -#endif - - // Holding the camera matrices struct CameraMatrices { @@ -197,8 +193,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -216,6 +212,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -242,10 +239,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -318,7 +317,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -336,7 +335,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); @@ -558,9 +557,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -624,47 +623,43 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - nvvk::RaytracingBuilderKHR::Blas blas; - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); - // Consider the geometry opaque for optimization + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); // Nb triangles offset.setPrimitiveOffset(0); offset.setTransformOffset(0); + + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -672,7 +667,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { @@ -758,16 +753,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -794,10 +788,10 @@ void HelloVulkan::createRtPipeline() // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::ShaderModule chit2SM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace2.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace2.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -836,10 +830,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -857,16 +851,17 @@ void HelloVulkan::createRtPipeline() void HelloVulkan::createRtShaderBindingTable() { auto groupCount = - static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit - uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t groupAlignSize = m_rtProperties.shaderGroupBaseAlignment; + static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit + uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier + uint32_t groupSizeAligned = m_rtProperties.shaderGroupBaseAlignment; // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * groupAlignSize; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); // Retrieve the handle pointers std::vector handles(groupCount); @@ -876,10 +871,10 @@ void HelloVulkan::createRtShaderBindingTable() } // Sizes - uint32_t rayGenSize = groupAlignSize; - uint32_t missSize = groupAlignSize; + uint32_t rayGenSize = groupSizeAligned; + uint32_t missSize = groupSizeAligned; uint32_t hitSize = - ROUND_UP(groupHandleSize + static_cast(sizeof(HitRecordBuffer)), groupAlignSize); + nvh::align_up(groupHandleSize + static_cast(sizeof(HitRecordBuffer)), groupSizeAligned); uint32_t newSbtSize = rayGenSize + 2 * missSize + 3 * hitSize; std::vector sbtBuffer(newSbtSize); @@ -915,7 +910,9 @@ void HelloVulkan::createRtShaderBindingTable() nvvk::CommandPool genCmdBuf(m_device, m_graphicsQueueIndex); vk::CommandBuffer cmdBuf = genCmdBuf.createCommandBuffer(); - m_rtSBTBuffer = m_alloc.createBuffer(cmdBuf, sbtBuffer, vk::BufferUsageFlagBits::eRayTracingKHR); + m_rtSBTBuffer = m_alloc.createBuffer(cmdBuf, sbtBuffer, + vk::BufferUsageFlagBits::eShaderDeviceAddressKHR + | vk::BufferUsageFlagBits::eShaderBindingTableKHR); m_debug.setObjectName(m_rtSBTBuffer.buffer, "SBT"); @@ -946,26 +943,25 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize handleSize = m_rtProperties.shaderGroupHandleSize; - vk::DeviceSize alignSize = m_rtProperties.shaderGroupBaseAlignment; - vk::DeviceSize rayGenOffset = 0u * alignSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * alignSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * alignSize; // Jump over the previous shaders - vk::DeviceSize sbtSize = alignSize * (vk::DeviceSize)m_rtShaderGroups.size(); + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceSize hitGroupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize + sizeof(HitRecordBuffer), + m_rtProperties.shaderGroupBaseAlignment); + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - vk::DeviceSize hitGroupStride = ROUND_UP(handleSize + sizeof(HitRecordBuffer), alignSize); + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, hitGroupSize, hitGroupSize * 3}, // hit + Stride{0u, 0u, 0u}}; // callable - // m_sbtBuffer holds all the shader handles: raygen, n-miss, hit... - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - handleSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - handleSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - hitGroupStride, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // m_size.width, m_size.height, 1); // diff --git a/ray_tracing_manyhits/hello_vulkan.h b/ray_tracing_manyhits/hello_vulkan.h index 973fac7..c8f8fb0 100644 --- a/ray_tracing_manyhits/hello_vulkan.h +++ b/ray_tracing_manyhits/hello_vulkan.h @@ -133,18 +133,18 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; diff --git a/ray_tracing_manyhits/main.cpp b/ray_tracing_manyhits/main.cpp index be00d6b..bb4c02b 100644 --- a/ray_tracing_manyhits/main.cpp +++ b/ray_tracing_manyhits/main.cpp @@ -37,6 +37,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -60,19 +61,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -114,20 +112,17 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #else @@ -141,11 +136,17 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + // #VKRay: Activate the ray tracing extension + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); // Creating Vulkan base application nvvk::Context vkctx{}; @@ -165,7 +166,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -174,14 +175,14 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/wuson.obj", defaultSearchPaths, true), nvmath::translation_mat4(nvmath::vec3f(-1, 0, 0))); HelloVulkan::ObjInstance inst; inst.objIndex = 0; inst.transform = nvmath::translation_mat4(nvmath::vec3f(1, 0, 0)); inst.transformIT = nvmath::transpose(nvmath::invert(inst.transform)); helloVk.m_objInstance.push_back(inst); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); helloVk.m_objInstance[0].hitgroup = 1; helloVk.m_objInstance[1].hitgroup = 2; helloVk.m_hitShaderRecord.resize(2); @@ -230,15 +231,17 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -291,6 +294,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_rayquery/CMakeLists.txt b/ray_tracing_rayquery/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing_rayquery/CMakeLists.txt +++ b/ray_tracing_rayquery/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_rayquery/README.md b/ray_tracing_rayquery/README.md index 952ba2f..c21e992 100644 --- a/ray_tracing_rayquery/README.md +++ b/ray_tracing_rayquery/README.md @@ -47,7 +47,7 @@ You can safely remove all raytrace.* shaders ## Support for Fragment shader -In `HelloVulkan::createDescriptorSetLayout`, add the acceleration structure to the description layout. +In `HelloVulkan::createDescriptorSetLayout`, add the acceleration structure to the description layout to have access to the acceleration structure directly in the fragment shader. ~~~~ C++ // The top level acceleration structure diff --git a/ray_tracing_rayquery/hello_vulkan.cpp b/ray_tracing_rayquery/hello_vulkan.cpp index d07f0e4..796df40 100644 --- a/ray_tracing_rayquery/hello_vulkan.cpp +++ b/ray_tracing_rayquery/hello_vulkan.cpp @@ -163,7 +163,7 @@ void HelloVulkan::updateDescriptorSet() std::vector diit; for(auto& texture : m_textures) { - diit.push_back(texture.descriptor); + diit.emplace_back(texture.descriptor); } writes.emplace_back(m_descSetLayoutBind.makeWriteArray(m_descSet, 3, diit.data())); @@ -201,8 +201,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -220,6 +220,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -246,10 +247,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -340,9 +343,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -475,7 +479,7 @@ void HelloVulkan::createOffscreenRender() | vk::ImageUsageFlagBits::eStorage); - nvvk::Image image = m_alloc.createImage(colorCreateInfo); + nvvk::Image image = m_alloc.createImage(colorCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, colorCreateInfo); m_offscreenColor = m_alloc.createTexture(image, ivInfo, vk::SamplerCreateInfo()); m_offscreenColor.descriptor.imageLayout = VK_IMAGE_LAYOUT_GENERAL; @@ -554,9 +558,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -620,55 +624,47 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - // Setting up the creation info of acceleration structure - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices - // Building part vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); // Setting up the build info of the acceleration vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); // The primitive itself - vk::AccelerationStructureBuildOffsetInfoKHR offset; + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); // Nb triangles offset.setPrimitiveOffset(0); offset.setTransformOffset(0); // Our blas is only one geometry, but could be made of many geometries - nvvk::RaytracingBuilderKHR::Blas blas; + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; @@ -680,7 +676,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { diff --git a/ray_tracing_rayquery/hello_vulkan.h b/ray_tracing_rayquery/hello_vulkan.h index 6d1a8be..409e108 100644 --- a/ray_tracing_rayquery/hello_vulkan.h +++ b/ray_tracing_rayquery/hello_vulkan.h @@ -132,11 +132,11 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; - nvvk::RaytracingBuilderKHR m_rtBuilder; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; + nvvk::RaytracingBuilderKHR m_rtBuilder; }; diff --git a/ray_tracing_rayquery/main.cpp b/ray_tracing_rayquery/main.cpp index faeebad..65b7b75 100644 --- a/ray_tracing_rayquery/main.cpp +++ b/ray_tracing_rayquery/main.cpp @@ -39,6 +39,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -63,19 +64,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -117,20 +115,16 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #else @@ -142,11 +136,16 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + // #VKRay: Activate the ray tracing extension + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeatures; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeatures); + vk::PhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures; + contextInfo.addDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME, false, &rayQueryFeatures); // Creating Vulkan base application @@ -168,7 +167,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -177,8 +176,8 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/Medieval_building.obj", defaultSearchPaths, true)); helloVk.createOffscreenRender(); helloVk.createDescriptorSetLayout(); @@ -220,14 +219,16 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); renderUI(helloVk); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -275,6 +276,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/ray_tracing_reflections/CMakeLists.txt b/ray_tracing_reflections/CMakeLists.txt index f2c44ad..c374896 100644 --- a/ray_tracing_reflections/CMakeLists.txt +++ b/ray_tracing_reflections/CMakeLists.txt @@ -1,32 +1,38 @@ -cmake_minimum_required(VERSION 2.8) +#***************************************************************************** +# Copyright 2020 NVIDIA Corporation. All rights reserved. +#***************************************************************************** +cmake_minimum_required(VERSION 3.9.6 FATAL_ERROR) + +#-------------------------------------------------------------------------------------------------- +# Project setting get_filename_component(PROJNAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) SET(PROJNAME vk_${PROJNAME}_KHR) +project(${PROJNAME} LANGUAGES C CXX) +message(STATUS "-------------------------------") +message(STATUS "Processing Project ${PROJNAME}:") -Project(${PROJNAME}) -Message(STATUS "-------------------------------") -Message(STATUS "Processing Project ${PROJNAME}:") -##################################################################################### -_add_project_definitions(${PROJNAME}) +#-------------------------------------------------------------------------------------------------- +# C++ target and defines +set(CMAKE_CXX_STANDARD 17) +add_executable(${PROJNAME}) +target_compile_definitions(${PROJNAME} PUBLIC PROJECT_NAME="${PROJNAME}") -##################################################################################### + +#-------------------------------------------------------------------------------------------------- # Source files for this project # file(GLOB SOURCE_FILES *.cpp *.hpp *.inl *.h *.c) -file(GLOB EXTRA_COMMON "../common/*.*") +file(GLOB EXTRA_COMMON ${TUTO_KHR_DIR}/common/*.*) list(APPEND COMMON_SOURCE_FILES ${EXTRA_COMMON}) -include_directories("../common") +include_directories(${TUTO_KHR_DIR}/common) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # GLSL to SPIR-V custom build # -# more than one file can be given: _compile_GLSL("GLSL_mesh.vert;GLSL_mesh.frag" "GLSL_mesh.spv" GLSL_SOURCES) -# the SpirV validator is fine as long as files are for different pipeline stages (entry points still need to be main()) -#_compile_GLSL( ) SET(VULKAN_TARGET_ENV vulkan1.2) - UNSET(GLSL_SOURCES) UNSET(SPV_OUTPUT) file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl") @@ -36,48 +42,36 @@ file(GLOB_RECURSE GLSL_SOURCE_FILES "shaders/*.vert" "shaders/*.rchit" "shaders/*.rahit" + "shaders/*.rint" "shaders/*.rmiss" "shaders/*.rgen" + "shaders/*.rcall" ) foreach(GLSL ${GLSL_SOURCE_FILES}) get_filename_component(FILE_NAME ${GLSL} NAME) _compile_GLSL(${GLSL} "shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT) endforeach(GLSL) - list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES}) -source_group(Shader_Files FILES ${GLSL_SOURCES}) -##################################################################################### -# Executable +#-------------------------------------------------------------------------------------------------- +# Sources +target_sources(${PROJNAME} PUBLIC ${SOURCE_FILES} ${HEADER_FILES}) +target_sources(${PROJNAME} PUBLIC ${COMMON_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${PACKAGE_SOURCE_FILES}) +target_sources(${PROJNAME} PUBLIC ${GLSL_SOURCES}) + + +#-------------------------------------------------------------------------------------------------- +# Sub-folders in Visual Studio # -# if(WIN32 AND NOT GLUT_FOUND) -# add_definitions(/wd4996) #remove printf warning -# add_definitions(/wd4244) #remove double to float conversion warning -# add_definitions(/wd4305) #remove double to float truncation warning -# else() -# add_definitions(-fpermissive) -# endif() -add_executable(${PROJNAME} ${SOURCE_FILES} ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES} ${GLSL_SOURCES} ${CUDA_FILES} ${CUBIN_SOURCES}) +source_group("Common" FILES ${COMMON_SOURCE_FILES} ${PACKAGE_SOURCE_FILES}) +source_group("Sources" FILES ${SOURCE_FILES}) +source_group("Headers" FILES ${HEADER_FILES}) +source_group("Shader_Files" FILES ${GLSL_SOURCES}) -#_set_subsystem_console(${PROJNAME}) -##################################################################################### -# common source code needed for this sample -# -source_group(common FILES - ${COMMON_SOURCE_FILES} - ${PACKAGE_SOURCE_FILES} -) -source_group("Source Files" FILES ${SOURCE_FILES}) - -# if(UNIX) -# set(UNIXLINKLIBS dl pthread) -# else() -# set(UNIXLINKLIBS) -# endif() - -##################################################################################### +#-------------------------------------------------------------------------------------------------- # Linkage # target_link_libraries(${PROJNAME} ${PLATFORM_LIBRARIES} shared_sources) @@ -90,15 +84,28 @@ foreach(RELEASELIB ${LIBRARIES_OPTIMIZED}) target_link_libraries(${PROJNAME} optimized ${RELEASELIB}) endforeach(RELEASELIB) -##################################################################################### +#-------------------------------------------------------------------------------------------------- # copies binaries that need to be put next to the exe files (ZLib, etc.) # _copy_binaries_to_target( ${PROJNAME} ) -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") -install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") -install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}/shaders") +#install(FILES ${SPV_OUTPUT} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}/shaders") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(FILES ${CUBIN_SOURCES} CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Release DESTINATION "bin_${ARCH}/${PROJNAME}") +#install(DIRECTORY "../media" CONFIGURATIONS Debug DESTINATION "bin_${ARCH}_debug/${PROJNAME}") + +#---------------------------------------------------------------------------------------------------- +# Copying elements +# Media +# target_copy_to_output_dir(TARGET ${PROJECT_NAME} FILES "${TUTO_KHR_DIR}/media") +# Spir-V Shaders +target_copy_to_output_dir( + TARGET ${PROJECT_NAME} + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + DEST_SUBFOLDER "${PROJECT_NAME}/" + FILES ${SPV_OUTPUT} + ) + diff --git a/ray_tracing_reflections/README.md b/ray_tracing_reflections/README.md index 742be7c..02b19c0 100644 --- a/ray_tracing_reflections/README.md +++ b/ray_tracing_reflections/README.md @@ -12,14 +12,14 @@ First, we will create a scene with two reflective planes and a multicolored cube ~~~~ C++ // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths, true), nvmath::translation_mat4(nvmath::vec3f(-2, 0, 0)) * nvmath::scale_mat4(nvmath::vec3f(.1f, 5.f, 5.f))); - helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths, true), nvmath::translation_mat4(nvmath::vec3f(2, 0, 0)) * nvmath::scale_mat4(nvmath::vec3f(.1f, 5.f, 5.f))); - helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true), nvmath::translation_mat4(nvmath::vec3f(0, -1, 0))); ~~~~ @@ -44,7 +44,7 @@ Vulkan ray tracing allows recursive calls to traceRayEXT, up to a limit defined In `createRtPipeline()` in `hello_vulkan.cpp`, bring the maximum recursion depth up to 10, making sure not to exceed the physical device's maximum recursion limit: ~~~~ C++ - rayPipelineInfo.setMaxRecursionDepth( + rayPipelineInfo.setMaxPipelineRayRecursionDepth( std::max(10u, m_rtProperties.maxRecursionDepth)); // Ray depth ~~~~ @@ -203,7 +203,7 @@ Since the ray generation shader now handles attenuation, we no longer need to at Finally, we no longer need to have a deep recursion setting in `createRtPipeline` -- just a depth of 2, one for the initial ray generation segment and another for shadow rays. ~~~~ C++ - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth ~~~~ In `raytrace.rgen`, we can now make the maximum ray depth significantly larger -- such as 100, for instance -- without causing a device lost error. @@ -246,9 +246,9 @@ Then test for the value for when to stop break; ~~~~ -Finally, in `main.cpp` in the `renderUI` function, we will add a slider to control the value. +Finally, in `main.cpp` after the `renderUI()` function call, we will add a slider to control the depth value. ~~~~ C++ - ImGui::SliderInt("Max Depth", &helloVk.m_rtPushConstants.maxDepth, 1, 100); + ImGui::SliderInt("Max Depth", &helloVk.m_rtPushConstants.maxDepth, 1, 50); ~~~~ diff --git a/ray_tracing_reflections/hello_vulkan.cpp b/ray_tracing_reflections/hello_vulkan.cpp index faf0b48..b661a21 100644 --- a/ray_tracing_reflections/hello_vulkan.cpp +++ b/ray_tracing_reflections/hello_vulkan.cpp @@ -39,6 +39,7 @@ extern std::vector defaultSearchPaths; #include "nvvk/descriptorsets_vk.hpp" #include "nvvk/pipeline_vk.hpp" +#include "nvh/alignment.hpp" #include "nvh/fileoperations.hpp" #include "nvvk/commands_vk.hpp" #include "nvvk/renderpasses_vk.hpp" @@ -193,8 +194,8 @@ void HelloVulkan::createGraphicsPipeline() std::vector paths = defaultSearchPaths; nvvk::GraphicsPipelineGeneratorCombined gpb(m_device, m_pipelineLayout, m_offscreenRenderPass); gpb.depthStencilState.depthTestEnable = true; - gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths), vkSS::eVertex); - gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths), vkSS::eFragment); + gpb.addShader(nvh::loadFile("shaders/vert_shader.vert.spv", true, paths, true), vkSS::eVertex); + gpb.addShader(nvh::loadFile("shaders/frag_shader.frag.spv", true, paths, true), vkSS::eFragment); gpb.addBindingDescription({0, sizeof(VertexObj)}); gpb.addAttributeDescriptions({{0, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, pos)}, {1, 0, vk::Format::eR32G32B32Sfloat, offsetof(VertexObj, nrm)}, @@ -212,6 +213,7 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform { using vkBU = vk::BufferUsageFlagBits; + LOGI("Loading File: %s \n", filename.c_str()); ObjLoader loader; loader.loadModel(filename); @@ -238,10 +240,12 @@ void HelloVulkan::loadModel(const std::string& filename, nvmath::mat4f transform vk::CommandBuffer cmdBuf = cmdBufGet.createCommandBuffer(); model.vertexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_vertices, - vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eVertexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.indexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_indices, - vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress); + vkBU::eIndexBuffer | vkBU::eStorageBuffer | vkBU::eShaderDeviceAddress + | vkBU::eAccelerationStructureBuildInputReadOnlyKHR); model.matColorBuffer = m_alloc.createBuffer(cmdBuf, loader.m_materials, vkBU::eStorageBuffer); model.matIndexBuffer = m_alloc.createBuffer(cmdBuf, loader.m_matIndx, vkBU::eStorageBuffer); // Creates all textures found @@ -314,7 +318,7 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, auto imgSize = vk::Extent2D(1, 1); auto imageCreateInfo = nvvk::makeImage2DCreateInfo(imgSize, format); - // Creating the dummy texure + // Creating the dummy texture nvvk::Image image = m_alloc.createImage(cmdBuf, bufferSize, color.data(), imageCreateInfo); vk::ImageViewCreateInfo ivInfo = nvvk::makeImageViewCreateInfo(image.image, imageCreateInfo); texture = m_alloc.createTexture(image, ivInfo, samplerCreateInfo); @@ -332,9 +336,10 @@ void HelloVulkan::createTextureImages(const vk::CommandBuffer& cmdBuf, std::stringstream o; int texWidth, texHeight, texChannels; o << "media/textures/" << texture; - std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths); + std::string txtFile = nvh::findFile(o.str(), defaultSearchPaths, true); - stbi_uc* stbi_pixels = stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); + stbi_uc* stbi_pixels = + stbi_load(txtFile.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); std::array color{255u, 0u, 255u, 255u}; @@ -553,9 +558,9 @@ void HelloVulkan::createPostPipeline() nvvk::GraphicsPipelineGeneratorCombined pipelineGenerator(m_device, m_postPipelineLayout, m_renderPass); - pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/passthrough.vert.spv", true, paths, true), vk::ShaderStageFlagBits::eVertex); - pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths), + pipelineGenerator.addShader(nvh::loadFile("shaders/post.frag.spv", true, paths, true), vk::ShaderStageFlagBits::eFragment); pipelineGenerator.rasterizationState.setCullMode(vk::CullModeFlagBits::eNone); m_postPipeline = pipelineGenerator.createPipeline(); @@ -619,47 +624,43 @@ void HelloVulkan::drawPost(vk::CommandBuffer cmdBuf) void HelloVulkan::initRayTracing() { // Requesting ray tracing properties - auto properties = m_physicalDevice.getProperties2(); - m_rtProperties = properties.get(); + auto properties = + m_physicalDevice.getProperties2(); + m_rtProperties = properties.get(); m_rtBuilder.setup(m_device, &m_alloc, m_graphicsQueueIndex); } //-------------------------------------------------------------------------------------------------- // Converting a OBJ primitive to the ray tracing geometry used for the BLAS // -nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) +nvvk::RaytracingBuilderKHR::BlasInput HelloVulkan::objectToVkGeometryKHR(const ObjModel& model) { - nvvk::RaytracingBuilderKHR::Blas blas; - vk::AccelerationStructureCreateGeometryTypeInfoKHR asCreate; - asCreate.setGeometryType(vk::GeometryTypeKHR::eTriangles); - asCreate.setIndexType(vk::IndexType::eUint32); - asCreate.setVertexFormat(vk::Format::eR32G32B32Sfloat); - asCreate.setMaxPrimitiveCount(model.nbIndices / 3); // Nb triangles - asCreate.setMaxVertexCount(model.nbVertices); - asCreate.setAllowsTransforms(VK_FALSE); // No adding transformation matrices vk::DeviceAddress vertexAddress = m_device.getBufferAddress({model.vertexBuffer.buffer}); vk::DeviceAddress indexAddress = m_device.getBufferAddress({model.indexBuffer.buffer}); + vk::AccelerationStructureGeometryTrianglesDataKHR triangles; - triangles.setVertexFormat(asCreate.vertexFormat); + triangles.setVertexFormat(vk::Format::eR32G32B32Sfloat); triangles.setVertexData(vertexAddress); triangles.setVertexStride(sizeof(VertexObj)); - triangles.setIndexType(asCreate.indexType); + triangles.setIndexType(vk::IndexType::eUint32); triangles.setIndexData(indexAddress); triangles.setTransformData({}); + triangles.setMaxVertex(model.nbVertices); vk::AccelerationStructureGeometryKHR asGeom; - asGeom.setGeometryType(asCreate.geometryType); - // Consider the geometry opaque for optimization + asGeom.setGeometryType(vk::GeometryTypeKHR::eTriangles); asGeom.setFlags(vk::GeometryFlagBitsKHR::eOpaque); asGeom.geometry.setTriangles(triangles); - vk::AccelerationStructureBuildOffsetInfoKHR offset; + + vk::AccelerationStructureBuildRangeInfoKHR offset; offset.setFirstVertex(0); - offset.setPrimitiveCount(asCreate.maxPrimitiveCount); + offset.setPrimitiveCount(model.nbIndices / 3); // Nb triangles offset.setPrimitiveOffset(0); offset.setTransformOffset(0); + + nvvk::RaytracingBuilderKHR::BlasInput blas; blas.asGeometry.emplace_back(asGeom); - blas.asCreateGeometryInfo.emplace_back(asCreate); blas.asBuildOffsetInfo.emplace_back(offset); return blas; } @@ -667,7 +668,7 @@ nvvk::RaytracingBuilderKHR::Blas HelloVulkan::objectToVkGeometryKHR(const ObjMod void HelloVulkan::createBottomLevelAS() { // BLAS - Storing each primitive in a geometry - std::vector allBlas; + std::vector allBlas; allBlas.reserve(m_objModel.size()); for(const auto& obj : m_objModel) { @@ -753,16 +754,15 @@ void HelloVulkan::createRtPipeline() vk::ShaderModule raygenSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rgen.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rgen.spv", true, paths, true)); vk::ShaderModule missSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rmiss.spv", true, paths, true)); // The second miss shader is invoked when a shadow ray misses the geometry. It // simply indicates that no occlusion has been found - vk::ShaderModule shadowmissSM = - nvvk::createShaderModule(m_device, - nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths)); + vk::ShaderModule shadowmissSM = nvvk::createShaderModule( + m_device, nvh::loadFile("shaders/raytraceShadow.rmiss.spv", true, paths, true)); std::vector stages; @@ -789,7 +789,7 @@ void HelloVulkan::createRtPipeline() // Hit Group - Closest Hit + AnyHit vk::ShaderModule chitSM = nvvk::createShaderModule(m_device, // - nvh::loadFile("shaders/raytrace.rchit.spv", true, paths)); + nvh::loadFile("shaders/raytrace.rchit.spv", true, paths, true)); vk::RayTracingShaderGroupCreateInfoKHR hg{vk::RayTracingShaderGroupTypeKHR::eTrianglesHitGroup, VK_SHADER_UNUSED_KHR, VK_SHADER_UNUSED_KHR, @@ -824,10 +824,10 @@ void HelloVulkan::createRtPipeline() m_rtShaderGroups.size())); // 1-raygen, n-miss, n-(hit[+anyhit+intersect]) rayPipelineInfo.setPGroups(m_rtShaderGroups.data()); - rayPipelineInfo.setMaxRecursionDepth(2); // Ray depth + rayPipelineInfo.setMaxPipelineRayRecursionDepth(2); // Ray depth rayPipelineInfo.setLayout(m_rtPipelineLayout); - m_rtPipeline = - static_cast(m_device.createRayTracingPipelineKHR({}, rayPipelineInfo)); + m_rtPipeline = static_cast( + m_device.createRayTracingPipelineKHR({}, {}, rayPipelineInfo)); m_device.destroy(raygenSM); m_device.destroy(missSM); @@ -846,18 +846,23 @@ void HelloVulkan::createRtShaderBindingTable() auto groupCount = static_cast(m_rtShaderGroups.size()); // 3 shaders: raygen, miss, chit uint32_t groupHandleSize = m_rtProperties.shaderGroupHandleSize; // Size of a program identifier - uint32_t baseAlignment = m_rtProperties.shaderGroupBaseAlignment; // Size of shader alignment + uint32_t groupSizeAligned = + nvh::align_up(groupHandleSize, m_rtProperties.shaderGroupBaseAlignment); // Fetch all the shader handles used in the pipeline, so that they can be written in the SBT - uint32_t sbtSize = groupCount * baseAlignment; + uint32_t sbtSize = groupCount * groupSizeAligned; std::vector shaderHandleStorage(sbtSize); - m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, - shaderHandleStorage.data()); + auto result = m_device.getRayTracingShaderGroupHandlesKHR(m_rtPipeline, 0, groupCount, sbtSize, + shaderHandleStorage.data()); + assert(result == vk::Result::eSuccess); + // Write the handles in the SBT - m_rtSBTBuffer = m_alloc.createBuffer(sbtSize, vk::BufferUsageFlagBits::eTransferSrc, - vk::MemoryPropertyFlagBits::eHostVisible - | vk::MemoryPropertyFlagBits::eHostCoherent); + m_rtSBTBuffer = m_alloc.createBuffer( + sbtSize, + vk::BufferUsageFlagBits::eTransferSrc | vk::BufferUsageFlagBits::eShaderDeviceAddressKHR + | vk::BufferUsageFlagBits::eShaderBindingTableKHR, + vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent); m_debug.setObjectName(m_rtSBTBuffer.buffer, std::string("SBT").c_str()); // Write the handles in the SBT @@ -866,7 +871,7 @@ void HelloVulkan::createRtShaderBindingTable() for(uint32_t g = 0; g < groupCount; g++) { memcpy(pData, shaderHandleStorage.data() + g * groupHandleSize, groupHandleSize); // raygen - pData += baseAlignment; + pData += groupSizeAligned; } m_alloc.unmap(m_rtSBTBuffer); @@ -894,25 +899,22 @@ void HelloVulkan::raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& | vk::ShaderStageFlagBits::eMissKHR, 0, m_rtPushConstants); - vk::DeviceSize progSize = - m_rtProperties.shaderGroupBaseAlignment; // Size of a program identifier - vk::DeviceSize rayGenOffset = 0u * progSize; // Start at the beginning of m_sbtBuffer - vk::DeviceSize missOffset = 1u * progSize; // Jump over raygen - vk::DeviceSize hitGroupOffset = 3u * progSize; // Jump over the previous shaders - vk::DeviceSize sbtSize = progSize * (vk::DeviceSize)m_rtShaderGroups.size(); + // Size of a program identifier + uint32_t groupSize = + nvh::align_up(m_rtProperties.shaderGroupHandleSize, m_rtProperties.shaderGroupBaseAlignment); + uint32_t groupStride = groupSize; + vk::DeviceAddress sbtAddress = m_device.getBufferAddress({m_rtSBTBuffer.buffer}); - // m_sbtBuffer holds all the shader handles: raygen, n-miss, hit... - const vk::StridedBufferRegionKHR raygenShaderBindingTable = {m_rtSBTBuffer.buffer, rayGenOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR missShaderBindingTable = {m_rtSBTBuffer.buffer, missOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR hitShaderBindingTable = {m_rtSBTBuffer.buffer, hitGroupOffset, - progSize, sbtSize}; - const vk::StridedBufferRegionKHR callableShaderBindingTable; - cmdBuf.traceRaysKHR(&raygenShaderBindingTable, &missShaderBindingTable, &hitShaderBindingTable, - &callableShaderBindingTable, // + using Stride = vk::StridedDeviceAddressRegionKHR; + std::array strideAddresses{ + Stride{sbtAddress + 0u * groupSize, groupStride, groupSize * 1}, // raygen + Stride{sbtAddress + 1u * groupSize, groupStride, groupSize * 2}, // miss + Stride{sbtAddress + 3u * groupSize, groupStride, groupSize * 1}, // hit + Stride{0u, 0u, 0u}}; // callable + + cmdBuf.traceRaysKHR(&strideAddresses[0], &strideAddresses[1], &strideAddresses[2], + &strideAddresses[3], // m_size.width, m_size.height, 1); // - m_debug.endLabel(cmdBuf); } diff --git a/ray_tracing_reflections/hello_vulkan.h b/ray_tracing_reflections/hello_vulkan.h index fdbdb6e..ab7ebb8 100644 --- a/ray_tracing_reflections/hello_vulkan.h +++ b/ray_tracing_reflections/hello_vulkan.h @@ -132,18 +132,18 @@ public: vk::Format m_offscreenDepthFormat{vk::Format::eD32Sfloat}; // #VKRay - void initRayTracing(); - nvvk::RaytracingBuilderKHR::Blas objectToVkGeometryKHR(const ObjModel& model); - void createBottomLevelAS(); - void createTopLevelAS(); - void createRtDescriptorSet(); - void updateRtDescriptorSet(); - void createRtPipeline(); - void createRtShaderBindingTable(); + void initRayTracing(); + nvvk::RaytracingBuilderKHR::BlasInput objectToVkGeometryKHR(const ObjModel& model); + void createBottomLevelAS(); + void createTopLevelAS(); + void createRtDescriptorSet(); + void updateRtDescriptorSet(); + void createRtPipeline(); + void createRtShaderBindingTable(); void raytrace(const vk::CommandBuffer& cmdBuf, const nvmath::vec4f& clearColor); - vk::PhysicalDeviceRayTracingPropertiesKHR m_rtProperties; + vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties; nvvk::RaytracingBuilderKHR m_rtBuilder; nvvk::DescriptorSetBindings m_rtDescSetLayoutBind; vk::DescriptorPool m_rtDescPool; diff --git a/ray_tracing_reflections/main.cpp b/ray_tracing_reflections/main.cpp index f39bb95..fd66b87 100644 --- a/ray_tracing_reflections/main.cpp +++ b/ray_tracing_reflections/main.cpp @@ -37,6 +37,7 @@ VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE #include "imgui_impl_glfw.h" #include "hello_vulkan.h" +#include "imgui_camera_widget.h" #include "nvh/cameramanipulator.hpp" #include "nvh/fileoperations.hpp" #include "nvpsystem.hpp" @@ -61,20 +62,16 @@ static void onErrorCallback(int error, const char* description) // Extra UI void renderUI(HelloVulkan& helloVk) { - static int item = 1; - if(ImGui::Combo("Up Vector", &item, "X\0Y\0Z\0\0")) + ImGuiH::CameraWidget(); + if(ImGui::CollapsingHeader("Light")) { - nvmath::vec3f pos, eye, up; - CameraManip.getLookat(pos, eye, up); - up = nvmath::vec3f(item == 0, item == 1, item == 2); - CameraManip.setLookat(pos, eye, up); + ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); + ImGui::SameLine(); + ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); + + ImGui::SliderFloat3("Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); + ImGui::SliderFloat("Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 150.f); } - ImGui::SliderFloat3("Light Position", &helloVk.m_pushConstant.lightPosition.x, -20.f, 20.f); - ImGui::SliderFloat("Light Intensity", &helloVk.m_pushConstant.lightIntensity, 0.f, 100.f); - ImGui::SliderInt("Max Depth", &helloVk.m_rtPushConstants.maxDepth, 1, 100); - ImGui::RadioButton("Point", &helloVk.m_pushConstant.lightType, 0); - ImGui::SameLine(); - ImGui::RadioButton("Infinite", &helloVk.m_pushConstant.lightType, 1); } ////////////////////////////////////////////////////////////////////////// @@ -116,20 +113,17 @@ int main(int argc, char** argv) // Search path for shaders and other media defaultSearchPaths = { - PROJECT_ABSDIRECTORY, // shaders - PROJECT_ABSDIRECTORY "../", // media - PROJECT_NAME, // installed: shaders + media + NVPSystem::exePath(), + NVPSystem::exePath() + "..", NVPSystem::exePath() + std::string(PROJECT_NAME), }; - // Enabling the extension feature - vk::PhysicalDeviceRayTracingFeaturesKHR raytracingFeature; - // Requesting Vulkan extensions and layers nvvk::ContextCreateInfo contextInfo(true); contextInfo.setVersion(1, 2); contextInfo.addInstanceLayer("VK_LAYER_LUNARG_monitor", true); contextInfo.addInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME); + contextInfo.addInstanceExtension(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, true); #ifdef WIN32 contextInfo.addInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #else @@ -143,11 +137,17 @@ int main(int argc, char** argv) contextInfo.addDeviceExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME); // #VKRay: Activate the ray tracing extension - contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_EXTENSION_NAME, false, &raytracingFeature); contextInfo.addDeviceExtension(VK_KHR_MAINTENANCE3_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); contextInfo.addDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + // #VKRay: Activate the ray tracing extension + vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelFeature; + contextInfo.addDeviceExtension(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME, false, + &accelFeature); + vk::PhysicalDeviceRayTracingPipelineFeaturesKHR rtPipelineFeature; + contextInfo.addDeviceExtension(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME, false, + &rtPipelineFeature); // Creating Vulkan base application nvvk::Context vkctx{}; @@ -167,7 +167,7 @@ int main(int argc, char** argv) helloVk.setup(vkctx.m_instance, vkctx.m_device, vkctx.m_physicalDevice, vkctx.m_queueGCT.familyIndex); - helloVk.createSurface(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); + helloVk.createSwapchain(surface, SAMPLE_WIDTH, SAMPLE_HEIGHT); helloVk.createDepthBuffer(); helloVk.createRenderPass(); helloVk.createFrameBuffers(); @@ -176,15 +176,14 @@ int main(int argc, char** argv) helloVk.initGUI(0); // Using sub-pass 0 // Creation of the example - // Creation of the example - helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths, true), nvmath::translation_mat4(nvmath::vec3f(-2, 0, 0)) * nvmath::scale_mat4(nvmath::vec3f(.1f, 5.f, 5.f))); - helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/cube.obj", defaultSearchPaths, true), nvmath::translation_mat4(nvmath::vec3f(2, 0, 0)) * nvmath::scale_mat4(nvmath::vec3f(.1f, 5.f, 5.f))); - helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths)); - helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths), + helloVk.loadModel(nvh::findFile("media/scenes/cube_multi.obj", defaultSearchPaths, true)); + helloVk.loadModel(nvh::findFile("media/scenes/plane.obj", defaultSearchPaths, true), nvmath::translation_mat4(nvmath::vec3f(0, -1, 0))); @@ -230,15 +229,18 @@ int main(int argc, char** argv) helloVk.updateUniformBuffer(); // Show UI window. - if(1 == 1) + if(helloVk.showGui()) { + ImGuiH::Panel::Begin(); ImGui::ColorEdit3("Clear color", reinterpret_cast(&clearColor)); ImGui::Checkbox("Ray Tracer mode", &useRaytracer); // Switch between raster and ray tracing renderUI(helloVk); + ImGui::SliderInt("Max Depth", &helloVk.m_rtPushConstants.maxDepth, 1, 50); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); - ImGui::Render(); + ImGuiH::Control::Info("", "", "(F10) Toggle Pane", ImGuiH::Control::Flags::Disabled); + ImGuiH::Panel::End(); } // Start rendering the scene @@ -291,6 +293,7 @@ int main(int argc, char** argv) // Rendering tonemapper helloVk.drawPost(cmdBuff); // Rendering UI + ImGui::Render(); ImGui::RenderDrawDataVK(cmdBuff, ImGui::GetDrawData()); cmdBuff.endRenderPass(); } diff --git a/utilities.cmake b/utilities.cmake new file mode 100644 index 0000000..8ca5a99 --- /dev/null +++ b/utilities.cmake @@ -0,0 +1,50 @@ + + + +# ------------------------------------------------------------------------------------------------- +# function that copies a list of files into the target directory +# +# target_copy_to_output_dir(TARGET foo +# [RELATIVE ] # allows to keep the folder structure starting from this level +# FILES [] +# ) +# +function(TARGET_COPY_TO_OUTPUT_DIR) + set(options) + set(oneValueArgs TARGET RELATIVE DEST_SUBFOLDER) + set(multiValueArgs FILES) + cmake_parse_arguments(TARGET_COPY_TO_OUTPUT_DIR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) + + foreach(_ELEMENT ${TARGET_COPY_TO_OUTPUT_DIR_FILES} ) + + # handle absolute and relative paths + if(TARGET_COPY_TO_OUTPUT_DIR_RELATIVE) + set(_SOURCE_FILE ${TARGET_COPY_TO_OUTPUT_DIR_RELATIVE}/${_ELEMENT}) + set(_FOLDER_PATH ${_ELEMENT}) + else() + set(_SOURCE_FILE ${_ELEMENT}) + get_filename_component(_FOLDER_PATH ${_ELEMENT} NAME) + set (_ELEMENT "") + endif() + + # handle directories and files slightly different + if(IS_DIRECTORY ${_SOURCE_FILE}) + if(MDL_LOG_FILE_DEPENDENCIES) + MESSAGE(STATUS "- folder to copy: ${_SOURCE_FILE}") + endif() + add_custom_command( + TARGET ${TARGET_COPY_TO_OUTPUT_DIR_TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory ${_SOURCE_FILE} $/${TARGET_COPY_TO_OUTPUT_DIR_DEST_SUBFOLDER}${_FOLDER_PATH} + ) + else() + if(MDL_LOG_FILE_DEPENDENCIES) + MESSAGE(STATUS "- file to copy: ${_SOURCE_FILE}") + endif() + add_custom_command( + TARGET ${TARGET_COPY_TO_OUTPUT_DIR_TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${_SOURCE_FILE} $/${TARGET_COPY_TO_OUTPUT_DIR_DEST_SUBFOLDER}${_ELEMENT} + ) + endif() + endforeach() +endfunction() +