Skip to content

Commit 2f90434

Browse files
committed
Rewrite feat&prop query; use maint3 for memory alloc size
1 parent 65a870d commit 2f90434

4 files changed

Lines changed: 82 additions & 31 deletions

File tree

src/main/java/git/artdeell/artvk/Vk11Backend.java

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@
2525
import org.lwjgl.glfw.GLFW;
2626
import org.lwjgl.glfw.GLFWVulkan;
2727
import org.lwjgl.system.MemoryStack;
28-
import org.lwjgl.util.vma.Vma;
29-
import org.lwjgl.util.vma.VmaAllocatorCreateInfo;
30-
import org.lwjgl.util.vma.VmaVulkanFunctions;
3128
import org.lwjgl.vulkan.*;
3229
import org.lwjgl.vulkan.VkDeviceQueueCreateInfo.Buffer;
3330

@@ -85,6 +82,7 @@ public static void enableDeviceExtensions(Set<String> deviceExtensions, Vk11Phys
8582
Vk11PhysicalDevice physicalDevice = null;
8683
VkDevice device = null;
8784
IntVMA vma = null;
85+
Vk11ExtensionProperties extensionProperties = null;
8886

8987
try {
9088
boolean renderdocAttached = "1".equals(System.getenv("ENABLE_VULKAN_RENDERDOC_CAPTURE"));
@@ -93,15 +91,17 @@ public static void enableDeviceExtensions(Set<String> deviceExtensions, Vk11Phys
9391
instance = new Vk11Instance(debugOptions.logLevel(), useDebugLabels, validation);
9492
physicalDevice = findPhysicalDevice(instance);
9593
enableDeviceExtensions(deviceExtensions, physicalDevice,
96-
"VK_KHR_portability_subset",
94+
"VK_KHR_portability_subset", // MoltenVK
9795
"VK_EXT_multi_draw",
9896
"VK_EXT_vertex_attribute_divisor",
99-
"VK_KHR_shader_draw_parameters"
97+
"VK_KHR_shader_draw_parameters",
98+
"VK_KHR_maintenance3"
10099
);
101100
if(useDebugLabels) {
102101
enableDeviceExtensions(deviceExtensions, physicalDevice, "VK_AMD_buffer_marker", "VK_NV_device_diagnostic_checkpoints");
103102
}
104-
device = createVkDevice(deviceExtensions, physicalDevice);
103+
extensionProperties = new Vk11ExtensionProperties();
104+
device = createVkDevice(deviceExtensions, physicalDevice, extensionProperties);
105105
vma = new IntVMA(device);
106106
} catch (BackendCreationException e) {
107107
if(vma != null) vma.close();
@@ -112,7 +112,7 @@ public static void enableDeviceExtensions(Set<String> deviceExtensions, Vk11Phys
112112
}
113113

114114
return new GpuDevice(
115-
new Vk11Device(defaultShaderSource, instance, physicalDevice, deviceExtensions, device, vma), criticalShaderLoader
115+
new Vk11Device(defaultShaderSource, instance, physicalDevice, deviceExtensions, device, extensionProperties, vma), criticalShaderLoader
116116
);
117117
}
118118

@@ -262,33 +262,48 @@ private static void throwForMissingRequirements(final VkPhysicalDevice vkPhysica
262262
throw new BackendCreationException("Device missing capabilities", mostProminentReason, missingCapabilities);
263263
}
264264

265-
private static void enableExtensionFeatures(Vk11PhysicalDevice device, MemoryStack stack, VkPhysicalDeviceFeatures2 features, Collection<String> deviceExtensions){
266-
if(deviceExtensions.contains("VK_EXT_vertex_attribute_divisor")){
267-
VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vaf = VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT.calloc(stack).sType$Default();
268-
features.pNext(vaf);
269-
}
265+
private static void queryExtensionFeatures(Vk11PhysicalDevice device,
266+
MemoryStack stack,
267+
VkPhysicalDeviceFeatures2 features,
268+
Vk11ExtensionProperties vk11ExtensionProperties,
269+
Collection<String> deviceExtensions)
270+
{
271+
VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vaf = VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT.calloc(stack).sType$Default();
272+
VkPhysicalDeviceShaderDrawParametersFeatures sdp = VkPhysicalDeviceShaderDrawParametersFeatures.calloc(stack).sType$Default();
273+
if(deviceExtensions.contains("VK_EXT_vertex_attribute_divisor")) features.pNext(vaf);
270274
// This was promoted to core only in 1.1, but we are planning on targeting 1.0
271275
// Though not all 1.0 devices have this extension, so we need to think about it a bit more...
272-
if(deviceExtensions.contains("VK_KHR_shader_draw_parameters") || device.vkPhysicalDeviceProperties().apiVersion() == VK11.VK_API_VERSION_1_1){
273-
VkPhysicalDeviceShaderDrawParametersFeatures sdp = VkPhysicalDeviceShaderDrawParametersFeatures.calloc(stack).sType$Default();
274-
features.pNext(sdp);
275-
}
276-
KHRGetPhysicalDeviceProperties2.vkGetPhysicalDeviceFeatures2KHR(device.vkPhysicalDevice(), features);
276+
if(deviceExtensions.contains("VK_KHR_shader_draw_parameters") || device.vkPhysicalDeviceProperties().apiVersion() == VK11.VK_API_VERSION_1_1) features.pNext(sdp);
277+
VK11.vkGetPhysicalDeviceFeatures2(device.vkPhysicalDevice(), features);
278+
vk11ExtensionProperties.setVertexAttributeDivisor(vaf.vertexAttributeInstanceRateDivisor());
279+
vk11ExtensionProperties.setShaderDrawParameters(sdp.shaderDrawParameters());
280+
281+
}
282+
private static void queryExtensionProperties(Vk11PhysicalDevice device,
283+
MemoryStack stack,
284+
VkPhysicalDeviceProperties2 properties,
285+
Vk11ExtensionProperties vk11ExtensionProperties,
286+
Collection<String> deviceExtensions) {
287+
VkPhysicalDeviceMaintenance3Properties maint3 = VkPhysicalDeviceMaintenance3Properties.calloc(stack).sType$Default();
288+
if (deviceExtensions.contains("VK_KHR_maintenance3") || device.vkPhysicalDeviceProperties().apiVersion() >= VK11.VK_API_VERSION_1_1) properties.pNext(maint3);
289+
VK11.vkGetPhysicalDeviceProperties2(device.vkPhysicalDevice(), properties);
290+
ArtVK.LOGGER.info("Max memory allocation size: {}", maint3.maxMemoryAllocationSize());
291+
vk11ExtensionProperties.setMaxMemoryAllocationSize(maint3.maxMemoryAllocationSize() > 0L ? maint3.maxMemoryAllocationSize() : Long.MAX_VALUE);
277292
}
278293

279294
private static VkDevice createVkDevice(
280-
final Collection<String> deviceExtensions, final Vk11PhysicalDevice physicalDevice
295+
final Collection<String> deviceExtensions, final Vk11PhysicalDevice physicalDevice, final Vk11ExtensionProperties extensionProperties
281296
) throws BackendCreationException {
282297
try (MemoryStack stack = MemoryStack.stackPush()) {
283298
VkPhysicalDeviceFeatures2 availableFeatures = physicalDevice.vkPhysicalDeviceFeatures();
284-
285299
VkPhysicalDeviceFeatures2 deviceFeatures = VkPhysicalDeviceFeatures2.calloc(stack).sType$Default();
286300
// Enable required VK10 features
287301
deviceFeatures.features().multiDrawIndirect(availableFeatures.features().multiDrawIndirect());
288302
deviceFeatures.features().fillModeNonSolid(availableFeatures.features().fillModeNonSolid());
289303
deviceFeatures.features().samplerAnisotropy(availableFeatures.features().samplerAnisotropy());
290304

291-
enableExtensionFeatures(physicalDevice, stack, deviceFeatures, deviceExtensions);
305+
queryExtensionProperties(physicalDevice, stack, physicalDevice.vkPhysicalDeviceProperties2(), extensionProperties, deviceExtensions);
306+
queryExtensionFeatures(physicalDevice, stack, deviceFeatures, extensionProperties, deviceExtensions);
292307

293308
Int2IntMap queuesToCreate = physicalDevice.queueFamilyCreateInfoMap();
294309
Buffer queueCreationInfo = VkDeviceQueueCreateInfo.calloc(queuesToCreate.size(), stack);

src/main/java/git/artdeell/artvk/Vk11Device.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public Vk11Device(
6666
final Vk11PhysicalDevice physicalDevice,
6767
final Set<String> enabledDeviceExtensions,
6868
final VkDevice vkDevice,
69+
final Vk11ExtensionProperties vk11ExtensionProperties,
6970
final IntVMA vma
7071
) {
7172
this.defaultShaderSource = defaultShaderSource;
@@ -84,12 +85,11 @@ public Vk11Device(
8485
}
8586

8687
VkPhysicalDeviceLimits limits = physicalDevice.vkPhysicalDeviceProperties().limits();
87-
VkPhysicalDeviceVulkan11Properties vk11Properties = physicalDevice.vkPhysicalDeviceVulkan11Properties();
8888
VkPhysicalDeviceFeatures features = physicalDevice.vkPhysicalDeviceFeatures().features();
8989

9090
hasFillModeNonSolid = features.fillModeNonSolid();
9191
hasAnisotropy = features.samplerAnisotropy();
92-
hasAttributeDivisor = enabledDeviceExtensions.contains("VK_EXT_vertex_attribute_divisor");
92+
hasAttributeDivisor = vk11ExtensionProperties.vertexAttributeDivisor();
9393

9494
if(!hasFillModeNonSolid) ArtVK.LOGGER.warn("Device does not support fillModeNonSolid, wireframe rendering won't work");
9595

@@ -104,11 +104,11 @@ public Vk11Device(
104104
hasAnisotropy ? (int)limits.maxSamplerAnisotropy() : 1,
105105
(int)limits.minUniformBufferOffsetAlignment(),
106106
limits.maxImageDimension2D(),
107-
vk11Properties.maxMemoryAllocationSize() <= 0L ? Long.MAX_VALUE : vk11Properties.maxMemoryAllocationSize(),
107+
vk11ExtensionProperties.maxMemoryAllocationSize() <= 0L ? Long.MAX_VALUE : vk11ExtensionProperties.maxMemoryAllocationSize(),
108108
Integer.MAX_VALUE,
109109
limits.maxColorAttachments()
110110
),
111-
new DeviceFeatures(true, enabledDeviceExtensions.contains("VK_EXT_multi_draw"), false, features.multiDrawIndirect(), true, true, true),
111+
new DeviceFeatures(true, vk11ExtensionProperties.multiDraw(), false, features.multiDrawIndirect(), true, true, true),
112112
Collections.unmodifiableSet(extensionNames),
113113
new HintsAndWorkarounds(false, false),
114114
physicalDevice.deviceType()
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package git.artdeell.artvk;
2+
3+
// This provides access to features/properties from extensions
4+
public class Vk11ExtensionProperties {
5+
private long maxMemoryAllocationSize;
6+
private boolean shaderDrawParameters;
7+
private boolean multiDraw;
8+
private boolean vertexAttributeDivisor;
9+
10+
public boolean vertexAttributeDivisor() {
11+
return vertexAttributeDivisor;
12+
}
13+
14+
public void setVertexAttributeDivisor(boolean vertexAttributeDivisor) {
15+
this.vertexAttributeDivisor = vertexAttributeDivisor;
16+
}
17+
18+
public boolean multiDraw() {
19+
return multiDraw;
20+
}
21+
22+
public void setMultiDraw(boolean multiDraw) {
23+
this.multiDraw = multiDraw;
24+
}
25+
26+
public boolean shaderDrawParameters() {
27+
return shaderDrawParameters;
28+
}
29+
30+
public void setShaderDrawParameters(boolean shaderDrawParameters) {
31+
this.shaderDrawParameters = shaderDrawParameters;
32+
}
33+
34+
public long maxMemoryAllocationSize() {
35+
return maxMemoryAllocationSize;
36+
}
37+
38+
public void setMaxMemoryAllocationSize(long maxMemoryAllocationSize) {
39+
this.maxMemoryAllocationSize = maxMemoryAllocationSize;
40+
}
41+
}

src/main/java/git/artdeell/artvk/Vk11PhysicalDevice.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public class Vk11PhysicalDevice implements AutoCloseable {
2929

3030
private final VkPhysicalDeviceFeatures2 vkPhysicalDeviceFeatures;
3131
private final VkPhysicalDeviceProperties2 vkPhysicalDeviceProperties;
32-
private final VkPhysicalDeviceVulkan11Properties vkPhysicalDeviceVulkan11Properties;
3332
private final VkPhysicalDeviceDriverProperties vkPhysicalDeviceDriverProperties;
3433

3534

@@ -56,9 +55,7 @@ public Vk11PhysicalDevice(final VkPhysicalDevice vkPhysicalDevice) throws Backen
5655

5756

5857
this.vkPhysicalDeviceProperties = VkPhysicalDeviceProperties2.calloc().sType$Default();
59-
this.vkPhysicalDeviceVulkan11Properties = VkPhysicalDeviceVulkan11Properties.calloc().sType$Default();
6058
this.vkPhysicalDeviceDriverProperties = VkPhysicalDeviceDriverProperties.calloc().sType$Default();
61-
this.vkPhysicalDeviceProperties.pNext(this.vkPhysicalDeviceVulkan11Properties);
6259
this.vkPhysicalDeviceProperties.pNext(this.vkPhysicalDeviceDriverProperties);
6360

6461

@@ -120,7 +117,6 @@ public Vk11PhysicalDevice(final VkPhysicalDevice vkPhysicalDevice) throws Backen
120117
public void close() {
121118
this.vkPhysicalDeviceFeatures.free();
122119
this.vkDeviceExtensions.free();
123-
this.vkPhysicalDeviceVulkan11Properties.free();
124120
this.vkPhysicalDeviceDriverProperties.free();
125121
this.vkPhysicalDeviceProperties.free();
126122
}
@@ -156,9 +152,8 @@ public VkPhysicalDevice vkPhysicalDevice() {
156152
public VkPhysicalDeviceProperties vkPhysicalDeviceProperties() {
157153
return this.vkPhysicalDeviceProperties.properties();
158154
}
159-
160-
public VkPhysicalDeviceVulkan11Properties vkPhysicalDeviceVulkan11Properties() {
161-
return this.vkPhysicalDeviceVulkan11Properties;
155+
public VkPhysicalDeviceProperties2 vkPhysicalDeviceProperties2(){
156+
return this.vkPhysicalDeviceProperties;
162157
}
163158

164159
public VkPhysicalDeviceDriverProperties vkPhysicalDeviceDriverProperties() {

0 commit comments

Comments
 (0)