possibly working vulkan demo
parent
b747ba2c48
commit
034fd9b0c7
13
.classpath
13
.classpath
|
@ -15,5 +15,18 @@
|
|||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" output="target/classes" path="src/main/java">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||
<attributes>
|
||||
<attribute name="optional" value="true"/>
|
||||
<attribute name="maven.pomderived" value="true"/>
|
||||
<attribute name="test" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path="target/classes"/>
|
||||
</classpath>
|
||||
|
|
15
pom.xml
15
pom.xml
|
@ -91,13 +91,28 @@
|
|||
</build>
|
||||
|
||||
<repositories>
|
||||
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>sonatype-snapshots</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||
<releases><enabled>false</enabled></releases>
|
||||
<snapshots><enabled>true</enabled></snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-vma</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lwjgl</groupId>
|
||||
<artifactId>lwjgl-shaderc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.joml</groupId>
|
||||
<artifactId>joml</artifactId>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,432 @@
|
|||
package com.github.hydos.ginger.engine.vulkan.utils;
|
||||
|
||||
import java.nio.Buffer;
|
||||
|
||||
import org.lwjgl.system.MemoryStack;
|
||||
import org.lwjgl.util.vma.VmaAllocationCreateInfo;
|
||||
import org.lwjgl.util.vma.VmaAllocationInfo;
|
||||
import org.lwjgl.util.vma.VmaAllocatorCreateInfo;
|
||||
import org.lwjgl.util.vma.VmaVulkanFunctions;
|
||||
import org.lwjgl.vulkan.*;
|
||||
import static org.lwjgl.vulkan.EXTDebugReport.*;
|
||||
import static org.lwjgl.vulkan.KHR8bitStorage.*;
|
||||
import static org.lwjgl.vulkan.KHRGetMemoryRequirements2.*;
|
||||
import static org.lwjgl.vulkan.KHRGetPhysicalDeviceProperties2.*;
|
||||
import static org.lwjgl.vulkan.KHRShaderFloat16Int8.*;
|
||||
import static org.lwjgl.vulkan.KHRSwapchain.*;
|
||||
import static org.lwjgl.vulkan.NVRayTracing.*;
|
||||
import static org.lwjgl.vulkan.VK10.*;
|
||||
|
||||
public class VKFactory {
|
||||
static VmaVulkanFunctions VmaVulkanFunctions(MemoryStack stack) {
|
||||
return VmaVulkanFunctions.callocStack(stack);
|
||||
}
|
||||
|
||||
static VmaAllocatorCreateInfo VmaAllocatorCreateInfo(MemoryStack stack) {
|
||||
return VmaAllocatorCreateInfo.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkInstanceCreateInfo VkInstanceCreateInfo(MemoryStack stack) {
|
||||
return VkInstanceCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkApplicationInfo VkApplicationInfo(MemoryStack stack) {
|
||||
return VkApplicationInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_APPLICATION_INFO);
|
||||
}
|
||||
|
||||
static VkDebugReportCallbackCreateInfoEXT VkDebugReportCallbackCreateInfoEXT(MemoryStack stack) {
|
||||
return VkDebugReportCallbackCreateInfoEXT.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT);
|
||||
}
|
||||
|
||||
static VkDeviceCreateInfo VkDeviceCreateInfo(MemoryStack stack) {
|
||||
return VkDeviceCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkDeviceQueueCreateInfo.Buffer VkDeviceQueueCreateInfo(MemoryStack stack) {
|
||||
return VkDeviceQueueCreateInfo.callocStack(1, stack).sType(VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPhysicalDevice8BitStorageFeaturesKHR VkPhysicalDevice8BitStorageFeaturesKHR(MemoryStack stack) {
|
||||
return VkPhysicalDevice8BitStorageFeaturesKHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR);
|
||||
}
|
||||
|
||||
static VkPhysicalDeviceFloat16Int8FeaturesKHR VkPhysicalDeviceFloat16Int8FeaturesKHR(MemoryStack stack) {
|
||||
return VkPhysicalDeviceFloat16Int8FeaturesKHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR);
|
||||
}
|
||||
|
||||
static VkPhysicalDeviceProperties2 VkPhysicalDeviceProperties2(MemoryStack stack) {
|
||||
return VkPhysicalDeviceProperties2.callocStack(stack).sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR);
|
||||
}
|
||||
|
||||
static VkPhysicalDeviceRayTracingPropertiesNV VkPhysicalDeviceRayTracingPropertiesNV(MemoryStack stack) {
|
||||
return VkPhysicalDeviceRayTracingPropertiesNV.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV);
|
||||
}
|
||||
|
||||
static VkSwapchainCreateInfoKHR VkSwapchainCreateInfoKHR(MemoryStack stack) {
|
||||
return VkSwapchainCreateInfoKHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR);
|
||||
}
|
||||
|
||||
static VkImageViewCreateInfo VkImageViewCreateInfo(MemoryStack stack) {
|
||||
return VkImageViewCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkCommandPoolCreateInfo VkCommandPoolCreateInfo(MemoryStack stack) {
|
||||
return VkCommandPoolCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkMemoryRequirements VkMemoryRequirements(MemoryStack stack) {
|
||||
return VkMemoryRequirements.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkImageCreateInfo VkImageCreateInfo(MemoryStack stack) {
|
||||
return VkImageCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkImageMemoryBarrier.Buffer VkImageMemoryBarrier(MemoryStack stack) {
|
||||
return VkImageMemoryBarrier.callocStack(1, stack).sType(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER);
|
||||
}
|
||||
|
||||
static VkFenceCreateInfo VkFenceCreateInfo(MemoryStack stack) {
|
||||
return VkFenceCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_FENCE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkSubmitInfo VkSubmitInfo(MemoryStack stack) {
|
||||
return VkSubmitInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_SUBMIT_INFO);
|
||||
}
|
||||
|
||||
static VkCommandBufferBeginInfo VkCommandBufferBeginInfo(MemoryStack stack) {
|
||||
return VkCommandBufferBeginInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO);
|
||||
}
|
||||
|
||||
static VkCommandBufferAllocateInfo VkCommandBufferAllocateInfo(MemoryStack stack) {
|
||||
return VkCommandBufferAllocateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO);
|
||||
}
|
||||
|
||||
static VkMemoryAllocateInfo VkMemoryAllocateInfo(MemoryStack stack) {
|
||||
return VkMemoryAllocateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO);
|
||||
}
|
||||
|
||||
static VkBufferCreateInfo VkBufferCreateInfo(MemoryStack stack) {
|
||||
return VkBufferCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkGeometryAABBNV VkGeometryAABBNV(VkGeometryAABBNV geometry) {
|
||||
return geometry.sType(VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV);
|
||||
}
|
||||
|
||||
static VkGeometryTrianglesNV VkGeometryTrianglesNV(VkGeometryTrianglesNV geometry) {
|
||||
return geometry.sType(VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV);
|
||||
}
|
||||
|
||||
static VkGeometryNV VkGeometryNV(MemoryStack stack) {
|
||||
return VkGeometryNV.callocStack(stack).sType(VK_STRUCTURE_TYPE_GEOMETRY_NV);
|
||||
}
|
||||
|
||||
static VkMemoryBarrier.Buffer VkMemoryBarrier(MemoryStack stack) {
|
||||
return VkMemoryBarrier.callocStack(1, stack).sType(VK_STRUCTURE_TYPE_MEMORY_BARRIER);
|
||||
}
|
||||
|
||||
static VkBindAccelerationStructureMemoryInfoNV.Buffer VkBindAccelerationStructureMemoryInfoNV(MemoryStack stack) {
|
||||
return VkBindAccelerationStructureMemoryInfoNV.callocStack(1, stack)
|
||||
.sType(VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV);
|
||||
}
|
||||
|
||||
static VkAccelerationStructureInfoNV VkAccelerationStructureInfoNV(MemoryStack stack) {
|
||||
return VkAccelerationStructureInfoNV.callocStack(stack).sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV);
|
||||
}
|
||||
|
||||
static VkMemoryRequirements2KHR VkMemoryRequirements2KHR(MemoryStack stack) {
|
||||
return VkMemoryRequirements2KHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR);
|
||||
}
|
||||
|
||||
static VkAccelerationStructureMemoryRequirementsInfoNV VkAccelerationStructureMemoryRequirementsInfoNV(
|
||||
MemoryStack stack) {
|
||||
return VkAccelerationStructureMemoryRequirementsInfoNV.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV);
|
||||
}
|
||||
|
||||
static VkAccelerationStructureCreateInfoNV VkAccelerationStructureCreateInfoNV(MemoryStack stack) {
|
||||
return VkAccelerationStructureCreateInfoNV.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV);
|
||||
}
|
||||
|
||||
static VkPipelineShaderStageCreateInfo.Buffer VkPipelineShaderStageCreateInfo(MemoryStack stack, int count) {
|
||||
VkPipelineShaderStageCreateInfo.Buffer ret = VkPipelineShaderStageCreateInfo.callocStack(count, stack);
|
||||
ret.forEach(sci -> sci.sType(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO));
|
||||
return ret;
|
||||
}
|
||||
|
||||
static VkDescriptorSetLayoutBinding.Buffer VkDescriptorSetLayoutBinding(MemoryStack stack, int count) {
|
||||
return VkDescriptorSetLayoutBinding.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkDescriptorSetLayoutBinding VkDescriptorSetLayoutBinding(MemoryStack stack) {
|
||||
return VkDescriptorSetLayoutBinding.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkRayTracingPipelineCreateInfoNV.Buffer VkRayTracingPipelineCreateInfoNV(MemoryStack stack) {
|
||||
return VkRayTracingPipelineCreateInfoNV.callocStack(1, stack)
|
||||
.sType(VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV);
|
||||
}
|
||||
|
||||
static VkRayTracingShaderGroupCreateInfoNV.Buffer VkRayTracingShaderGroupCreateInfoNV(int size, MemoryStack stack) {
|
||||
VkRayTracingShaderGroupCreateInfoNV.Buffer buf = VkRayTracingShaderGroupCreateInfoNV.callocStack(size, stack);
|
||||
buf.forEach(info -> info.sType(VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV)
|
||||
.anyHitShader(VK_SHADER_UNUSED_NV)
|
||||
.closestHitShader(VK_SHADER_UNUSED_NV)
|
||||
.generalShader(VK_SHADER_UNUSED_NV)
|
||||
.intersectionShader(VK_SHADER_UNUSED_NV));
|
||||
return buf;
|
||||
}
|
||||
|
||||
static VkPipelineLayoutCreateInfo VkPipelineLayoutCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineLayoutCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkDescriptorSetLayoutCreateInfo VkDescriptorSetLayoutCreateInfo(MemoryStack stack) {
|
||||
return VkDescriptorSetLayoutCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkDescriptorBufferInfo.Buffer VkDescriptorBufferInfo(MemoryStack stack, int count) {
|
||||
return VkDescriptorBufferInfo.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkDescriptorImageInfo.Buffer VkDescriptorImageInfo(MemoryStack stack, int count) {
|
||||
return VkDescriptorImageInfo.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkDescriptorPoolSize.Buffer VkDescriptorPoolSize(MemoryStack stack, int count) {
|
||||
return VkDescriptorPoolSize.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkWriteDescriptorSetAccelerationStructureNV VkWriteDescriptorSetAccelerationStructureNV(MemoryStack stack) {
|
||||
return VkWriteDescriptorSetAccelerationStructureNV.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV);
|
||||
}
|
||||
|
||||
static VkWriteDescriptorSet VkWriteDescriptorSet(MemoryStack stack) {
|
||||
return VkWriteDescriptorSet.callocStack(stack).sType(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET);
|
||||
}
|
||||
|
||||
static VkDescriptorSetAllocateInfo VkDescriptorSetAllocateInfo(MemoryStack stack) {
|
||||
return VkDescriptorSetAllocateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO);
|
||||
}
|
||||
|
||||
static VkDescriptorPoolCreateInfo VkDescriptorPoolCreateInfo(MemoryStack stack) {
|
||||
return VkDescriptorPoolCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPresentInfoKHR VkPresentInfoKHR(MemoryStack stack) {
|
||||
return VkPresentInfoKHR.callocStack(stack).sType(VK_STRUCTURE_TYPE_PRESENT_INFO_KHR);
|
||||
}
|
||||
|
||||
static VkSemaphoreCreateInfo VkSemaphoreCreateInfo(MemoryStack stack) {
|
||||
return VkSemaphoreCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkQueueFamilyProperties.Buffer VkQueueFamilyProperties(int count) {
|
||||
return VkQueueFamilyProperties.callocStack(count);
|
||||
}
|
||||
|
||||
static VkPhysicalDeviceFeatures VkPhysicalDeviceFeatures(MemoryStack stack) {
|
||||
return VkPhysicalDeviceFeatures.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkPhysicalDeviceFeatures2 VkPhysicalDeviceFeatures2(MemoryStack stack) {
|
||||
return VkPhysicalDeviceFeatures2.callocStack(stack).sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR);
|
||||
}
|
||||
|
||||
static VkPhysicalDeviceProperties VkPhysicalDeviceProperties(MemoryStack stack) {
|
||||
return VkPhysicalDeviceProperties.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkGeometryNV.Buffer VkGeometryNV(MemoryStack stack, int count) {
|
||||
VkGeometryNV.Buffer buf = VkGeometryNV.callocStack(count, stack);
|
||||
buf.forEach(info -> info.sType(VK_STRUCTURE_TYPE_GEOMETRY_NV));
|
||||
return buf;
|
||||
}
|
||||
|
||||
static VkPipelineShaderStageCreateInfo VkPipelineShaderStageCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineShaderStageCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkShaderModuleCreateInfo VkShaderModuleCreateInfo(MemoryStack stack) {
|
||||
return VkShaderModuleCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkSurfaceCapabilitiesKHR VkSurfaceCapabilitiesKHR(MemoryStack stack) {
|
||||
return VkSurfaceCapabilitiesKHR.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkSurfaceFormatKHR.Buffer VkSurfaceFormatKHR(MemoryStack stack, int count) {
|
||||
return VkSurfaceFormatKHR.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VmaAllocationCreateInfo VmaAllocationCreateInfo(MemoryStack stack) {
|
||||
return VmaAllocationCreateInfo.callocStack(stack);
|
||||
}
|
||||
|
||||
static VmaAllocationInfo VmaAllocationInfo(MemoryStack stack) {
|
||||
return VmaAllocationInfo.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkBufferCopy.Buffer VkBufferCopy(MemoryStack stack, int count) {
|
||||
return VkBufferCopy.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkSamplerCreateInfo VkSamplerCreateInfo(MemoryStack stack) {
|
||||
return VkSamplerCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkBufferImageCopy.Buffer VkBufferImageCopy(MemoryStack stack) {
|
||||
return VkBufferImageCopy.callocStack(1, stack);
|
||||
}
|
||||
|
||||
static VkImageSubresourceRange VkImageSubresourceRange(MemoryStack stack) {
|
||||
return VkImageSubresourceRange.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkComponentMapping VkComponentMapping(MemoryStack stack) {
|
||||
return VkComponentMapping.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkAttachmentReference VkAttachmentReference(MemoryStack stack) {
|
||||
return VkAttachmentReference.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkAttachmentReference.Buffer VkAttachmentReference(MemoryStack stack, int count) {
|
||||
return VkAttachmentReference.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkSubpassDescription.Buffer VkSubpassDescription(MemoryStack stack, int count) {
|
||||
return VkSubpassDescription.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkAttachmentDescription.Buffer VkAttachmentDescription(MemoryStack stack, int count) {
|
||||
return VkAttachmentDescription.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkRenderPassCreateInfo VkRenderPassCreateInfo(MemoryStack stack) {
|
||||
return VkRenderPassCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkOffset3D VkOffset3D(MemoryStack stack) {
|
||||
return VkOffset3D.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkImageBlit.Buffer VkImageBlit(MemoryStack stack, int count) {
|
||||
return VkImageBlit.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkSpecializationMapEntry.Buffer VkSpecializationMapEntry(MemoryStack stack, int count) {
|
||||
return VkSpecializationMapEntry.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkSpecializationInfo VkSpecializationInfo(MemoryStack stack) {
|
||||
return VkSpecializationInfo.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkQueryPoolCreateInfo VkQueryPoolCreateInfo(MemoryStack stack) {
|
||||
return VkQueryPoolCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkGeometryNV.Buffer VkGeometryNV(int count) {
|
||||
return VkGeometryNV.calloc(count).sType(VK_STRUCTURE_TYPE_GEOMETRY_NV);
|
||||
}
|
||||
|
||||
static VkFramebufferCreateInfo VkFramebufferCreateInfo(MemoryStack stack) {
|
||||
return VkFramebufferCreateInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkVertexInputBindingDescription.Buffer VkVertexInputBindingDescription(MemoryStack stack, int count) {
|
||||
return VkVertexInputBindingDescription.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkVertexInputAttributeDescription.Buffer VkVertexInputAttributeDescription(MemoryStack stack, int count) {
|
||||
return VkVertexInputAttributeDescription.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkPipelineVertexInputStateCreateInfo VkPipelineVertexInputStateCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineVertexInputStateCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPipelineInputAssemblyStateCreateInfo VkPipelineInputAssemblyStateCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineInputAssemblyStateCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPipelineRasterizationStateCreateInfo VkPipelineRasterizationStateCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineRasterizationStateCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPipelineColorBlendAttachmentState.Buffer VkPipelineColorBlendAttachmentState(MemoryStack stack,
|
||||
int count) {
|
||||
return VkPipelineColorBlendAttachmentState.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkPipelineColorBlendStateCreateInfo VkPipelineColorBlendStateCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineColorBlendStateCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPipelineViewportStateCreateInfo VkPipelineViewportStateCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineViewportStateCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPipelineDynamicStateCreateInfo VkPipelineDynamicStateCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineDynamicStateCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPipelineDepthStencilStateCreateInfo VkPipelineDepthStencilStateCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineDepthStencilStateCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkPipelineMultisampleStateCreateInfo VkPipelineMultisampleStateCreateInfo(MemoryStack stack) {
|
||||
return VkPipelineMultisampleStateCreateInfo.callocStack(stack)
|
||||
.sType(VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO);
|
||||
}
|
||||
|
||||
static VkGraphicsPipelineCreateInfo.Buffer VkGraphicsPipelineCreateInfo(MemoryStack stack, int count) {
|
||||
VkGraphicsPipelineCreateInfo.Buffer ret = VkGraphicsPipelineCreateInfo.callocStack(count, stack);
|
||||
ret.forEach(pci -> pci.sType(VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO));
|
||||
return ret;
|
||||
}
|
||||
|
||||
static VkClearValue.Buffer VkClearValue(MemoryStack stack, int count) {
|
||||
return VkClearValue.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkRenderPassBeginInfo VkRenderPassBeginInfo(MemoryStack stack) {
|
||||
return VkRenderPassBeginInfo.callocStack(stack).sType(VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO);
|
||||
}
|
||||
|
||||
static VkViewport.Buffer VkViewport(MemoryStack stack, int count) {
|
||||
return VkViewport.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkRect2D.Buffer VkRect2D(MemoryStack stack, int count) {
|
||||
return VkRect2D.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkFormatProperties VkFormatProperties(MemoryStack stack) {
|
||||
return VkFormatProperties.callocStack(stack);
|
||||
}
|
||||
|
||||
static VkSubpassDependency.Buffer VkSubpassDependency(MemoryStack stack, int count) {
|
||||
return VkSubpassDependency.callocStack(count, stack);
|
||||
}
|
||||
|
||||
static VkImageCopy.Buffer VkImageCopy(MemoryStack stack, int count) {
|
||||
return VkImageCopy.callocStack(count, stack);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,467 @@
|
|||
package com.github.hydos.ginger.engine.vulkan.utils;
|
||||
|
||||
import org.lwjgl.assimp.*;
|
||||
import org.lwjgl.system.Callback;
|
||||
import org.lwjgl.system.MemoryStack;
|
||||
import org.lwjgl.util.shaderc.ShadercIncludeResolve;
|
||||
import org.lwjgl.util.shaderc.ShadercIncludeResult;
|
||||
import org.lwjgl.util.shaderc.ShadercIncludeResultRelease;
|
||||
import org.lwjgl.vulkan.*;
|
||||
|
||||
import com.github.hydos.ginger.engine.opengl.render.tools.IOUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.LongBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static org.lwjgl.BufferUtils.*;
|
||||
import static org.lwjgl.assimp.Assimp.*;
|
||||
import static org.lwjgl.system.MemoryUtil.*;
|
||||
import static org.lwjgl.util.shaderc.Shaderc.*;
|
||||
import static org.lwjgl.vulkan.EXTDebugReport.*;
|
||||
import static org.lwjgl.vulkan.KHRDisplaySwapchain.*;
|
||||
import static org.lwjgl.vulkan.KHRSurface.*;
|
||||
import static org.lwjgl.vulkan.KHRSwapchain.*;
|
||||
import static org.lwjgl.vulkan.NVRayTracing.*;
|
||||
import static org.lwjgl.vulkan.VK12.*;
|
||||
|
||||
/**
|
||||
* Utility functions for Vulkan.
|
||||
*
|
||||
* @author Kai Burjack
|
||||
*/
|
||||
public class VKUtils {
|
||||
|
||||
public static final int VK_FLAGS_NONE = 0;
|
||||
|
||||
private static int vulkanStageToShadercKind(int stage) {
|
||||
switch (stage) {
|
||||
case VK_SHADER_STAGE_VERTEX_BIT:
|
||||
return shaderc_vertex_shader;
|
||||
case VK_SHADER_STAGE_FRAGMENT_BIT:
|
||||
return shaderc_fragment_shader;
|
||||
case VK_SHADER_STAGE_RAYGEN_BIT_NV:
|
||||
return shaderc_raygen_shader;
|
||||
case VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV:
|
||||
return shaderc_closesthit_shader;
|
||||
case VK_SHADER_STAGE_MISS_BIT_NV:
|
||||
return shaderc_miss_shader;
|
||||
case VK_SHADER_STAGE_ANY_HIT_BIT_NV:
|
||||
return shaderc_anyhit_shader;
|
||||
default:
|
||||
throw new IllegalArgumentException("Stage: " + stage);
|
||||
}
|
||||
}
|
||||
|
||||
public static ByteBuffer glslToSpirv(String classPath, int vulkanStage) throws IOException {
|
||||
ByteBuffer src = IOUtil.ioResourceToByteBuffer(classPath, 1024);
|
||||
long compiler = shaderc_compiler_initialize();
|
||||
long options = shaderc_compile_options_initialize();
|
||||
ShadercIncludeResolve resolver;
|
||||
ShadercIncludeResultRelease releaser;
|
||||
shaderc_compile_options_set_optimization_level(options, shaderc_optimization_level_performance);
|
||||
shaderc_compile_options_set_include_callbacks(options, resolver = new ShadercIncludeResolve() {
|
||||
public long invoke(long user_data, long requested_source, int type, long requesting_source, long include_depth) {
|
||||
ShadercIncludeResult res = ShadercIncludeResult.calloc();
|
||||
try {
|
||||
String src = classPath.substring(0, classPath.lastIndexOf('/')) + "/" + memUTF8(requested_source);
|
||||
res.content(IOUtil.ioResourceToByteBuffer(src, 1024));
|
||||
res.source_name(memUTF8(src));
|
||||
return res.address();
|
||||
} catch (IOException e) {
|
||||
throw new AssertionError("Failed to resolve include: " + src);
|
||||
}
|
||||
}
|
||||
}, releaser = new ShadercIncludeResultRelease() {
|
||||
public void invoke(long user_data, long include_result) {
|
||||
ShadercIncludeResult result = ShadercIncludeResult.create(include_result);
|
||||
memFree(result.source_name());
|
||||
result.free();
|
||||
}
|
||||
}, 0L);
|
||||
long res;
|
||||
try (MemoryStack stack = MemoryStack.stackPush()) {
|
||||
res = shaderc_compile_into_spv(compiler, src, vulkanStageToShadercKind(vulkanStage),
|
||||
stack.UTF8(classPath), stack.UTF8("main"), options);
|
||||
if (res == 0L)
|
||||
throw new AssertionError("Internal error during compilation!");
|
||||
}
|
||||
if (shaderc_result_get_compilation_status(res) != shaderc_compilation_status_success) {
|
||||
throw new AssertionError("Shader compilation failed: " + shaderc_result_get_error_message(res));
|
||||
}
|
||||
int size = (int) shaderc_result_get_length(res);
|
||||
ByteBuffer resultBytes = createByteBuffer(size);
|
||||
resultBytes.put(shaderc_result_get_bytes(res));
|
||||
resultBytes.flip();
|
||||
shaderc_compiler_release(res);
|
||||
shaderc_compiler_release(compiler);
|
||||
releaser.free();
|
||||
resolver.free();
|
||||
return resultBytes;
|
||||
}
|
||||
|
||||
public static void _CHECK_(int ret, String msg) {
|
||||
if (ret != VK_SUCCESS)
|
||||
throw new AssertionError(msg + ": " + translateVulkanResult(ret));
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates a Vulkan {@code VkResult} value to a String describing the result.
|
||||
*
|
||||
* @param result
|
||||
* the {@code VkResult} value
|
||||
*
|
||||
* @return the result description
|
||||
*/
|
||||
public static String translateVulkanResult(int result) {
|
||||
switch (result) {
|
||||
// Success codes
|
||||
case VK_SUCCESS:
|
||||
return "Command successfully completed.";
|
||||
case VK_NOT_READY:
|
||||
return "A fence or query has not yet completed.";
|
||||
case VK_TIMEOUT:
|
||||
return "A wait operation has not completed in the specified time.";
|
||||
case VK_EVENT_SET:
|
||||
return "An event is signaled.";
|
||||
case VK_EVENT_RESET:
|
||||
return "An event is unsignaled.";
|
||||
case VK_INCOMPLETE:
|
||||
return "A return array was too small for the result.";
|
||||
case VK_SUBOPTIMAL_KHR:
|
||||
return "A swapchain no longer matches the surface properties exactly, but can still be used to present to the surface successfully.";
|
||||
|
||||
// Error codes
|
||||
case VK_ERROR_OUT_OF_HOST_MEMORY:
|
||||
return "A host memory allocation has failed.";
|
||||
case VK_ERROR_OUT_OF_DEVICE_MEMORY:
|
||||
return "A device memory allocation has failed.";
|
||||
case VK_ERROR_INITIALIZATION_FAILED:
|
||||
return "Initialization of an object could not be completed for implementation-specific reasons.";
|
||||
case VK_ERROR_DEVICE_LOST:
|
||||
return "The logical or physical device has been lost.";
|
||||
case VK_ERROR_MEMORY_MAP_FAILED:
|
||||
return "Mapping of a memory object has failed.";
|
||||
case VK_ERROR_LAYER_NOT_PRESENT:
|
||||
return "A requested layer is not present or could not be loaded.";
|
||||
case VK_ERROR_EXTENSION_NOT_PRESENT:
|
||||
return "A requested extension is not supported.";
|
||||
case VK_ERROR_FEATURE_NOT_PRESENT:
|
||||
return "A requested feature is not supported.";
|
||||
case VK_ERROR_INCOMPATIBLE_DRIVER:
|
||||
return "The requested version of Vulkan is not supported by the driver or is otherwise incompatible for implementation-specific reasons.";
|
||||
case VK_ERROR_TOO_MANY_OBJECTS:
|
||||
return "Too many objects of the type have already been created.";
|
||||
case VK_ERROR_FORMAT_NOT_SUPPORTED:
|
||||
return "A requested format is not supported on this device.";
|
||||
case VK_ERROR_SURFACE_LOST_KHR:
|
||||
return "A surface is no longer available.";
|
||||
case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR:
|
||||
return "The requested window is already connected to a VkSurfaceKHR, or to some other non-Vulkan API.";
|
||||
case VK_ERROR_OUT_OF_DATE_KHR:
|
||||
return "A surface has changed in such a way that it is no longer compatible with the swapchain, and further presentation requests using the "
|
||||
+ "swapchain will fail. Applications must query the new surface properties and recreate their swapchain if they wish to continue" + "presenting to the surface.";
|
||||
case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR:
|
||||
return "The display used by a swapchain does not use the same presentable image layout, or is incompatible in a way that prevents sharing an" + " image.";
|
||||
case VK_ERROR_VALIDATION_FAILED_EXT:
|
||||
return "A validation layer found an error.";
|
||||
default:
|
||||
return String.format("%s [%d]", "Unknown", Integer.valueOf(result));
|
||||
}
|
||||
}
|
||||
|
||||
public static String format_to_string(int format) {
|
||||
switch (format) {
|
||||
case 0: return "UNDEFINED";
|
||||
case 1: return "R4G4_UNORM_PACK8";
|
||||
case 2: return "R4G4B4A4_UNORM_PACK16";
|
||||
case 3: return "B4G4R4A4_UNORM_PACK16";
|
||||
case 4: return "R5G6B5_UNORM_PACK16";
|
||||
case 5: return "B5G6R5_UNORM_PACK16";
|
||||
case 6: return "R5G5B5A1_UNORM_PACK16";
|
||||
case 7: return "B5G5R5A1_UNORM_PACK16";
|
||||
case 8: return "A1R5G5B5_UNORM_PACK16";
|
||||
case 9: return "R8_UNORM";
|
||||
case 10: return "R8_SNORM";
|
||||
case 11: return "R8_USCALED";
|
||||
case 12: return "R8_SSCALED";
|
||||
case 13: return "R8_UINT";
|
||||
case 14: return "R8_SINT";
|
||||
case 15: return "R8_SRGB";
|
||||
case 16: return "R8G8_UNORM";
|
||||
case 17: return "R8G8_SNORM";
|
||||
case 18: return "R8G8_USCALED";
|
||||
case 19: return "R8G8_SSCALED";
|
||||
case 20: return "R8G8_UINT";
|
||||
case 21: return "R8G8_SINT";
|
||||
case 22: return "R8G8_SRGB";
|
||||
case 23: return "R8G8B8_UNORM";
|
||||
case 24: return "R8G8B8_SNORM";
|
||||
case 25: return "R8G8B8_USCALED";
|
||||
case 26: return "R8G8B8_SSCALED";
|
||||
case 27: return "R8G8B8_UINT";
|
||||
case 28: return "R8G8B8_SINT";
|
||||
case 29: return "R8G8B8_SRGB";
|
||||
case 30: return "B8G8R8_UNORM";
|
||||
case 31: return "B8G8R8_SNORM";
|
||||
case 32: return "B8G8R8_USCALED";
|
||||
case 33: return "B8G8R8_SSCALED";
|
||||
case 34: return "B8G8R8_UINT";
|
||||
case 35: return "B8G8R8_SINT";
|
||||
case 36: return "B8G8R8_SRGB";
|
||||
case 37: return "R8G8B8A8_UNORM";
|
||||
case 38: return "R8G8B8A8_SNORM";
|
||||
case 39: return "R8G8B8A8_USCALED";
|
||||
case 40: return "R8G8B8A8_SSCALED";
|
||||
case 41: return "R8G8B8A8_UINT";
|
||||
case 42: return "R8G8B8A8_SINT";
|
||||
case 43: return "R8G8B8A8_SRGB";
|
||||
case 44: return "B8G8R8A8_UNORM";
|
||||
case 45: return "B8G8R8A8_SNORM";
|
||||
case 46: return "B8G8R8A8_USCALED";
|
||||
case 47: return "B8G8R8A8_SSCALED";
|
||||
case 48: return "B8G8R8A8_UINT";
|
||||
case 49: return "B8G8R8A8_SINT";
|
||||
case 50: return "B8G8R8A8_SRGB";
|
||||
case 51: return "A8B8G8R8_UNORM_PACK32";
|
||||
case 52: return "A8B8G8R8_SNORM_PACK32";
|
||||
case 53: return "A8B8G8R8_USCALED_PACK32";
|
||||
case 54: return "A8B8G8R8_SSCALED_PACK32";
|
||||
case 55: return "A8B8G8R8_UINT_PACK32";
|
||||
case 56: return "A8B8G8R8_SINT_PACK32";
|
||||
case 57: return "A8B8G8R8_SRGB_PACK32";
|
||||
case 58: return "A2R10G10B10_UNORM_PACK32";
|
||||
case 59: return "A2R10G10B10_SNORM_PACK32";
|
||||
case 60: return "A2R10G10B10_USCALED_PACK32";
|
||||
case 61: return "A2R10G10B10_SSCALED_PACK32";
|
||||
case 62: return "A2R10G10B10_UINT_PACK32";
|
||||
case 63: return "A2R10G10B10_SINT_PACK32";
|
||||
case 64: return "A2B10G10R10_UNORM_PACK32";
|
||||
case 65: return "A2B10G10R10_SNORM_PACK32";
|
||||
case 66: return "A2B10G10R10_USCALED_PACK32";
|
||||
case 67: return "A2B10G10R10_SSCALED_PACK32";
|
||||
case 68: return "A2B10G10R10_UINT_PACK32";
|
||||
case 69: return "A2B10G10R10_SINT_PACK32";
|
||||
case 70: return "R16_UNORM";
|
||||
case 71: return "R16_SNORM";
|
||||
case 72: return "R16_USCALED";
|
||||
case 73: return "R16_SSCALED";
|
||||
case 74: return "R16_UINT";
|
||||
case 75: return "R16_SINT";
|
||||
case 76: return "R16_SFLOAT";
|
||||
case 77: return "R16G16_UNORM";
|
||||
case 78: return "R16G16_SNORM";
|
||||
case 79: return "R16G16_USCALED";
|
||||
case 80: return "R16G16_SSCALED";
|
||||
case 81: return "R16G16_UINT";
|
||||
case 82: return "R16G16_SINT";
|
||||
case 83: return "R16G16_SFLOAT";
|
||||
case 84: return "R16G16B16_UNORM";
|
||||
case 85: return "R16G16B16_SNORM";
|
||||
case 86: return "R16G16B16_USCALED";
|
||||
case 87: return "R16G16B16_SSCALED";
|
||||
case 88: return "R16G16B16_UINT";
|
||||
case 89: return "R16G16B16_SINT";
|
||||
case 90: return "R16G16B16_SFLOAT";
|
||||
case 91: return "R16G16B16A16_UNORM";
|
||||
case 92: return "R16G16B16A16_SNORM";
|
||||
case 93: return "R16G16B16A16_USCALED";
|
||||
case 94: return "R16G16B16A16_SSCALED";
|
||||
case 95: return "R16G16B16A16_UINT";
|
||||
case 96: return "R16G16B16A16_SINT";
|
||||
case 97: return "R16G16B16A16_SFLOAT";
|
||||
case 98: return "R32_UINT";
|
||||
case 99: return "R32_SINT";
|
||||
case 100: return "R32_SFLOAT";
|
||||
case 101: return "R32G32_UINT";
|
||||
case 102: return "R32G32_SINT";
|
||||
case 103: return "R32G32_SFLOAT";
|
||||
case 104: return "R32G32B32_UINT";
|
||||
case 105: return "R32G32B32_SINT";
|
||||
case 106: return "R32G32B32_SFLOAT";
|
||||
case 107: return "R32G32B32A32_UINT";
|
||||
case 108: return "R32G32B32A32_SINT";
|
||||
case 109: return "R32G32B32A32_SFLOAT";
|
||||
case 110: return "R64_UINT";
|
||||
case 111: return "R64_SINT";
|
||||
case 112: return "R64_SFLOAT";
|
||||
case 113: return "R64G64_UINT";
|
||||
case 114: return "R64G64_SINT";
|
||||
case 115: return "R64G64_SFLOAT";
|
||||
case 116: return "R64G64B64_UINT";
|
||||
case 117: return "R64G64B64_SINT";
|
||||
case 118: return "R64G64B64_SFLOAT";
|
||||
case 119: return "R64G64B64A64_UINT";
|
||||
case 120: return "R64G64B64A64_SINT";
|
||||
case 121: return "R64G64B64A64_SFLOAT";
|
||||
case 122: return "B10G11R11_UFLOAT_PACK32";
|
||||
case 123: return "E5B9G9R9_UFLOAT_PACK32";
|
||||
case 124: return "D16_UNORM";
|
||||
case 125: return "X8_D24_UNORM_PACK32";
|
||||
case 126: return "D32_SFLOAT";
|
||||
case 127: return "S8_UINT";
|
||||
case 128: return "D16_UNORM_S8_UINT";
|
||||
case 129: return "D24_UNORM_S8_UINT";
|
||||
case 130: return "D32_SFLOAT_S8_UINT";
|
||||
case 131: return "BC1_RGB_UNORM_BLOCK";
|
||||
case 132: return "BC1_RGB_SRGB_BLOCK";
|
||||
case 133: return "BC1_RGBA_UNORM_BLOCK";
|
||||
case 134: return "BC1_RGBA_SRGB_BLOCK";
|
||||
case 135: return "BC2_UNORM_BLOCK";
|
||||
case 136: return "BC2_SRGB_BLOCK";
|
||||
case 137: return "BC3_UNORM_BLOCK";
|
||||
case 138: return "BC3_SRGB_BLOCK";
|
||||
case 139: return "BC4_UNORM_BLOCK";
|
||||
case 140: return "BC4_SNORM_BLOCK";
|
||||
case 141: return "BC5_UNORM_BLOCK";
|
||||
case 142: return "BC5_SNORM_BLOCK";
|
||||
case 143: return "BC6H_UFLOAT_BLOCK";
|
||||
case 144: return "BC6H_SFLOAT_BLOCK";
|
||||
case 145: return "BC7_UNORM_BLOCK";
|
||||
case 146: return "BC7_SRGB_BLOCK";
|
||||
case 147: return "ETC2_R8G8B8_UNORM_BLOCK";
|
||||
case 148: return "ETC2_R8G8B8_SRGB_BLOCK";
|
||||
case 149: return "ETC2_R8G8B8A1_UNORM_BLOCK";
|
||||
case 150: return "ETC2_R8G8B8A1_SRGB_BLOCK";
|
||||
case 151: return "ETC2_R8G8B8A8_UNORM_BLOCK";
|
||||
case 152: return "ETC2_R8G8B8A8_SRGB_BLOCK";
|
||||
case 153: return "EAC_R11_UNORM_BLOCK";
|
||||
case 154: return "EAC_R11_SNORM_BLOCK";
|
||||
case 155: return "EAC_R11G11_UNORM_BLOCK";
|
||||
case 156: return "EAC_R11G11_SNORM_BLOCK";
|
||||
case 157: return "ASTC_4x4_UNORM_BLOCK";
|
||||
case 158: return "ASTC_4x4_SRGB_BLOCK";
|
||||
case 159: return "ASTC_5x4_UNORM_BLOCK";
|
||||
case 160: return "ASTC_5x4_SRGB_BLOCK";
|
||||
case 161: return "ASTC_5x5_UNORM_BLOCK";
|
||||
case 162: return "ASTC_5x5_SRGB_BLOCK";
|
||||
case 163: return "ASTC_6x5_UNORM_BLOCK";
|
||||
case 164: return "ASTC_6x5_SRGB_BLOCK";
|
||||
case 165: return "ASTC_6x6_UNORM_BLOCK";
|
||||
case 166: return "ASTC_6x6_SRGB_BLOCK";
|
||||
case 167: return "ASTC_8x5_UNORM_BLOCK";
|
||||
case 168: return "ASTC_8x5_SRGB_BLOCK";
|
||||
case 169: return "ASTC_8x6_UNORM_BLOCK";
|
||||
case 170: return "ASTC_8x6_SRGB_BLOCK";
|
||||
case 171: return "ASTC_8x8_UNORM_BLOCK";
|
||||
case 172: return "ASTC_8x8_SRGB_BLOCK";
|
||||
case 173: return "ASTC_10x5_UNORM_BLOCK";
|
||||
case 174: return "ASTC_10x5_SRGB_BLOCK";
|
||||
case 175: return "ASTC_10x6_UNORM_BLOCK";
|
||||
case 176: return "ASTC_10x6_SRGB_BLOCK";
|
||||
case 177: return "ASTC_10x8_UNORM_BLOCK";
|
||||
case 178: return "ASTC_10x8_SRGB_BLOCK";
|
||||
case 179: return "ASTC_10x10_UNORM_BLOCK";
|
||||
case 180: return "ASTC_10x10_SRGB_BLOCK";
|
||||
case 181: return "ASTC_12x10_UNORM_BLOCK";
|
||||
case 182: return "ASTC_12x10_SRGB_BLOCK";
|
||||
case 183: return "ASTC_12x12_UNORM_BLOCK";
|
||||
case 184: return "ASTC_12x12_SRGB_BLOCK";
|
||||
case 1000156000: return "G8B8G8R8_422_UNORM";
|
||||
case 1000156001: return "B8G8R8G8_422_UNORM";
|
||||
case 1000156002: return "G8_B8_R8_3PLANE_420_UNORM";
|
||||
case 1000156003: return "G8_B8R8_2PLANE_420_UNORM";
|
||||
case 1000156004: return "G8_B8_R8_3PLANE_422_UNORM";
|
||||
case 1000156005: return "G8_B8R8_2PLANE_422_UNORM";
|
||||
case 1000156006: return "G8_B8_R8_3PLANE_444_UNORM";
|
||||
case 1000156007: return "R10X6_UNORM_PACK16";
|
||||
case 1000156008: return "R10X6G10X6_UNORM_2PACK16";
|
||||
case 1000156009: return "R10X6G10X6B10X6A10X6_UNORM_4PACK16";
|
||||
case 1000156010: return "G10X6B10X6G10X6R10X6_422_UNORM_4PACK16";
|
||||
case 1000156011: return "B10X6G10X6R10X6G10X6_422_UNORM_4PACK16";
|
||||
case 1000156012: return "G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16";
|
||||
case 1000156013: return "G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16";
|
||||
case 1000156014: return "G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16";
|
||||
case 1000156015: return "G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16";
|
||||
case 1000156016: return "G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16";
|
||||
case 1000156017: return "R12X4_UNORM_PACK16";
|
||||
case 1000156018: return "R12X4G12X4_UNORM_2PACK16";
|
||||
case 1000156019: return "R12X4G12X4B12X4A12X4_UNORM_4PACK16";
|
||||
case 1000156020: return "G12X4B12X4G12X4R12X4_422_UNORM_4PACK16";
|
||||
case 1000156021: return "B12X4G12X4R12X4G12X4_422_UNORM_4PACK16";
|
||||
case 1000156022: return "G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16";
|
||||
case 1000156023: return "G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16";
|
||||
case 1000156024: return "G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16";
|
||||
case 1000156025: return "G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16";
|
||||
case 1000156026: return "G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16";
|
||||
case 1000156027: return "G16B16G16R16_422_UNORM";
|
||||
case 1000156028: return "B16G16R16G16_422_UNORM";
|
||||
case 1000156029: return "G16_B16_R16_3PLANE_420_UNORM";
|
||||
case 1000156030: return "G16_B16R16_2PLANE_420_UNORM";
|
||||
case 1000156031: return "G16_B16_R16_3PLANE_422_UNORM";
|
||||
case 1000156032: return "G16_B16R16_2PLANE_422_UNORM";
|
||||
case 1000156033: return "G16_B16_R16_3PLANE_444_UNORM";
|
||||
case 1000054000: return "PVRTC1_2BPP_UNORM_BLOCK_IMG";
|
||||
case 1000054001: return "PVRTC1_4BPP_UNORM_BLOCK_IMG";
|
||||
case 1000054002: return "PVRTC2_2BPP_UNORM_BLOCK_IMG";
|
||||
case 1000054003: return "PVRTC2_4BPP_UNORM_BLOCK_IMG";
|
||||
case 1000054004: return "PVRTC1_2BPP_SRGB_BLOCK_IMG";
|
||||
case 1000054005: return "PVRTC1_4BPP_SRGB_BLOCK_IMG";
|
||||
case 1000054006: return "PVRTC2_2BPP_SRGB_BLOCK_IMG";
|
||||
case 1000054007: return "PVRTC2_4BPP_SRGB_BLOCK_IMG";
|
||||
default: return "";
|
||||
}
|
||||
}
|
||||
|
||||
static AIScene loadModel(String classpathResource) {
|
||||
AIFileIO fileIo = AIFileIO.create();
|
||||
List<Callback> callbacks = new ArrayList<>();
|
||||
AIFileOpenProc fileOpenProc = new AIFileOpenProc() {
|
||||
public long invoke(long pFileIO, long fileName, long openMode) {
|
||||
AIFile aiFile = AIFile.create();
|
||||
final ByteBuffer data;
|
||||
String fileNameUtf8 = memUTF8(fileName);
|
||||
try {
|
||||
data = IOUtil.ioResourceToByteBuffer(fileNameUtf8, 8192);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException("Could not open file: " + fileNameUtf8);
|
||||
}
|
||||
AIFileReadProc fileReadProc = new AIFileReadProc() {
|
||||
public long invoke(long pFile, long pBuffer, long size, long count) {
|
||||
long max = Math.min(data.remaining(), size * count);
|
||||
memCopy(memAddress(data) + data.position(), pBuffer, max);
|
||||
return max;
|
||||
}
|
||||
};
|
||||
callbacks.add(fileReadProc);
|
||||
AIFileSeek fileSeekProc = new AIFileSeek() {
|
||||
public int invoke(long pFile, long offset, int origin) {
|
||||
if (origin == Assimp.aiOrigin_CUR) {
|
||||
data.position(data.position() + (int) offset);
|
||||
} else if (origin == Assimp.aiOrigin_SET) {
|
||||
data.position((int) offset);
|
||||
} else if (origin == Assimp.aiOrigin_END) {
|
||||
data.position(data.limit() + (int) offset);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
callbacks.add(fileSeekProc);
|
||||
AIFileTellProc fileTellProc = new AIFileTellProc() {
|
||||
public long invoke(long pFile) {
|
||||
return data.limit();
|
||||
}
|
||||
};
|
||||
callbacks.add(fileTellProc);
|
||||
aiFile.ReadProc(fileReadProc);
|
||||
aiFile.SeekProc(fileSeekProc);
|
||||
aiFile.FileSizeProc(fileTellProc);
|
||||
return aiFile.address();
|
||||
}
|
||||
};
|
||||
AIFileCloseProc fileCloseProc = new AIFileCloseProc() {
|
||||
public void invoke(long pFileIO, long pFile) {
|
||||
/* Nothing to do */
|
||||
}
|
||||
};
|
||||
callbacks.add(fileOpenProc);
|
||||
callbacks.add(fileCloseProc);
|
||||
fileIo.set(fileOpenProc, fileCloseProc, NULL);
|
||||
AIScene scene = aiImportFileEx(classpathResource,
|
||||
aiProcess_JoinIdenticalVertices | aiProcess_Triangulate, fileIo);
|
||||
callbacks.forEach(Callback::free);
|
||||
return scene;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue