diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java index 5b57ba8..8ddc853 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/Render.java @@ -1,15 +1,17 @@ package net.halbear.Terrain4J.EngineCore.Display; import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; +import net.halbear.Terrain4J.EngineCore.Logic.VulkanContext; public class Render { + private final VulkanContext RendererContext; public Render(EngineInstance engineInstance) { - + RendererContext = new VulkanContext(); } public void cleanup() { - + RendererContext.cleanup(); } - public void render(EngineInstance engineInstance) { + public void render(EngineInstance engineInstance){ } } 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 e84ea28..7626cdf 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Display/VulkanInstance.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Display/VulkanInstance.java @@ -4,26 +4,29 @@ 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.EXTDebugUtils; -import org.lwjgl.vulkan.VkApplicationInfo; -import org.lwjgl.vulkan.VkExtensionProperties; -import org.lwjgl.vulkan.VkLayerProperties; +import org.lwjgl.vulkan.*; import java.nio.ByteBuffer; import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.security.cert.Extension; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.logging.Logger; -import static org.lwjgl.vulkan.VK10.vkEnumerateInstanceExtensionProperties; -import static org.lwjgl.vulkan.VK10.vkEnumerateInstanceLayerProperties; +import static net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils.vkCheck; +import static org.lwjgl.vulkan.EXTDebugUtils.vkCreateDebugUtilsMessengerEXT; +import static org.lwjgl.vulkan.EXTDebugUtils.vkDestroyDebugUtilsMessengerEXT; +import static org.lwjgl.vulkan.VK10.*; 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"; + private static VkInstance vkInstance; public VulkanInstance(boolean validate){ try (MemoryStack MemStack = MemoryStack.stackPush()) { @@ -69,6 +72,17 @@ public class VulkanInstance { RequiredExtensions.put(ExtraExtensions.get(i)); } RequiredExtensions.flip(); + var InstanceInfo = VkInstanceCreateInfo.calloc(MemStack) + .sType$Default() + .pApplicationInfo(appInfo) + .ppEnabledLayerNames(RequiredLayers) + .ppEnabledExtensionNames(RequiredExtensions); + if(CrossPlatform){ + InstanceInfo.flags(0x00000001); + } + PointerBuffer PointerInstance = MemStack.mallocPointer(1); + vkCheck(vkCreateInstance(InstanceInfo,null,PointerInstance), "Error Creating Vulkan Instance"); + vkInstance = new VkInstance(PointerInstance.get(0),InstanceInfo); } } private Set getSupportedInstanceExtensions(){ @@ -108,4 +122,11 @@ public class VulkanInstance { return LayersToUse; } } + public void cleanup() { + vkDestroyInstance(vkInstance, null); + } + + public VkInstance getVkInstance() { + return vkInstance; + } } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/Globals.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/Globals.java index d3697c8..7963beb 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/Globals.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/Globals.java @@ -25,6 +25,7 @@ public class Globals { public static int FrameRate_RENDER =0; public static int RENDERFRAMES =0; public static boolean VSYNC = false; + private boolean vkValidated; private Globals() { @@ -66,7 +67,11 @@ public class Globals { accuracy = DEFAULT_ACCURACY; TickRate = DEFAULT_TICKRATE; } + vkValidated = Boolean.parseBoolean(EngineConfig.getOrDefault("vkValidated", false).toString()); + } + public boolean VkValidated(){ + return vkValidated; } public static synchronized Globals getInstance() { diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/VulkanContext.java b/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/VulkanContext.java new file mode 100644 index 0000000..4708154 --- /dev/null +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Logic/VulkanContext.java @@ -0,0 +1,15 @@ +package net.halbear.Terrain4J.EngineCore.Logic; + +import net.halbear.Terrain4J.EngineCore.Display.VulkanInstance; + +public class VulkanContext { + private final VulkanInstance Instance; + public VulkanContext(){ + var EngineGlobals = Globals.getInstance(); + Instance = new VulkanInstance(EngineGlobals.VkValidated()); + } + + public void cleanup(){ + Instance.cleanup(); + } +} 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 index 865400a..e12c5ae 100644 --- a/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Util/VulkanUtils.java +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/Vulkan/Util/VulkanUtils.java @@ -2,6 +2,8 @@ package net.halbear.Terrain4J.EngineCore.Vulkan.Util; import java.util.Locale; +import static org.lwjgl.vulkan.VK10.*; + public class VulkanUtils { public enum OSType {WINDOWS, MACOS, LINUX, UNSUPPORTED} public static OSType getOS() { @@ -18,4 +20,31 @@ public class VulkanUtils { } return result; } + + public static void vkCheck(int err, String errMsg) { + if (err != VK_SUCCESS) { + String errCode = switch (err) { + case VK_NOT_READY -> "VK_NOT_READY"; + case VK_TIMEOUT -> "VK_TIMEOUT"; + case VK_EVENT_SET -> "VK_EVENT_SET"; + case VK_EVENT_RESET -> "VK_EVENT_RESET"; + case VK_INCOMPLETE -> "VK_INCOMPLETE"; + case VK_ERROR_OUT_OF_HOST_MEMORY -> "VK_ERROR_OUT_OF_HOST_MEMORY"; + case VK_ERROR_OUT_OF_DEVICE_MEMORY -> "VK_ERROR_OUT_OF_DEVICE_MEMORY"; + case VK_ERROR_INITIALIZATION_FAILED -> "VK_ERROR_INITIALIZATION_FAILED"; + case VK_ERROR_DEVICE_LOST -> "VK_ERROR_DEVICE_LOST"; + case VK_ERROR_MEMORY_MAP_FAILED -> "VK_ERROR_MEMORY_MAP_FAILED"; + case VK_ERROR_LAYER_NOT_PRESENT -> "VK_ERROR_LAYER_NOT_PRESENT"; + case VK_ERROR_EXTENSION_NOT_PRESENT -> "VK_ERROR_EXTENSION_NOT_PRESENT"; + case VK_ERROR_FEATURE_NOT_PRESENT -> "VK_ERROR_FEATURE_NOT_PRESENT"; + case VK_ERROR_INCOMPATIBLE_DRIVER -> "VK_ERROR_INCOMPATIBLE_DRIVER"; + case VK_ERROR_TOO_MANY_OBJECTS -> "VK_ERROR_TOO_MANY_OBJECTS"; + case VK_ERROR_FORMAT_NOT_SUPPORTED -> "VK_ERROR_FORMAT_NOT_SUPPORTED"; + case VK_ERROR_FRAGMENTED_POOL -> "VK_ERROR_FRAGMENTED_POOL"; + case VK_ERROR_UNKNOWN -> "VK_ERROR_UNKNOWN"; + default -> "Not mapped"; + }; + throw new RuntimeException(errMsg + ": " + errCode + " [" + err + "]"); + } + } } diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Device.java b/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Device.java new file mode 100644 index 0000000..6e9fdd9 --- /dev/null +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Device.java @@ -0,0 +1,4 @@ +package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement; + +public class Device { +} diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/PhysicalDevice.java b/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/PhysicalDevice.java new file mode 100644 index 0000000..cadf93e --- /dev/null +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/PhysicalDevice.java @@ -0,0 +1,45 @@ +package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement; + +import net.halbear.Terrain4J.EngineCore.Display.VulkanInstance; +import org.lwjgl.PointerBuffer; +import org.lwjgl.system.MemoryStack; +import org.lwjgl.vulkan.VkPhysicalDevice; + +import java.nio.IntBuffer; +import java.sql.Array; +import java.util.ArrayList; + +import static net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils.vkCheck; +import static org.lwjgl.vulkan.VK10.vkEnumeratePhysicalDevices; + +public class PhysicalDevice { + + private PhysicalDevice(VkPhysicalDevice VulkanPhysicalDevice){ + + } + + public static PhysicalDevice createPhysicalDevice(VulkanInstance instance, String PreferredDeviceName){ + PhysicalDevice result = null; + try (var MemStack = MemoryStack.stackPush()){ + PointerBuffer PointerPhyiscalDevices = getPhysicalDevices(instance, MemStack); + int DeviceCount = PointerPhyiscalDevices.capacity(); + + var physDevices = new ArrayList(); + for(int i = 0; i < DeviceCount; i++){ + var vkPhysicalDevice = new VkPhysicalDevice(PointerPhyiscalDevices.get(i),instance.getVkInstance()); + var PhysDevice = new PhysicalDevice(vkPhysicalDevice); + } + } + return null; + } + + public static PointerBuffer getPhysicalDevices(VulkanInstance instance, MemoryStack MemStack){ + PointerBuffer PointerPhysicalDevices; + IntBuffer intBuffer = MemStack.mallocInt(1); + vkCheck(vkEnumeratePhysicalDevices(instance.getVkInstance(),intBuffer,null),"Failed to fetch physical device count"); + int DeviceCount = intBuffer.get(0); + PointerPhysicalDevices = MemStack.mallocPointer(DeviceCount); + vkCheck(vkEnumeratePhysicalDevices(instance.getVkInstance(),intBuffer,PointerPhysicalDevices),"Failed to fetch physical devices"); + return PointerPhysicalDevices; + } +} diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Queue.java b/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Queue.java new file mode 100644 index 0000000..150b53e --- /dev/null +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Queue.java @@ -0,0 +1,4 @@ +package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement; + +public class Queue { +} diff --git a/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Surface.java b/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Surface.java new file mode 100644 index 0000000..934cb7d --- /dev/null +++ b/src/main/java/net/halbear/Terrain4J/EngineCore/VulkanDeviceManagement/Surface.java @@ -0,0 +1,4 @@ +package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement; + +public class Surface { +} diff --git a/terrain4j.properties b/terrain4j.properties index e7f6811..04404fb 100644 --- a/terrain4j.properties +++ b/terrain4j.properties @@ -3,5 +3,6 @@ display_height=480 display_width=640 frame_accuracy=0 -main_tick_rate=60 +main_tick_rate=120 vsync=false +vkValidated=true