Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 37 additions & 2 deletions include/nbl/asset/IImage.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,12 @@ class IImage : public virtual core::IReferenceCounted
EUF_TRANSIENT_ATTACHMENT_BIT = 0x0040,
EUF_INPUT_ATTACHMENT_BIT = 0x0080,
EUF_SHADING_RATE_ATTACHMENT_BIT = 0x0100,
EUF_FRAGMENT_DENSITY_MAP_BIT = 0x0200
EUF_FRAGMENT_DENSITY_MAP_BIT = 0x0200,
EUF_HOST_TRANSFER_BIT = 0x0400
};

struct SSubresourceRange
{
{
core::bitflag<E_ASPECT_FLAGS> aspectMask = E_ASPECT_FLAGS::EAF_NONE;
uint32_t baseMipLevel = 0u;
uint32_t levelCount = 0u;
Expand All @@ -151,6 +153,11 @@ class IImage : public virtual core::IReferenceCounted

auto operator<=>(const SSubresourceLayers&) const = default;
};
enum E_HOST_IMAGE_COPY_FLAGS : uint8_t
{
EHICF_NONE = 0x00,
EHICF_MEMCPY_BIT = 0x01
};
struct SBufferCopy
{
inline bool isValid() const
Expand Down Expand Up @@ -209,6 +216,33 @@ class IImage : public virtual core::IReferenceCounted

auto operator<=>(const SBufferCopy&) const = default;
};
struct SMemoryToImageCopy
{
inline bool isValid() const
{
if (!hostPointer)
return false;
if (imageSubresource.layerCount==0u)
return false;
if (imageExtent.width==0u || imageExtent.height==0u || imageExtent.depth==0u)
return false;

return true;
}

inline const auto& getDstSubresource() const {return imageSubresource;}
inline const VkOffset3D& getDstOffset() const {return imageOffset;}
inline const VkExtent3D& getExtent() const {return imageExtent;}

const void* hostPointer = nullptr;
uint32_t memoryRowLength = 0u;
uint32_t memoryImageHeight = 0u;
SSubresourceLayers imageSubresource = {};
VkOffset3D imageOffset = {0u,0u,0u};
VkExtent3D imageExtent = {0u,0u,0u};

auto operator<=>(const SMemoryToImageCopy&) const = default;
};
struct SImageCopy
{
inline bool isValid() const
Expand Down Expand Up @@ -846,6 +880,7 @@ class IImage : public virtual core::IReferenceCounted
};
static_assert(sizeof(IImage)-sizeof(IDescriptor)!=3u*sizeof(uint32_t)+sizeof(VkExtent3D)+sizeof(uint32_t)*3u,"BaW File Format won't work");

NBL_ENUM_ADD_BITWISE_OPERATORS(IImage::E_HOST_IMAGE_COPY_FLAGS)
NBL_ENUM_ADD_BITWISE_OPERATORS(IImage::E_USAGE_FLAGS)
} // end namespace nbl::asset

Expand Down
2 changes: 2 additions & 0 deletions include/nbl/video/CVulkanCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,7 @@ inline VkImageUsageFlags getVkImageUsageFlagsFromImageUsageFlags(const core::bit
if (in.hasFlags(IGPUImage::EUF_INPUT_ATTACHMENT_BIT)) ret |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
if (in.hasFlags(IGPUImage::EUF_SHADING_RATE_ATTACHMENT_BIT)) ret |= VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
if (in.hasFlags(IGPUImage::EUF_FRAGMENT_DENSITY_MAP_BIT)) ret |= VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT;
if (in.hasFlags(IGPUImage::EUF_HOST_TRANSFER_BIT)) ret |= VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT;
return ret;
}

Expand All @@ -806,6 +807,7 @@ inline core::bitflag<IGPUImage::E_USAGE_FLAGS> getImageUsageFlagsFromVkImageUsag
if (in&VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) ret |= IGPUImage::EUF_INPUT_ATTACHMENT_BIT;
if (in&VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR) ret |= IGPUImage::EUF_SHADING_RATE_ATTACHMENT_BIT;
if (in&VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT) ret |= IGPUImage::EUF_FRAGMENT_DENSITY_MAP_BIT;
if (in&VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT) ret |= IGPUImage::EUF_HOST_TRANSFER_BIT;
return ret;
}

Expand Down
10 changes: 8 additions & 2 deletions include/nbl/video/ILogicalDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,8 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
m_logger.log("Failed to create Image, queue family count %d for concurrent sharing larger than our max %d!",system::ILogger::ELL_ERROR,creationParams.queueFamilyIndexCount,MaxQueueFamilies);
return nullptr;
}
// TODO: validation of creationParams against the device's limits (sample counts, etc.) see vkCreateImage docs
if (!validateImageCreationAgainstDevice(creationParams))
return nullptr;
return createImage_impl(std::move(creationParams));
}
// Create an ImageView that can actually be used by shaders (@see ICPUImageView)
Expand Down Expand Up @@ -822,6 +823,8 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
return result!=DEFERRABLE_RESULT::SOME_ERROR;
}

// https://docs.vulkan.org/refpages/latest/refpages/source/vkCopyMemoryToImage.html
bool copyMemoryToImage(IGPUImage* const dstImage, const IGPUImage::LAYOUT dstImageLayout, const core::bitflag<IGPUImage::E_HOST_IMAGE_COPY_FLAGS> flags, const std::span<const IGPUImage::SMemoryToImageCopy> regions);
Comment on lines +826 to +827
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add the host-sde calls to perfrom a layout transition and query current layout


//! Shaders
struct SShaderCreationParameters
Expand Down Expand Up @@ -1134,6 +1137,7 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe

virtual core::smart_refctd_ptr<IGPUBuffer> createBuffer_impl(IGPUBuffer::SCreationParams&& creationParams) = 0;
virtual core::smart_refctd_ptr<IGPUBufferView> createBufferView_impl(const asset::SBufferRange<const IGPUBuffer>& underlying, const asset::E_FORMAT _fmt) = 0;
bool validateImageCreationAgainstDevice(const IGPUImage::SCreationParams& creationParams);
virtual core::smart_refctd_ptr<IGPUImage> createImage_impl(IGPUImage::SCreationParams&& params) = 0;
virtual core::smart_refctd_ptr<IGPUImageView> createImageView_impl(IGPUImageView::SCreationParams&& params) = 0;
virtual core::smart_refctd_ptr<IGPUBottomLevelAccelerationStructure> createBottomLevelAccelerationStructure_impl(IGPUAccelerationStructure::SCreationParams&& params) = 0;
Expand Down Expand Up @@ -1179,6 +1183,8 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
virtual DEFERRABLE_RESULT copyAccelerationStructureToMemory_impl(IDeferredOperation* const deferredOperation, const IGPUAccelerationStructure* src, const asset::SBufferBinding<asset::ICPUBuffer>& dst) = 0;
virtual DEFERRABLE_RESULT copyAccelerationStructureFromMemory_impl(IDeferredOperation* const deferredOperation, const asset::SBufferBinding<const asset::ICPUBuffer>& src, IGPUAccelerationStructure* dst) = 0;

virtual bool copyMemoryToImage_impl(IGPUImage* const dstImage, const IGPUImage::LAYOUT dstImageLayout, const core::bitflag<IGPUImage::E_HOST_IMAGE_COPY_FLAGS> flags, const std::span<const IGPUImage::SMemoryToImageCopy> regions) = 0;

constexpr static inline auto MaxStagesPerPipeline = 6u;
virtual core::smart_refctd_ptr<IGPUDescriptorSetLayout> createDescriptorSetLayout_impl(const std::span<const IGPUDescriptorSetLayout::SBinding> bindings, const uint32_t maxSamplersCount) = 0;
virtual core::smart_refctd_ptr<IGPUPipelineLayout> createPipelineLayout_impl(
Expand Down Expand Up @@ -1624,4 +1630,4 @@ inline bool ILogicalDevice::validateMemoryBarrier(const uint32_t queueFamilyInde
} // namespace nbl::video

#include "nbl/undef_logging_macros.h"
#endif //_NBL_VIDEO_I_LOGICAL_DEVICE_H_INCLUDED_
#endif //_NBL_VIDEO_I_LOGICAL_DEVICE_H_INCLUDED_
4 changes: 3 additions & 1 deletion include/nbl/video/IPhysicalDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
storageImageLoadWithoutFormat(0),
storageImageStoreWithoutFormat(0),
depthCompareSampledImage(0),
hostImageTransfer(0),
hostImageTransfer(usages.hasFlags(IGPUImage::EUF_HOST_TRANSFER_BIT)),
log2MaxSamples(0)
{}

Expand All @@ -455,6 +455,8 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
retval |= usage_flags_t::EUF_SAMPLED_BIT;
if (storageImage)
retval |= usage_flags_t::EUF_STORAGE_BIT;
if (hostImageTransfer)
retval |= usage_flags_t::EUF_HOST_TRANSFER_BIT;
if (attachment || blitDst) // does also src imply?
retval |= usage_flags_t::EUF_RENDER_ATTACHMENT_BIT;
if (blitSrc || transferSrc)
Expand Down
24 changes: 24 additions & 0 deletions src/nbl/video/CVulkanLogicalDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -527,7 +527,31 @@ auto CVulkanLogicalDevice::copyAccelerationStructureFromMemory_impl(IDeferredOpe
return getDeferrableResultFrom(m_devf.vk.vkCopyMemoryToAccelerationStructureKHR(m_vkdev,static_cast<CVulkanDeferredOperation*>(deferredOperation)->getInternalObject(),&info));
}

bool CVulkanLogicalDevice::copyMemoryToImage_impl(IGPUImage* const dstImage, const IGPUImage::LAYOUT dstImageLayout, const core::bitflag<IGPUImage::E_HOST_IMAGE_COPY_FLAGS> flags, const std::span<const IGPUImage::SMemoryToImageCopy> regions)
{
core::vector<VkMemoryToImageCopy> vk_regions(regions.size(),{VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY,nullptr});
for (size_t i=0u; i<regions.size(); ++i)
{
vk_regions[i].pHostPointer = regions[i].hostPointer;
vk_regions[i].memoryRowLength = regions[i].memoryRowLength;
vk_regions[i].memoryImageHeight = regions[i].memoryImageHeight;
vk_regions[i].imageSubresource.aspectMask = static_cast<VkImageAspectFlags>(regions[i].imageSubresource.aspectMask.value);
vk_regions[i].imageSubresource.mipLevel = regions[i].imageSubresource.mipLevel;
vk_regions[i].imageSubresource.baseArrayLayer = regions[i].imageSubresource.baseArrayLayer;
vk_regions[i].imageSubresource.layerCount = regions[i].imageSubresource.layerCount;
vk_regions[i].imageOffset = { static_cast<int32_t>(regions[i].imageOffset.x), static_cast<int32_t>(regions[i].imageOffset.y), static_cast<int32_t>(regions[i].imageOffset.z) };
vk_regions[i].imageExtent = { regions[i].imageExtent.width, regions[i].imageExtent.height, regions[i].imageExtent.depth };
}

VkCopyMemoryToImageInfoEXT info = { VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO,nullptr };
info.flags = static_cast<VkHostImageCopyFlagsEXT>(flags.value);
info.dstImage = static_cast<CVulkanImage*>(dstImage)->getInternalObject();
info.dstImageLayout = getVkImageLayoutFromImageLayout(dstImageLayout);
info.regionCount = static_cast<uint32_t>(vk_regions.size());
info.pRegions = vk_regions.data();

return m_devf.vk.vkCopyMemoryToImageEXT(m_vkdev,&info) == VK_SUCCESS;
}

core::smart_refctd_ptr<IGPUDescriptorSetLayout> CVulkanLogicalDevice::createDescriptorSetLayout_impl(const std::span<const IGPUDescriptorSetLayout::SBinding> bindings, const uint32_t maxSamplersCount)
{
Expand Down
2 changes: 2 additions & 0 deletions src/nbl/video/CVulkanLogicalDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,8 @@ class CVulkanLogicalDevice final : public ILogicalDevice
DEFERRABLE_RESULT copyAccelerationStructureToMemory_impl(IDeferredOperation* const deferredOperation, const IGPUAccelerationStructure* src, const asset::SBufferBinding<asset::ICPUBuffer>& dst) override;
DEFERRABLE_RESULT copyAccelerationStructureFromMemory_impl(IDeferredOperation* const deferredOperation, const asset::SBufferBinding<const asset::ICPUBuffer>& src, IGPUAccelerationStructure* dst) override;

virtual bool copyMemoryToImage_impl(IGPUImage* const dstImage, const IGPUImage::LAYOUT dstImageLayout, const core::bitflag<IGPUImage::E_HOST_IMAGE_COPY_FLAGS> flags, const std::span<const IGPUImage::SMemoryToImageCopy> regions) override;

// layouts
core::smart_refctd_ptr<IGPUDescriptorSetLayout> createDescriptorSetLayout_impl(const std::span<const IGPUDescriptorSetLayout::SBinding> bindings, const uint32_t maxSamplersCount) override;
core::smart_refctd_ptr<IGPUPipelineLayout> createPipelineLayout_impl(
Expand Down
18 changes: 16 additions & 2 deletions src/nbl/video/CVulkanPhysicalDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
VkPhysicalDeviceCooperativeMatrixPropertiesKHR cooperativeMatrixProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR };
VkPhysicalDeviceShaderSMBuiltinsPropertiesNV shaderSMBuiltinsPropertiesNV = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV };
VkPhysicalDeviceShaderCoreProperties2AMD shaderCoreProperties2AMD = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD };
VkPhysicalDeviceHostImageCopyPropertiesEXT hostImageCopyProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT };
VkPhysicalDeviceMaintenance5PropertiesKHR maintenance5Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR };
VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT graphicsPipelineLibraryProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT };
VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT rayTracingInvocationReorderProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT };
Expand Down Expand Up @@ -357,6 +358,8 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
addToPNextChain(&shaderSMBuiltinsPropertiesNV);
if (isExtensionSupported(VK_AMD_SHADER_CORE_PROPERTIES_2_EXTENSION_NAME))
addToPNextChain(&shaderCoreProperties2AMD);
if (isExtensionSupported(VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME))
addToPNextChain(&hostImageCopyProperties);
if (isExtensionSupported(VK_KHR_MAINTENANCE_5_EXTENSION_NAME))
addToPNextChain(&maintenance5Properties);
if (isExtensionSupported(VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME))
Expand Down Expand Up @@ -726,6 +729,7 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT shaderImageAtomicInt64Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT };
VkPhysicalDeviceIndexTypeUint8FeaturesEXT indexTypeUint8Features = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT };
VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR pipelineExecutablePropertiesFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR };
VkPhysicalDeviceHostImageCopyFeaturesEXT hostImageCopyFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT };
VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV deviceGeneratedCommandsFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV };
VkPhysicalDeviceDeviceMemoryReportFeaturesEXT deviceMemoryReportFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT };
VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD shaderEarlyAndLateFragmentTestsFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD };
Expand Down Expand Up @@ -785,6 +789,8 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
addToPNextChain(&indexTypeUint8Features);
if (isExtensionSupported(VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME))
addToPNextChain(&pipelineExecutablePropertiesFeatures);
if (isExtensionSupported(VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME))
addToPNextChain(&hostImageCopyFeatures);
if (isExtensionSupported(VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME))
addToPNextChain(&deviceGeneratedCommandsFeatures);
if (isExtensionSupported(VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME))
Expand Down Expand Up @@ -1157,7 +1163,6 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart

if (isExtensionSupported(VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME))
features.pipelineExecutableInfo = pipelineExecutablePropertiesFeatures.pipelineExecutableInfo;

if (isExtensionSupported(VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME))
features.deviceGeneratedCommands = deviceGeneratedCommandsFeatures.deviceGeneratedCommands;

Expand Down Expand Up @@ -1221,6 +1226,8 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
properties.limits.shaderImageFloat32AtomicMinMax = shaderAtomicFloat2Features.shaderImageFloat32AtomicMinMax;
properties.limits.sparseImageFloat32AtomicMinMax = shaderAtomicFloat2Features.sparseImageFloat32AtomicMinMax;
}
if (isExtensionSupported(VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME))
properties.limits.hostImageCopy = hostImageCopyFeatures.hostImageCopy;

if (isExtensionSupported(VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME))
properties.limits.deviceMemoryReport = deviceMemoryReportFeatures.deviceMemoryReport;
Expand Down Expand Up @@ -1332,7 +1339,9 @@ std::unique_ptr<CVulkanPhysicalDevice> CVulkanPhysicalDevice::create(core::smart
retval.storageImageLoadWithoutFormat = anyFlag(features, VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT);
retval.storageImageStoreWithoutFormat = anyFlag(features, VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT);
retval.depthCompareSampledImage = anyFlag(features, VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT);
// retval.hostImageTransfer = anyFlag(features, VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT);
//Not sure to remove this?
// retval.hostImageTransfer = anyFlag(features, VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT);
retval.hostImageTransfer = anyFlag(features, VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT);
Comment on lines +1342 to +1344
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we need to report because not every format suports

//retval.log2MaxSmples = ; // Todo(Erfan)
return retval;
};
Expand Down Expand Up @@ -1588,6 +1597,9 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic
VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR pipelineExecutablePropertiesFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR,nullptr };
REQUIRE_EXTENSION_IF(enabledFeatures.pipelineExecutableInfo,VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME,&pipelineExecutablePropertiesFeatures);

VkPhysicalDeviceHostImageCopyFeaturesEXT hostImageCopyFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT,nullptr };
REQUIRE_EXTENSION_IF(limits.hostImageCopy,VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME,&hostImageCopyFeatures);

VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV deviceGeneratedCommandsFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV,nullptr };
REQUIRE_EXTENSION_IF(enabledFeatures.deviceGeneratedCommands,VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME,&deviceGeneratedCommandsFeatures);

Expand Down Expand Up @@ -1875,6 +1887,8 @@ core::smart_refctd_ptr<ILogicalDevice> CVulkanPhysicalDevice::createLogicalDevic

pipelineExecutablePropertiesFeatures.pipelineExecutableInfo = enabledFeatures.pipelineExecutableInfo;

hostImageCopyFeatures.hostImageCopy = limits.hostImageCopy;

deviceGeneratedCommandsFeatures.deviceGeneratedCommands = enabledFeatures.deviceGeneratedCommands;

//deviceMemoryReportFeatures [LIMIT SO ENABLE EVERYTHING BY DEFAULT]
Expand Down
Loading
Loading