From e07da41f27093ab25f6371cb6e4220749ba81da9 Mon Sep 17 00:00:00 2001 From: Halbear Date: Thu, 15 Jan 2026 14:58:07 +0000 Subject: [PATCH] Vulkan Renderer Progress --- .gradle/8.14/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/8.14/checksums/md5-checksums.bin | Bin 21797 -> 23397 bytes .gradle/8.14/checksums/sha1-checksums.bin | Bin 29189 -> 33293 bytes .../executionHistory/executionHistory.bin | Bin 99644 -> 99644 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.14/fileHashes/fileHashes.bin | Bin 22597 -> 24697 bytes .gradle/8.14/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 19325 -> 19667 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes .../compileJava/previous-compilation-data.bin | Bin 110935 -> 110800 bytes .../EngineCore/Display/VulkanInstance.java | 101 +++++++++++++++++- .../EngineCore/Vulkan/Util/VulkanUtils.java | 21 ++++ terrain4j.properties | 2 +- 14 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Util/VulkanUtils.java diff --git a/.gradle/8.14/checksums/checksums.lock b/.gradle/8.14/checksums/checksums.lock index a7ac98cad629ac41b16b909cb07a34b6dbad4976..73e7ccf2796d8bbbc490e4c4700d1755dabb9b01 100644 GIT binary patch literal 17 VcmZRcHrMum5d-&p1~6dk001b|1DOB- literal 17 VcmZRcHrMum5d-&p1~6b00{|#u11A6g diff --git a/.gradle/8.14/checksums/md5-checksums.bin b/.gradle/8.14/checksums/md5-checksums.bin index 4413880852b20ca19b69121a34700adcc2890bc1..652abe2b113c59b4c30eaab66e20b1f0fd59bfca 100644 GIT binary patch delta 1149 zcmYk2dn}b<9LGDMlG`ifyhm=?u~+6+G^Zt(cFNs39FB9&XouR4XqK|5l|>eob@`1o zCtH_^ToxHBx0q|?c3g`^D|DH{7*?EK@AJOa^UwQzKhO95{NCp&DrHUAvMOEKb}=^| zl|6`){`A^Lt*|vUy|OdClL~^8`w@>20-tS#-5rT=`}3`3H-gfg5XH74lxGVDvAXDA z2#RsWpez^v=<|1MMO>l>$)uqOcd3{>E{{i0#)4cn&)~oe;b||rMGKxoBU?bc>^aDv zuxl$pFkH-7U+Hg@COQ_qLp;(5v~c&xrl|F_(|leag3>~!-0C!yDyuY3L0saw#Y;VR z;B~59w7j0-Z5jasbGliyT>Kf_a0Sub!CfF&sybS7o++zR@5MICT`Oq`7xHi`YaoHiLAuN?o0xMyWd%T!hqacQZ8m zQ|avjETHs013J-ej~Lca>Rkf+P^#CL3Q;Ka&%*6c2TgL?AiN26+#EZU1tEb{ZCD?! zqcma-;xLMhDo6qwn7$HHLBUP^wdC#M@ew|@s= znLGG9)R12)8${D*?0-X86b(9u3i7DWFIidL{RF~_P6(oCLQz>Mf4gZ4SwRqNXIOGb zR_UUh4>GksWKtEI8;{=#j1=E%K$!pABKJGl9+~0rZN8o}$a~3qukRC{dCL)bMJ!BE zQnGnc7BM-mEr}#JXIJgP=);=MBy`24{ znc=TJ2$jL0`%4O`n|t=C`9PB?LRA&GJ4(rJ>!yT9^;A5<0t?7=Y$0!^3#;Beq#8n4 zI0dVnQUrr78zy^_P3jTmnj6O-y3}bIWNTB1yhH&CClNW)cIr^NGT{Y6r2$Sj@dTq+ zEtH4r*3Ba<(it6Y`+jDb@2K5@yx14oodWng*L3U4ecW8?eq-)<%*LN|DZL(;t8#!T zr&Pj!f7pD(z)#3ZEJ5NNK%A~t-Xnvvk(KvBxwDA8+xCk0m5!djAX zF;I9GVOh1Y(@ZhnXRkcT9Jy)^9y+&>4}OThIm+(%Wh|Tb0p4(6yY`)t2`G zaz!n8xycA;@2H&{Z(Km8ItL0jnmFlY7Fx4?Gct7@Xx#Mt4TfKm8pRZ{@?%C%QN*2t zfd@Lcn<}+~-R^2ayj)IKGbeg{ht4A_z7DHAd4hxiH~zYBGq~!))y9z$%Vw1Sy5FA2xt;}g&sIW|;A7SA z%iTwz8oE8Dg3Nbf`07@F?ll*_XEezC>SyKVQ?Knog9<*Z7ShDWfg#=L1C7WO*T73C z-JJWof?VO7_)mo8sYZi>7o|bN-sKj^m4!xLcsfQ>uMXy(YSD902zi@}_bsm$D(r-q zT()3LF4<%@)R9||g*vRubhKZ76jZt$L z1(tDkZ2d#5cRvH#SX($6i}jCT6_c}w^%oz)+IQK$9XmmW>QV0JEe6xSvw6SYfeomx%OMlhjSrz7Ri8E7LUoe{Lc&(` zr!X!Q#7o#+^>;ui@>@aB%BfkngKE$RVt2AtLpuOos!mjYc);RIb^d({Vt28g!_(lk zjRNmzjAkJxi-PbZjGjVbI0fA@HX2z0bxExMND=%un}U$N_Ga2^BO3T5hJwctY|vbSzcCL}LPfov=%{J9O0SB4q(j(LlvcxR^G_=au`Z04Dl`|*Db{<;^+O6yfjM1QC zPB$}^9d9fKe0NZA2%8v|K@QX8>UMU`U=$CdFW+h`4i-{bb3-}2o<>0sUW8#k z3^VsSjHh8}1`Tt@Ug$Dz4yx@G+`@k2eh|bA<(STP7(WNzQOpTrG_eWP%yp=u*tLl* zaE)0Lvp4l0G1z2Kf^U3;5_hY7r%(HOXScmkWgGn9_}3;TrnTBh$u4&LmJ@$6|8M*s DVPPyL delta 269 zcmWN?txp1B0Kj2k(`IqgdtW}zJ3fwY?!7q-ZUlq7;}0;RXQ63xUeP2G=Jp%WU^@$w zv7=#9nvu<7)9NfRi<^XJPwzI~{fs^BiTK)#h6q^*i6vdS@{U>}V49G8Cj@%(ijSm6 zGj+x!<+7drA+7ribdQA|67BjN8H%1Em>UlJrq9q+EKQqc#v{svTxK1fv!^t2l1|R$ zH7D52x46h_+~+<1R@#=NZ)r@ekn4hESkPD$e9nuCw_=NWNpMnnr&A7CmIYQNU{cZe zTHUKE=2gi?%^%;?j2M%;$BwPhwja@z%RotHtB)N)z`aR(*C&BV4yQ;Z%`8XXNs5aSALKRnbK? zIS%>`8*n0NNBX03rF@2laT49xj|}v_ib^4Oq5wKd1o{PbQ@~RC9IQ|5gB_&;T~MBDyS3l3e~VPQU``koZSFF2@2x%19lYam2z#AfJ9C&&vXm zRSZ>?0{u>I^-uXBzDl6KU^yF}b`*pDs-URj(!uWPGTblb^1$U$0rzWSbOc?VvmGRp z2VW!^&}0x$6D0E-1cL&dlOJffPJGCjIM{H%0n@btT~f0vptDY(Q`qv+ud$Q{PGc3m zf;2!0^{OM6P#*_#^#+_f!{np)u{X|d|sx; zg9qLUd~B(Q3H3R!(4{(dQ6}U;Z#TnrGE5G*HqVr7xQJ^+v7lEXp&Q>eii1)$6g)m* zQlg+4mV1~I2V?3ecu$=JUUgYwK(+e+uZPYL*(MCI!oJfCzktMnaVuG%Kg(ej_8;Km zuaRt6_fZJ@^?bxe%ITyWE|PwvO@zqbc(a~ow2Sc*%J^sP#Hgk(Ncv|u-U#d8KF>dQ zkR19{R)g>AAh+mW3ayssI!PfipkS$n$Gb=oE-dP>^M@Dsnu{Eyk7dckJx%&1iZ%0*Wu1q-u9+T`)N>y4iss5iX&Lg6 zH#NS9s_~LNnj4X2ikD|^<8!j`XJ+S{iVq41T ZzAK$;{(j6hvSrI5AJEkxA3H`){sT1yD0%<@ delta 334 zcmdnf#kQx5tzipey{Un}-|Uitj0&U5^0KU~RHKqaqx_Q8+;Vf1yn@6^fqjqmXn9RF z_Aw4PzFn|uam;p^?dwe$+u1h%4NkOV;(0Z>@m|>U{pyS!jQ@bl?CHJbj2zQ{mof%3 z9-F-3E|hG@A3b^f-JI#g8jP=}TURoAPhY9Y*gl=RiqU6#jTYlgrs*2BjNX$S z@7GR$SIg);`OpKO>D6_N=93ppshO@*&nUn;<<#QNP17Cg8N*oTfthpa8MRs0odJoS zsb^GXeQ+AY{8G>8GCk0cQGR-O15npguzXGfqbvJ0kS^n2(=Qq_s<3Vbi$82&RGBVk z#K=8eppns%1td24+#~7f8I3@#ufR%b8yS^YpMi~D(#SY(`)XsxRgBZOv@mu60NXK< AkpKVy diff --git a/.gradle/8.14/executionHistory/executionHistory.lock b/.gradle/8.14/executionHistory/executionHistory.lock index 1c8ed342f4611a7ccd331daf77dc0d1116c23a95..eddb209ae733fb4a44324900fbc727ad786b18ac 100644 GIT binary patch literal 17 UcmZSnawk1KDCSo?0|cA}06t*_o&W#< literal 17 UcmZSnawk1KDCSo?0|Xoa06tg+l>h($ diff --git a/.gradle/8.14/fileHashes/fileHashes.bin b/.gradle/8.14/fileHashes/fileHashes.bin index 292b8fc3a8e0af13f1b8201acaccbecf7f308331..7bbd37cae81afae7040e468163842fab3bdf13f5 100644 GIT binary patch delta 2100 zcma)+e@s(X6vx|2Q$rw(@@rKQVFD_PL)*~O7AR1PIMKQy)5_C?hfI6qlX>es~or=GRC?MI~6q)R{_q~RJe|VGEd-J*Hd(OQ* z-}f#!=&u^-j;TV?+6|hO(+%AxKc)GGsb_#3FilucTJ}rZwV;dw# z?^KYy*w4=nFt^OBAo_<4G)2>R`99 zn7i*{>JfJE$Tc{|TnbE)M1J^>?(0jhy1FpT_E5sw)ip)Vd7a5*!YLpYX}EQXb4TlR zPsu8I=b#Y56XFjP8(S}QkQqLNI+2CjSmRjxxZPTUVa^O-6B6!EB9=Lts0<}@egiT> zB5w)L4_SZkKn;fG5b6LeyP~YEJ&I<`O-7hWNK&qxa&OxGugFTKy-EdN6Pd>Fj7RTa zZcO%bNMcn#ZewGf`x*>H5hs3XoI5(M+b<0b4BLM)rqq-sPHi8pGT|kcnq->dn0o z@6}$z%=`chVvRiR%bFnb_HH)`)l{jtvuVG7y{MrQ^Sm9fM=a$m=H0FO%$A2)&K_t$ zm1aI(?y3oI+(agD!WFTWQ<>M>H)n4yDSiRtCpfr<)9nhD%N2xS!CY`nh?i&Ilu3Fk zI|48?vZ?Z>+ab2^0#$#L8O+c%A)dQvT;~f_zw!)*`BD&vNw`JDOTWE!&;Fc*n_ybl zkBreyr}U-38EY8>vp#AoJ#J{eyzQSunSF&VzeV0m+)Ja;?e^D^DLxG|<`$Zxr=Xt* z^hmuA_xk5$V>gxv6~~TESDLz$j{i?VYxNp>h+^{+OX4fufS|}ITKfI%RcV71MKl_7 zxofy2?LbUVV(_xibJkhx`QObMtGKMgC~YmU?W6Ur3D4ot21BHhy1r(&cx<6y>``xeUVi* z=Q`uyYt!T|8>lno4Aq}t%Zz1MmO(9=)Z@T|CUj|bR;;&pa@PCwYADW%4v2BDj)ncy z!c8q$+0mumE#KKj+$l!$kYl{fMt;RR+sLmNZlhA!aa!e_IRuMZ7H-NJ|BC=1#EcmB=JY5iW-?y$>HJ{p3rt9j8H# zlBs0AxL=XS33zSrsVZWiDT9Cx4R1t~rvlz+LXhjc!U_`>1_gsvJ83q`ABh3o`;{5e j|4#dYD%;+ig-Op=|FwVRU6t2{O`angeG0ncnpg23Z#K{I delta 583 zcmex)fbr-C#tkMCj6suqB@!m9N>)tXDk(AfucXK1SSgRmd!-U4n@USeP6gt%K+G$X zIJr$mfAU!wpuB9w8zG?C5cAa5>&)=5^qG^ZeRWx9 z*oNpcOkN9Q0mbayCf|p${3Z+f>G5nA){A5S0v1J=MVtS7+A%7mJvBQ}r2RHFCCI$j z&;3OT0|Vo%?UomJfm8uO>Eu}NaMoGJmMgB9ywiIkn6+)PzfYaQiLb6RJrl&TPF?wK z>bH|W9HbGbY%4?`w8_f@4`AO-C-A%7AF%Pyy0<#y~<7h!sItz;_bY z8^Mxk(Se^=-S}N6@CK}7`Pk|*k(k~IV?x}|Xg zqKND4Xg7GG^S<)7*E)#(*AylPhDa$a{XfO3qA!=_>@~LU ztJ;d9L6SgkuYs7t{%&%0yy|4WFnI+o$I^J$na0^kI)2mEoxbk?Rk#PDkWYEDZ`cn; E0AN+oq5uE@ diff --git a/.gradle/8.14/fileHashes/fileHashes.lock b/.gradle/8.14/fileHashes/fileHashes.lock index 465698c0806c5d55b7005577293fd248d828245a..21d2c993a5981f837f274ba7e48a3bc4bf4955f6 100644 GIT binary patch literal 17 UcmZQ>mUZJ_YNV{j00zuq02{CZasU7T literal 17 UcmZQ>mUZJ_YNV{j00zwb02^rnD*ylh diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 29369b4e6919f67a47c5812d8e9704d9d378890b..e53ec68322a01926415a095ee2708690f833b5f3 100644 GIT binary patch literal 17 VcmZR!y1etfRb2oh0~j!t001&W1UCQx literal 17 VcmZR!y1etfRb2oh0~j!d001&01Q!4R diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index a7b69ad74aab5d7a100c2848e4bb7f36bd76119b..1c814eda9caa70ef04b3d4485e73987631a60b92 100644 GIT binary patch delta 457 zcmex6jq&nK#tkMCjE<8{B@6_nd8x@c&HN+G00usxlVc?m1QtyX`jRs9X#_;j`}*cm z2?0ip+n!6CJ@2c;Lq#|Lhk|G4WR7b`F$O}7sGM9Ysi5(CzkuViy{z}3f(K!W-)41t z)h+$96e=!1d8(v>z!x_;FAx2dr=TV;oV-@jQe8Up_-Z4AUZ_G|m;sEY8FPEjzkUW4 zPoI1jXaLLEId`5{8+?We8czNynIRxnY#f@)<)jWZ_2uMHDFp%LJhz=zm49lXg1;x{ zN?B;AweD>HDT`LrP2xl@k^%XGCo}D4prGdd9QSUK*~FZhpJy> qjzU$gpUf)L#l)t$QSpcPMuQK6n;kuDm?!V|aGspt5j8o_b0+{ducRmd delta 88 zcmV-e0H^=cnF0Nl0kAX}0WOm@7%-E47#Opy7zhEADV3UC9I literal 8 PcmZQzV4SU}ar{332A%?} diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin index ce6149292829ac526b90d489b246fb8ee67ca5f5..f19c87e1ba1d276a6a327e93b642c77bfd65d191 100644 GIT binary patch delta 1602 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 diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/VulkanInstance.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/VulkanInstance.java index ec167d6..e84ea28 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/VulkanInstance.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/VulkanInstance.java @@ -1,18 +1,111 @@ package net.halbear.Terrain4J.EngineCore.Display; +import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils; +import org.lwjgl.PointerBuffer; +import org.lwjgl.glfw.GLFWVulkan; import org.lwjgl.system.MemoryStack; -import org.lwjgl.vulkan.VK; +import org.lwjgl.vulkan.EXTDebugUtils; import org.lwjgl.vulkan.VkApplicationInfo; +import org.lwjgl.vulkan.VkExtensionProperties; +import org.lwjgl.vulkan.VkLayerProperties; import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import static org.lwjgl.vulkan.VK10.vkEnumerateInstanceExtensionProperties; +import static org.lwjgl.vulkan.VK10.vkEnumerateInstanceLayerProperties; import static org.lwjgl.vulkan.VK14.VK_API_VERSION_1_4; + public class VulkanInstance { + private static final String VALIDATION_LAYER = "VK_LAYER_KHRONOS_validation"; + private static final String PORTABILITY_EXTENSION = "VK_KHR_portability_enumeration"; + public VulkanInstance(boolean validate){ - try (MemoryStack stack = MemoryStack.stackPush()) { - ByteBuffer appShortName = stack.UTF8("Terrain4J"); - var appInfo = VkApplicationInfo.calloc(stack).sType$Default().pApplicationName(appShortName).applicationVersion(1).pEngineName(appShortName).engineVersion(3).apiVersion(VK_API_VERSION_1_4); + try (MemoryStack MemStack = MemoryStack.stackPush()) { + ByteBuffer appShortName = MemStack.UTF8("Terrain4J"); + var appInfo = VkApplicationInfo.calloc(MemStack).sType$Default().pApplicationName(appShortName).applicationVersion(1).pEngineName(appShortName).engineVersion(3).apiVersion(VK_API_VERSION_1_4); + + //Vulkan operates in "Layers" and does minimal validation as it expects the developer to be competent, so we add these ourseves for better debugging + //refer to https://vulkan-tutorial.com/Drawing_a_triangle/Setup/Validation_layers for an explanation + List ValidationLayers = getSupportedValidationLayers(); + int ValidationLayerCount = ValidationLayers.size(); + boolean SupportsValidation = validate; + if (validate && ValidationLayerCount == 0){ + SupportsValidation = false; + } + //once its done the validation layers, transform it into a pointer (null terminated string to be exact) + PointerBuffer RequiredLayers = null; + if (SupportsValidation){ + RequiredLayers = MemStack.mallocPointer(ValidationLayerCount); + for(int i = 0; i < ValidationLayerCount; i++){ + RequiredLayers.put(i, MemStack.ASCII(ValidationLayers.get(i))); + } + } + //enable MacOS Support because they use sum fuckin buuuullshiiiit + Set InstanceExtensions = getSupportedInstanceExtensions(); + boolean CrossPlatform = InstanceExtensions.contains(PORTABILITY_EXTENSION) && VulkanUtils.getOS() == VulkanUtils.OSType.MACOS; + + PointerBuffer GLFW_Extensions = GLFWVulkan.glfwGetRequiredInstanceExtensions(); + if (GLFW_Extensions == null){ + throw new RuntimeException("Failed to find the GLFW platform surface extensions for vulkan"); + } + + var ExtraExtensions = new ArrayList(); + if(SupportsValidation){ + ExtraExtensions.add(MemStack.UTF8(EXTDebugUtils.VK_EXT_DEBUG_UTILS_EXTENSION_NAME)); + } + if(CrossPlatform){ + ExtraExtensions.add(MemStack.UTF8(PORTABILITY_EXTENSION)); + } + int ExtraExtensionsCount = ExtraExtensions.size(); + PointerBuffer RequiredExtensions = MemStack.mallocPointer(GLFW_Extensions.remaining() + ExtraExtensionsCount); + RequiredExtensions.put(GLFW_Extensions); + for(int i = 0; i < ExtraExtensionsCount; i++){ + RequiredExtensions.put(ExtraExtensions.get(i)); + } + RequiredExtensions.flip(); + } + } + private Set getSupportedInstanceExtensions(){ + Set InstanceExtensions = new HashSet<>(); + try(var MemStack = MemoryStack.stackPush()){ + IntBuffer ExtensionsBuffer = MemStack.callocInt(1); + vkEnumerateInstanceExtensionProperties((String)null,ExtensionsBuffer, null); + int ExtensionsCount = ExtensionsBuffer.get(0); + + var InstanceExtensionsProps = VkExtensionProperties.calloc(ExtensionsCount, MemStack); + vkEnumerateInstanceExtensionProperties((String)null,ExtensionsBuffer, InstanceExtensionsProps); + for(int i = 0; i < ExtensionsCount; i++){ + VkExtensionProperties Properties = InstanceExtensionsProps.get(i); + String ExtensionName = Properties.extensionNameString(); + InstanceExtensions.add(ExtensionName); + } + } + return InstanceExtensions; + } + private List getSupportedValidationLayers(){ + try(var MemStack = MemoryStack.stackPush()) { + IntBuffer LayersArray = MemStack.callocInt(1); + vkEnumerateInstanceLayerProperties(LayersArray, null); + int Layers = LayersArray.get(0); + var PropertiesBuffer = VkLayerProperties.calloc(Layers, MemStack); + vkEnumerateInstanceLayerProperties(LayersArray, PropertiesBuffer); + List SupportedLayers = new ArrayList<>(); + for (int i = 0; i < Layers; i++) { + VkLayerProperties properties = PropertiesBuffer.get(i); + String LayerName = properties.layerNameString(); + SupportedLayers.add(LayerName); + } + List LayersToUse = new ArrayList<>(); + if (SupportedLayers.contains(VALIDATION_LAYER)) { + LayersToUse.add(VALIDATION_LAYER); + } + return LayersToUse; } } } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Util/VulkanUtils.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Util/VulkanUtils.java new file mode 100644 index 0000000..865400a --- /dev/null +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Util/VulkanUtils.java @@ -0,0 +1,21 @@ +package net.halbear.Terrain4J.EngineCore.Vulkan.Util; + +import java.util.Locale; + +public class VulkanUtils { + public enum OSType {WINDOWS, MACOS, LINUX, UNSUPPORTED} + public static OSType getOS() { + OSType result; + String os = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH); + if ((os.contains("mac")) || (os.contains("darwin"))) { + result = OSType.MACOS; + } else if (os.contains("win")) { + result = OSType.WINDOWS; + } else if (os.contains("nux")) { + result = OSType.LINUX; + } else { + result = OSType.UNSUPPORTED; + } + return result; + } +} diff --git a/terrain4j.properties b/terrain4j.properties index 046ce4d..e7f6811 100644 --- a/terrain4j.properties +++ b/terrain4j.properties @@ -1,5 +1,5 @@ #created new properties file -#Mon Dec 15 10:15:30 GMT 2025 +#Thu Jan 15 13:32:39 GMT 2026 display_height=480 display_width=640 frame_accuracy=0