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;
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){
}
}

View file

@ -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<String> getSupportedInstanceExtensions(){
@ -108,4 +122,11 @@ public class VulkanInstance {
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 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() {

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 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 + "]");
}
}
}

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_width=640
frame_accuracy=0
main_tick_rate=60
main_tick_rate=120
vsync=false
vkValidated=true