Skip to content

Commit 4e31f0d

Browse files
committed
migrated instance, device, surface, and swapchain to new builder architecture
1 parent beba5fe commit 4e31f0d

35 files changed

+678
-589
lines changed

jme3-core/src/main/java/com/jme3/util/natives/Native.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import org.lwjgl.system.MemoryUtil;
44

5-
public interface Native <T> extends AutoCloseable {
5+
public interface Native <T> {
66

77
T getNativeObject();
88

@@ -12,11 +12,6 @@ public interface Native <T> extends AutoCloseable {
1212

1313
NativeReference getNativeReference();
1414

15-
@Override
16-
default void close() {
17-
getNativeReference().destroy();
18-
}
19-
2015
static void set(NativeManager manager) {
2116
BasicNativeManager.setGlobalInstance(manager);
2217
}

jme3-core/src/main/java/com/jme3/util/natives/NativeReference.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ public interface NativeReference {
44

55
void destroy();
66

7+
void refresh();
8+
79
void addDependent(NativeReference reference);
810

911
boolean isDestroyed();
1012

11-
void refresh();
12-
1313
}

jme3-examples/src/main/java/jme3test/vulkan/VulkanHelperTest.java

Lines changed: 39 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.jme3.math.Quaternion;
77
import com.jme3.math.Transform;
88
import com.jme3.math.Vector3f;
9-
import com.jme3.renderer.vulkan.VulkanUtils;
109
import com.jme3.shaderc.ShaderType;
1110
import com.jme3.shaderc.ShadercLoader;
1211
import com.jme3.system.AppSettings;
@@ -17,11 +16,11 @@
1716
import com.jme3.vulkan.Queue;
1817
import com.jme3.vulkan.buffers.*;
1918
import com.jme3.vulkan.descriptors.*;
19+
import com.jme3.vulkan.devices.*;
2020
import com.jme3.vulkan.flags.ImageUsageFlags;
2121
import com.jme3.vulkan.flags.MemoryFlags;
2222
import com.jme3.vulkan.flags.BufferUsageFlags;
2323
import com.jme3.vulkan.images.*;
24-
import org.lwjgl.PointerBuffer;
2524
import org.lwjgl.glfw.GLFW;
2625
import org.lwjgl.system.MemoryStack;
2726
import org.lwjgl.vulkan.*;
@@ -39,7 +38,7 @@ public class VulkanHelperTest extends SimpleApplication implements SwapchainUpda
3938

4039
private VulkanInstance instance;
4140
private Surface surface;
42-
private LogicalDevice device;
41+
private LogicalDevice<SimplePhysicalDevice> device;
4342
private SimpleQueueFamilies queues;
4443
private Swapchain swapchain;
4544
private ShaderModule vertModule, fragModule;
@@ -54,8 +53,6 @@ public class VulkanHelperTest extends SimpleApplication implements SwapchainUpda
5453
private boolean swapchainResizeFlag = false;
5554
private boolean applicationStopped = false;
5655

57-
private final Collection<String> deviceExtensions = new ArrayList<>();
58-
5956
private VulkanLogger logger;
6057

6158
// mesh
@@ -106,49 +103,41 @@ public void simpleInitApp() {
106103
flyCam.setMoveSpeed(5f);
107104
flyCam.setDragToRotate(true);
108105

109-
deviceExtensions.add(KHRSwapchain.VK_KHR_SWAPCHAIN_EXTENSION_NAME);
110106
long window = ((LwjglVulkanContext)context).getWindowHandle();
111107

112-
try (InstanceBuilder inst = new InstanceBuilder(VK13.VK_API_VERSION_1_3)) {
113-
114-
// build instance
115-
inst.addGlfwExtensions();
116-
inst.addDebugExtension();
117-
inst.addLunarGLayer();
118-
inst.setApplicationName(VulkanHelperTest.class.getSimpleName());
119-
inst.setApplicationVersion(1, 0, 0);
120-
instance = inst.build();
121-
122-
// debug callbacks
123-
logger = new VulkanLogger(instance, Level.SEVERE);
124-
125-
// surface
126-
surface = new Surface(instance, window);
127-
128-
// physical device
129-
PhysicalDevice<SimpleQueueFamilies> physDevice = PhysicalDevice.getSuitableDevice(
130-
instance, Arrays.asList(
131-
surface,
132-
DeviceEvaluator.extensions(deviceExtensions),
133-
DeviceEvaluator.swapchain(surface),
134-
DeviceEvaluator.anisotropy()
135-
),
136-
() -> new SimpleQueueFamilies(surface));
137-
138-
// queue families
139-
queues = physDevice.getQueueFamilies();
140-
141-
// logical device
142-
PointerBuffer deviceExts = VulkanUtils.toPointers(inst.getStack(), deviceExtensions, inst.getStack()::UTF8);
143-
device = new LogicalDevice(physDevice, deviceExts, inst.getLayers());
144-
145-
// create queues
146-
physDevice.getQueueFamilies().createQueues(device);
147-
148-
// swapchain
149-
try (SimpleSwapchainSupport support = new SimpleSwapchainSupport(physDevice, surface, window)) {
150-
swapchain = new Swapchain(device, surface, support);
151-
}
108+
instance = new VulkanInstance(VK_API_VERSION_1_3);
109+
try (VulkanInstance.Builder i = instance.build()) {
110+
i.addGlfwExtensions();
111+
i.addDebugExtension();
112+
i.addLunarGLayer();
113+
i.setApplicationName(VulkanHelperTest.class.getSimpleName());
114+
i.setApplicationVersion(1, 0, 0);
115+
}
116+
117+
// debug callbacks
118+
logger = new VulkanLogger(instance, Level.SEVERE);
119+
120+
// surface
121+
surface = new Surface(instance, window);
122+
123+
// logical device
124+
device = new LogicalDevice<>(instance);
125+
try (LogicalDevice.Builder d = device.build(id -> new SimplePhysicalDevice(instance, surface, id))) {
126+
d.addFilter(surface);
127+
d.addFilter(DeviceFilter.swapchain(surface));
128+
d.addCriticalExtension(KHRSwapchain.VK_KHR_SWAPCHAIN_EXTENSION_NAME);
129+
d.addFeature(DeviceFeature.anisotropy(1f, true));
130+
}
131+
132+
// swapchain
133+
swapchain = new Swapchain(device, surface);
134+
try (Swapchain.Builder s = swapchain.build()) {
135+
s.addQueue(device.getPhysicalDevice().getGraphics());
136+
s.addQueue(device.getPhysicalDevice().getPresent());
137+
s.selectFormat(Image.Format.B8G8R8A8_SRGB.getVkEnum(), KHRSurface.VK_COLOR_SPACE_SRGB_NONLINEAR_KHR);
138+
s.selectMode(Swapchain.PresentMode.Mailbox);
139+
s.selectExtentByWindow();
140+
s.selectImageCount(2);
152141
}
153142

154143
descriptorLayout = new DescriptorSetLayout(device,
@@ -415,7 +404,7 @@ public boolean populate(PhysicalDevice device, VkQueueFamilyProperties.Buffer pr
415404
graphicsIndex = i;
416405
} else if (presentIndex == null) {
417406
KHRSurface.vkGetPhysicalDeviceSurfaceSupportKHR(
418-
device.getDevice(), i, surface.getNativeObject(), ibuf);
407+
device.getPhysicalDevice(), i, surface.getNativeObject(), ibuf);
419408
if (ibuf.get(0) == VK13.VK_TRUE) {
420409
presentIndex = i;
421410
}
@@ -484,13 +473,13 @@ private static class SimpleSwapchainSupport implements SwapchainSupport, AutoClo
484473
public SimpleSwapchainSupport(PhysicalDevice device, Surface surface, long window) {
485474
stack = MemoryStack.stackPush();
486475
caps = VkSurfaceCapabilitiesKHR.malloc(stack);
487-
KHRSurface.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device.getDevice(), surface.getNativeObject(), caps);
476+
KHRSurface.vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device.getPhysicalDevice(), surface.getNativeObject(), caps);
488477
formats = enumerateBuffer(stack, n -> VkSurfaceFormatKHR.malloc(n, stack),
489478
(count, buffer) -> KHRSurface.vkGetPhysicalDeviceSurfaceFormatsKHR(
490-
device.getDevice(), surface.getNativeObject(), count, buffer));
479+
device.getPhysicalDevice(), surface.getNativeObject(), count, buffer));
491480
modes = enumerateBuffer(stack, stack::mallocInt,
492481
(count, buffer) -> KHRSurface.vkGetPhysicalDeviceSurfacePresentModesKHR(
493-
device.getDevice(), surface.getNativeObject(), count, buffer));
482+
device.getPhysicalDevice(), surface.getNativeObject(), count, buffer));
494483
this.window = window;
495484
}
496485

jme3-examples/src/main/java/jme3test/vulkan/VulkanTest.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,22 @@
11
package jme3test.vulkan;
22

33
import com.jme3.app.SimpleApplication;
4-
import com.jme3.asset.AssetInfo;
5-
import com.jme3.asset.AssetKey;
6-
import com.jme3.asset.AssetLoader;
74
import com.jme3.shaderc.ShaderType;
85
import com.jme3.shaderc.ShadercLoader;
96
import com.jme3.system.AppSettings;
107
import com.jme3.util.natives.Native;
11-
import com.jme3.vulkan.DeviceEvaluator;
8+
import com.jme3.vulkan.devices.DeviceFilter;
129
import com.jme3.system.vulkan.LwjglVulkanContext;
1310
import com.jme3.vulkan.Fence;
1411
import com.jme3.vulkan.Semaphore;
1512
import com.jme3.vulkan.VulkanRenderManager;
16-
import jme3tools.shader.ShaderDebug;
1713
import org.lwjgl.BufferUtils;
1814
import org.lwjgl.PointerBuffer;
1915
import org.lwjgl.glfw.GLFW;
2016
import org.lwjgl.glfw.GLFWVulkan;
2117
import org.lwjgl.system.MemoryStack;
22-
import org.lwjgl.util.shaderc.Shaderc;
2318
import org.lwjgl.vulkan.*;
2419

25-
import java.io.*;
2620
import java.nio.ByteBuffer;
2721
import java.nio.IntBuffer;
2822
import java.nio.LongBuffer;
@@ -49,7 +43,7 @@ public class VulkanTest extends SimpleApplication {
4943
private final Collection<PointerBuffer> instanceExtensions = new ArrayList<>();
5044
private final Collection<String> deviceExtensions = new ArrayList<>();
5145
private final List<String> layers = new ArrayList<>();
52-
private final Collection<DeviceEvaluator> deviceEvaluators = new ArrayList<>();
46+
private final Collection<DeviceFilter> deviceFilters = new ArrayList<>();
5347
private final VkDebugUtilsMessengerCallbackEXT debugCallback = new VulkanDebugCallback(Level.SEVERE);
5448
private LwjglVulkanContext vulkanContext;
5549
private Swapchain swapchain;
@@ -259,11 +253,11 @@ private Float evaluateDevice(PhysicalDevice device, long surface) {
259253
if (!new SwapchainSupport(stack, device.getDevice(), surface).isSupported()) {
260254
return null;
261255
}
262-
if (deviceEvaluators.isEmpty()) {
256+
if (deviceFilters.isEmpty()) {
263257
return 0f;
264258
}
265259
float score = 0f;
266-
for (DeviceEvaluator e : deviceEvaluators) {
260+
for (DeviceFilter e : deviceFilters) {
267261
//Float s = e.evaluateDevice(device.getDevice());
268262
Float s = 0f;
269263
if (s == null) {

jme3-lwjgl3/src/main/java/com/jme3/vulkan/CommandPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import com.jme3.util.natives.Native;
44
import com.jme3.util.natives.NativeReference;
5+
import com.jme3.vulkan.devices.LogicalDevice;
56
import org.lwjgl.system.MemoryStack;
6-
import org.lwjgl.system.MemoryUtil;
77
import org.lwjgl.vulkan.VkCommandPoolCreateInfo;
88

99
import java.nio.LongBuffer;

jme3-lwjgl3/src/main/java/com/jme3/vulkan/Fence.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import com.jme3.util.natives.Native;
44
import com.jme3.util.natives.NativeReference;
5+
import com.jme3.vulkan.devices.LogicalDevice;
56
import org.lwjgl.system.MemoryStack;
6-
import org.lwjgl.vulkan.VkDevice;
77
import org.lwjgl.vulkan.VkFenceCreateInfo;
88

99
import java.util.concurrent.TimeUnit;

jme3-lwjgl3/src/main/java/com/jme3/vulkan/FrameBuffer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.jme3.util.natives.Native;
44
import com.jme3.util.natives.NativeReference;
5+
import com.jme3.vulkan.devices.LogicalDevice;
56
import com.jme3.vulkan.images.ImageView;
67
import org.lwjgl.system.MemoryStack;
78
import org.lwjgl.vulkan.VkFramebufferCreateInfo;

jme3-lwjgl3/src/main/java/com/jme3/vulkan/GraphicsPipeline.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import com.jme3.material.RenderState;
44
import com.jme3.util.natives.Native;
55
import com.jme3.util.natives.NativeReference;
6+
import com.jme3.vulkan.devices.LogicalDevice;
67
import org.lwjgl.system.MemoryStack;
7-
import org.lwjgl.system.MemoryUtil;
88
import org.lwjgl.vulkan.*;
99

1010
import java.nio.LongBuffer;

0 commit comments

Comments
 (0)