update descriptor handling
This commit is contained in:
parent
614ee40d85
commit
b4d7f4fb16
223
vulkan.d
223
vulkan.d
@ -51,10 +51,7 @@ const DESC_ARRAY_SIZE = 256;
|
||||
|
||||
version(linux)
|
||||
{
|
||||
const string[] VULKAN_LIBS = [
|
||||
"libvulkan.so.1",
|
||||
"libvulkan.so",
|
||||
];
|
||||
const string[] VULKAN_LIBS = [ "libvulkan.so.1", "libvulkan.so" ];
|
||||
|
||||
struct PlatformHandles
|
||||
{
|
||||
@ -65,9 +62,7 @@ version(linux)
|
||||
|
||||
version(Windows)
|
||||
{
|
||||
const string[] VULKAN_LIBS = [
|
||||
"vulkan-1.dll",
|
||||
];
|
||||
const string[] VULKAN_LIBS = [ "vulkan-1.dll" ];
|
||||
|
||||
struct PlatformHandles
|
||||
{
|
||||
@ -138,8 +133,7 @@ alias IR = InputRate;
|
||||
enum ImageUsage : VkImageUsageFlagBits
|
||||
{
|
||||
None = cast(VkImageUsageFlagBits)0,
|
||||
Draw = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
|
||||
VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
|
||||
Draw = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
|
||||
Depth = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
|
||||
Texture = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
|
||||
Convert = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
|
||||
@ -230,6 +224,19 @@ struct Buffer
|
||||
bool dynamic;
|
||||
}
|
||||
|
||||
struct Descriptor
|
||||
{
|
||||
DescType type;
|
||||
u32 binding;
|
||||
union
|
||||
{
|
||||
Buffer buf;
|
||||
Image image;
|
||||
ImageView view;
|
||||
BufferView buf_view;
|
||||
}
|
||||
}
|
||||
|
||||
struct ShaderUniforms
|
||||
{
|
||||
f32 placeholder;
|
||||
@ -350,16 +357,6 @@ enum DescType : VkDescriptorType
|
||||
|
||||
alias DT = DescType;
|
||||
|
||||
enum PresentMode : VkPresentModeKHR
|
||||
{
|
||||
Vsync = VK_PRESENT_MODE_FIFO_KHR,
|
||||
NoVsync = VK_PRESENT_MODE_IMMEDIATE_KHR,
|
||||
VsyncUncapped = VK_PRESENT_MODE_MAILBOX_KHR,
|
||||
VsyncRelaxed = VK_PRESENT_MODE_FIFO_RELAXED_KHR,
|
||||
|
||||
Max,
|
||||
}
|
||||
|
||||
struct MappedBuffer(T)
|
||||
{
|
||||
Buffer base;
|
||||
@ -391,10 +388,8 @@ struct Vulkan
|
||||
VkSwapchainKHR swapchain;
|
||||
|
||||
VkSurfaceFormatKHR surface_format;
|
||||
PresentMode present_mode;
|
||||
VkPresentModeKHR present_mode;
|
||||
VkExtent3D swapchain_extent;
|
||||
PresentMode[] present_modes;
|
||||
bool swapchain_dirty;
|
||||
|
||||
VkRenderPass render_pass;
|
||||
VkFramebuffer framebuffer;
|
||||
@ -765,12 +760,7 @@ BeginFrame(Vulkan* vk)
|
||||
VkCheckA("BeginFrame failure: vkResetFences error", result);
|
||||
|
||||
result = vkAcquireNextImageKHR(vk.device, vk.swapchain, 1000000000, vk.acquire_sems[vk.frame_index], null, &vk.image_index);
|
||||
if(vk.swapchain_dirty && (result == VK_SUCCESS || result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR))
|
||||
{
|
||||
RecreateSwapchain(vk);
|
||||
vk.swapchain_dirty = false;
|
||||
}
|
||||
else if(result == VK_ERROR_OUT_OF_DATE_KHR)
|
||||
if(result == VK_ERROR_OUT_OF_DATE_KHR)
|
||||
{
|
||||
RecreateSwapchain(vk);
|
||||
}
|
||||
@ -2264,102 +2254,49 @@ InitGlobalDescSet(Vulkan* vk)
|
||||
}
|
||||
|
||||
void
|
||||
Write(Vulkan* vk, DescSet set, ImageView* view, u32 binding, DescType type)
|
||||
Write(Vulkan* vk, DescSet set, Descriptor[] descs)
|
||||
{
|
||||
VkDescriptorImageInfo info = {
|
||||
imageView: view.view,
|
||||
imageLayout: view.layout,
|
||||
};
|
||||
Arena* arena = vk.frame_arenas.ptr + vk.frame_index;
|
||||
|
||||
VkWriteDescriptorSet write = {
|
||||
sType: VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
dstSet: set.handle,
|
||||
dstBinding: binding,
|
||||
descriptorCount: 1,
|
||||
descriptorType: type,
|
||||
pImageInfo: &info,
|
||||
};
|
||||
VkWriteDescriptorSet[] writes = Alloc!(VkWriteDescriptorSet)(arena, descs.length);
|
||||
|
||||
vkUpdateDescriptorSets(vk.device, 1, &write, 0, null);
|
||||
for(u64 i = 0; i < descs.length; i += 1)
|
||||
{
|
||||
VkWriteDescriptorSet* write = writes.ptr + i;
|
||||
|
||||
write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write.descriptorType = descs[i].type;
|
||||
write.dstSet = set;
|
||||
write.dstBinding = descs[i].binding;
|
||||
write.descriptorCount = 1;
|
||||
|
||||
switch(descs[i].type) with(DescType)
|
||||
{
|
||||
case Image, StorageImage, InputAttach:
|
||||
{
|
||||
VkDescriptorImageInfo* info = Alloc!(VkDescriptorImageInfo)(arena);
|
||||
|
||||
info.imageView = descs[i].view.view;
|
||||
info.imageLayout = descs[i].view.layout;
|
||||
write.pImageInfo = info;
|
||||
} break;
|
||||
case Uniform, Storage:
|
||||
{
|
||||
VkDescriptorBufferInfo* info = Alloc!(VkDescriptorBufferInfo)(arena);
|
||||
|
||||
info.buffer = descs[i].buf.buffer;
|
||||
info.offset = cast(VkDeviceSize)0;
|
||||
info.range = cast(VkDeviceSize)descs[i].buf.size;
|
||||
write.pBufferInfo = info;
|
||||
} break;
|
||||
case UniformTexelBuf, StorageTexelBuf:
|
||||
{
|
||||
write.pTexelBufferView = &descs[i].buf_view.view;
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Write(Vulkan* vk, DescSet set, Buffer* buffer, u32 binding, DescType type)
|
||||
{
|
||||
VkDescriptorBufferInfo info = {
|
||||
buffer: buffer.buffer,
|
||||
range: buffer.size,
|
||||
offset: 0,
|
||||
};
|
||||
|
||||
VkWriteDescriptorSet write = {
|
||||
sType: VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
dstSet: set.handle,
|
||||
dstBinding: binding,
|
||||
descriptorCount: 1,
|
||||
descriptorType: type,
|
||||
pBufferInfo: &info,
|
||||
};
|
||||
|
||||
vkUpdateDescriptorSets(vk.device, 1, &write, 0, null);
|
||||
}
|
||||
|
||||
void
|
||||
Write(Vulkan* vk, DescSet set, Buffer* buffer, u32 binding, u32 index, DescType type)
|
||||
{
|
||||
VkDescriptorBufferInfo info = {
|
||||
buffer: buffer.buffer,
|
||||
range: buffer.size,
|
||||
offset: 0,
|
||||
};
|
||||
|
||||
VkWriteDescriptorSet write = {
|
||||
sType: VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
dstSet: set.handle,
|
||||
dstBinding: binding,
|
||||
dstArrayElement: index,
|
||||
descriptorCount: 1,
|
||||
descriptorType: type,
|
||||
pBufferInfo: &info,
|
||||
};
|
||||
|
||||
vkUpdateDescriptorSets(vk.device, 1, &write, 0, null);
|
||||
}
|
||||
|
||||
void
|
||||
WriteGUI(Vulkan* vk, DescSet set, ImageView* atlas, Buffer* buf)
|
||||
{
|
||||
VkDescriptorImageInfo image_info = {
|
||||
imageView: atlas.view,
|
||||
imageLayout: atlas.layout,
|
||||
};
|
||||
|
||||
VkDescriptorBufferInfo buf_info = {
|
||||
buffer: buf.buffer,
|
||||
range: buf.size,
|
||||
offset: 0,
|
||||
};
|
||||
|
||||
VkWriteDescriptorSet[2] writes = [
|
||||
{
|
||||
sType: VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
dstSet: set.handle,
|
||||
dstBinding: 0,
|
||||
descriptorCount: 1,
|
||||
descriptorType: VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
|
||||
pImageInfo: &image_info,
|
||||
},
|
||||
{
|
||||
sType: VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
dstSet: set.handle,
|
||||
dstBinding: 1,
|
||||
descriptorCount: 1,
|
||||
descriptorType: VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||
pBufferInfo: &buf_info,
|
||||
}
|
||||
];
|
||||
|
||||
vkUpdateDescriptorSets(vk.device, cast(u32)writes.length, writes.ptr, 0, null);
|
||||
vkUpdateDescriptorSets(vk.device, writes.length, writes.ptr, 0, null);
|
||||
}
|
||||
|
||||
void
|
||||
@ -2643,8 +2580,18 @@ SelectSwapchainFormats(Vulkan* vk)
|
||||
|
||||
u32 mode_count;
|
||||
vkGetPhysicalDeviceSurfacePresentModesKHR(vk.physical_device, vk.surface, &mode_count, null);
|
||||
vk.present_modes = Alloc!(PresentMode)(arena, mode_count);
|
||||
vkGetPhysicalDeviceSurfacePresentModesKHR(vk.physical_device, vk.surface, &mode_count, cast(VkPresentModeKHR*)vk.present_modes.ptr);
|
||||
VkPresentModeKHR[] modes = Alloc!(VkPresentModeKHR)(arena, mode_count);
|
||||
vkGetPhysicalDeviceSurfacePresentModesKHR(vk.physical_device, vk.surface, &mode_count, modes.ptr);
|
||||
|
||||
VkPresentModeKHR present_mode = VK_PRESENT_MODE_FIFO_KHR;
|
||||
foreach(mode; modes)
|
||||
{
|
||||
if(mode == VK_PRESENT_MODE_MAILBOX_KHR)
|
||||
{
|
||||
present_mode = VK_PRESENT_MODE_MAILBOX_KHR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
VkSurfaceFormatKHR surface_format = formats[0];
|
||||
foreach(format; formats)
|
||||
@ -2657,39 +2604,7 @@ SelectSwapchainFormats(Vulkan* vk)
|
||||
}
|
||||
|
||||
vk.surface_format = surface_format;
|
||||
vk.present_mode = PresentMode.Vsync;
|
||||
}
|
||||
|
||||
PresentMode[]
|
||||
AvailablePresentModes(Vulkan* vk)
|
||||
{
|
||||
return vk.present_modes;
|
||||
}
|
||||
|
||||
bool
|
||||
SetPresentMode(Vulkan* vk, PresentMode mode)
|
||||
{
|
||||
bool result = false;
|
||||
foreach(pm; vk.present_modes)
|
||||
{
|
||||
if(pm == mode)
|
||||
{
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(result)
|
||||
{
|
||||
if(vk.present_mode != mode)
|
||||
{
|
||||
vk.swapchain_dirty = true;
|
||||
}
|
||||
|
||||
vk.present_mode = mode;
|
||||
}
|
||||
|
||||
return result;
|
||||
vk.present_mode = present_mode;
|
||||
}
|
||||
|
||||
bool
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user