working on vulkan device layers
This commit is contained in:
parent
e07da41f27
commit
773f02f11d
10 changed files with 140 additions and 10 deletions
|
|
@ -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){
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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 + "]");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement;
|
||||||
|
|
||||||
|
public class Device {
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement;
|
||||||
|
|
||||||
|
public class Queue {
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
package net.halbear.Terrain4J.EngineCore.VulkanDeviceManagement;
|
||||||
|
|
||||||
|
public class Surface {
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue