private unsafe PoolInfo CreateNewPool() { uint totalSets = 1000; uint descriptorCount = 100; uint poolSizeCount = 7; VkDescriptorPoolSize *sizes = stackalloc VkDescriptorPoolSize[(int)poolSizeCount]; sizes[0].type = VkDescriptorType.UniformBuffer; sizes[0].descriptorCount = descriptorCount; sizes[1].type = VkDescriptorType.SampledImage; sizes[1].descriptorCount = descriptorCount; sizes[2].type = VkDescriptorType.Sampler; sizes[2].descriptorCount = descriptorCount; sizes[3].type = VkDescriptorType.StorageBuffer; sizes[3].descriptorCount = descriptorCount; sizes[4].type = VkDescriptorType.StorageImage; sizes[4].descriptorCount = descriptorCount; sizes[5].type = VkDescriptorType.UniformBufferDynamic; sizes[5].descriptorCount = descriptorCount; sizes[6].type = VkDescriptorType.StorageBufferDynamic; sizes[6].descriptorCount = descriptorCount; VkDescriptorPoolCreateInfo poolCI = VkDescriptorPoolCreateInfo.New(); poolCI.flags = VkDescriptorPoolCreateFlags.FreeDescriptorSet; poolCI.maxSets = totalSets; poolCI.pPoolSizes = sizes; poolCI.poolSizeCount = poolSizeCount; VkResult result = vkCreateDescriptorPool(_gd.Device, ref poolCI, null, out VkDescriptorPool descriptorPool); VulkanUtil.CheckResult(result); return(new PoolInfo(descriptorPool, totalSets, descriptorCount)); }
internal void TransitionImageLayout( VkCommandBuffer cb, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, VkImageLayout newLayout) { if (_stagingBuffer != Vulkan.VkBuffer.Null) { return; } VkImageLayout oldLayout = _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)]; #if DEBUG for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { if (_imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] != oldLayout) { throw new VeldridException("Unexpected image layout."); } } } #endif if (oldLayout != newLayout) { VkImageAspectFlags aspectMask; if ((Usage & TextureUsage.DepthStencil) != 0) { aspectMask = FormatHelpers.IsStencilFormat(Format) ? aspectMask = VkImageAspectFlags.Depth | VkImageAspectFlags.Stencil : aspectMask = VkImageAspectFlags.Depth; } else { aspectMask = VkImageAspectFlags.Color; } VulkanUtil.TransitionImageLayout( cb, OptimalDeviceImage, baseMipLevel, levelCount, baseArrayLayer, layerCount, aspectMask, _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)], newLayout); for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { _imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] = newLayout; } } } }
public VkFence(VkGraphicsDevice gd, bool signaled) { _gd = gd; VkFenceCreateInfo fenceCI = VkFenceCreateInfo.New(); fenceCI.flags = signaled ? VkFenceCreateFlags.Signaled : VkFenceCreateFlags.None; VkResult result = vkCreateFence(_gd.Device, ref fenceCI, null, out _fence); VulkanUtil.CheckResult(result); }
public unsafe DescriptorAllocationToken Allocate(DescriptorResourceCounts counts, VkDescriptorSetLayout setLayout) { VkDescriptorPool pool = GetPool(counts); VkDescriptorSetAllocateInfo dsAI = VkDescriptorSetAllocateInfo.New(); dsAI.descriptorSetCount = 1; dsAI.pSetLayouts = &setLayout; dsAI.descriptorPool = pool; VkResult result = vkAllocateDescriptorSets(_gd.Device, ref dsAI, out VkDescriptorSet set); VulkanUtil.CheckResult(result); return(new DescriptorAllocationToken(set, pool)); }
internal void TransitionImageLayoutNonmatching( VkCommandBuffer cb, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, VkImageLayout newLayout) { if (_stagingBuffer != Vulkan.VkBuffer.Null) { return; } for (uint level = baseMipLevel; level < baseMipLevel + levelCount; level++) { for (uint layer = baseArrayLayer; layer < baseArrayLayer + layerCount; layer++) { uint subresource = CalculateSubresource(level, layer); VkImageLayout oldLayout = _imageLayouts[subresource]; if (oldLayout != newLayout) { VkImageAspectFlags aspectMask; if ((Usage & TextureUsage.DepthStencil) != 0) { aspectMask = FormatHelpers.IsStencilFormat(Format) ? VkImageAspectFlags.Depth | VkImageAspectFlags.Stencil : VkImageAspectFlags.Depth; } else { aspectMask = VkImageAspectFlags.Color; } VulkanUtil.TransitionImageLayout( cb, OptimalDeviceImage, level, 1, layer, 1, aspectMask, oldLayout, newLayout); _imageLayouts[subresource] = newLayout; } } } }
internal void TransitionImageLayout( VkCommandBuffer cb, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, VkImageLayout newLayout) { if (_stagingBuffer != Vulkan.VkBuffer.Null) { return; } VkImageLayout oldLayout = _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)]; #if DEBUG for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { if (_imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] != oldLayout) { throw new VeldridException("Unexpected image layout."); } } } #endif if (oldLayout != newLayout) { VulkanUtil.TransitionImageLayout( cb, OptimalDeviceImage, baseMipLevel, levelCount, baseArrayLayer, layerCount, _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)], newLayout); for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { _imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] = newLayout; } } } }
internal void TransitionImageLayout( VkCommandBuffer cb, uint baseMipLevel, uint levelCount, uint baseArrayLayer, uint layerCount, VkImageLayout newLayout) { VkImageLayout oldLayout = _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)]; #if DEBUG for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { if (_imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] != oldLayout) { throw new VeldridException("Unexpected image layout."); } } } #endif if (oldLayout != newLayout) { if (_stagingImages == null) { VulkanUtil.TransitionImageLayout( cb, OptimalDeviceImage, baseMipLevel, levelCount, baseArrayLayer, layerCount, _imageLayouts[CalculateSubresource(baseMipLevel, baseArrayLayer)], newLayout); for (uint level = 0; level < levelCount; level++) { for (uint layer = 0; layer < layerCount; layer++) { _imageLayouts[CalculateSubresource(baseMipLevel + level, baseArrayLayer + layer)] = newLayout; } } } else { // Transition each staging image one-by-one. for (uint arrayLayer = baseArrayLayer; arrayLayer < baseArrayLayer + layerCount; arrayLayer++) { for (uint level = baseMipLevel; level < baseMipLevel + levelCount; level++) { uint subresource = CalculateSubresource(level, arrayLayer); VkImage image = _stagingImages[subresource]; VulkanUtil.TransitionImageLayout( cb, image, 0, 1, 0, 1, _imageLayouts[subresource], newLayout); _imageLayouts[subresource] = newLayout; } } } } }