working on vulkan device layers

This commit is contained in:
Halbear 2026-01-15 21:19:04 +00:00
parent e07da41f27
commit 773f02f11d
10 changed files with 140 additions and 10 deletions

View file

@ -1,15 +1,17 @@
package net.halbear.Terrain4J.EngineCore.Display; package net.halbear.Terrain4J.EngineCore.Display;
import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance; import net.halbear.Terrain4J.EngineCore.Logic.EngineInstance;
import net.halbear.Terrain4J.EngineCore.Logic.VulkanContext;
public class Render { public class Render {
private final VulkanContext RendererContext;
public Render(EngineInstance engineInstance) { public Render(EngineInstance engineInstance) {
RendererContext = new VulkanContext();
} }
public void cleanup() { public void cleanup() {
RendererContext.cleanup();
} }
public void render(EngineInstance engineInstance) { public void render(EngineInstance engineInstance){
} }
} }

View file

@ -4,26 +4,29 @@ import net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils;
import org.lwjgl.PointerBuffer; import org.lwjgl.PointerBuffer;
import org.lwjgl.glfw.GLFWVulkan; import org.lwjgl.glfw.GLFWVulkan;
import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryStack;
import org.lwjgl.vulkan.EXTDebugUtils; import org.lwjgl.vulkan.*;
import org.lwjgl.vulkan.VkApplicationInfo;
import org.lwjgl.vulkan.VkExtensionProperties;
import org.lwjgl.vulkan.VkLayerProperties;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import java.nio.LongBuffer;
import java.security.cert.Extension;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.logging.Logger;
import static org.lwjgl.vulkan.VK10.vkEnumerateInstanceExtensionProperties; import static net.halbear.Terrain4J.EngineCore.Vulkan.Util.VulkanUtils.vkCheck;
import static org.lwjgl.vulkan.VK10.vkEnumerateInstanceLayerProperties; 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; import static org.lwjgl.vulkan.VK14.VK_API_VERSION_1_4;
public class VulkanInstance { public class VulkanInstance {
private static final String VALIDATION_LAYER = "VK_LAYER_KHRONOS_validation"; private static final String VALIDATION_LAYER = "VK_LAYER_KHRONOS_validation";
private static final String PORTABILITY_EXTENSION = "VK_KHR_portability_enumeration"; private static final String PORTABILITY_EXTENSION = "VK_KHR_portability_enumeration";
private static VkInstance vkInstance;
public VulkanInstance(boolean validate){ public VulkanInstance(boolean validate){
try (MemoryStack MemStack = MemoryStack.stackPush()) { try (MemoryStack MemStack = MemoryStack.stackPush()) {
@ -69,6 +72,17 @@ public class VulkanInstance {
RequiredExtensions.put(ExtraExtensions.get(i)); RequiredExtensions.put(ExtraExtensions.get(i));
} }
RequiredExtensions.flip(); 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<String> getSupportedInstanceExtensions(){ private Set<String> getSupportedInstanceExtensions(){
@ -108,4 +122,11 @@ public class VulkanInstance {
return LayersToUse; return LayersToUse;
} }
} }
public void cleanup() {
vkDestroyInstance(vkInstance, null);
}
public VkInstance getVkInstance() {
return vkInstance;
}
} }

View file

@ -25,6 +25,7 @@ public class Globals {
public static int FrameRate_RENDER =0; public static int FrameRate_RENDER =0;
public static int RENDERFRAMES =0; public static int RENDERFRAMES =0;
public static boolean VSYNC = false; public static boolean VSYNC = false;
private boolean vkValidated;
private Globals() { private Globals() {
@ -66,7 +67,11 @@ public class Globals {
accuracy = DEFAULT_ACCURACY; accuracy = DEFAULT_ACCURACY;
TickRate = DEFAULT_TICKRATE; TickRate = DEFAULT_TICKRATE;
} }
vkValidated = Boolean.parseBoolean(EngineConfig.getOrDefault("vkValidated", false).toString());
}
public boolean VkValidated(){
return vkValidated;
} }
public static synchronized Globals getInstance() { public static synchronized Globals getInstance() {

View file

@ -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();
}
}

View file

@ -2,6 +2,8 @@ package net.halbear.Terrain4J.EngineCore.Vulkan.Util;
import java.util.Locale; import java.util.Locale;
import static org.lwjgl.vulkan.VK10.*;
public class VulkanUtils { public class VulkanUtils {
public enum OSType {WINDOWS, MACOS, LINUX, UNSUPPORTED} public enum OSType {WINDOWS, MACOS, LINUX, UNSUPPORTED}
public static OSType getOS() { public static OSType getOS() {
@ -18,4 +20,31 @@ public class VulkanUtils {
} }
return result; 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 + "]");
}
}
} }

View file

@ -0,0 +1,4 @@
package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement;
public class Device {
}

View file

@ -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<PhysicalDevice>();
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;
}
}

View file

@ -0,0 +1,4 @@
package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement;
public class Queue {
}

View file

@ -0,0 +1,4 @@
package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement;
public class Surface {
}

View file

@ -3,5 +3,6 @@
display_height=480 display_height=480
display_width=640 display_width=640
frame_accuracy=0 frame_accuracy=0
main_tick_rate=60 main_tick_rate=120
vsync=false vsync=false
vkValidated=true