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
54 changes: 52 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,48 @@ 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 SImageToMemoryCopy
{
inline const auto& getSrcSubresource() const {return imageSubresource;}
inline const VkOffset3D& getSrcOffset() const {return imageOffset;}
inline const VkExtent3D& getExtent() const {return imageExtent;}

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 SImageToMemoryCopy&) const = default;
};
struct SImageCopy
{
inline bool isValid() const
Expand Down Expand Up @@ -846,6 +895,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
28 changes: 28 additions & 0 deletions include/nbl/video/CVulkanCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,32 @@ inline VkImageLayout getVkImageLayoutFromImageLayout(asset::IImage::LAYOUT in)
}
}

inline asset::IImage::LAYOUT getImageLayoutFromVkImageLayout(VkImageLayout in)
{
using layout_t = asset::IImage::LAYOUT;
switch (in)
{
case VK_IMAGE_LAYOUT_GENERAL:
return layout_t::GENERAL;
case VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL:
return layout_t::READ_ONLY_OPTIMAL;
case VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL:
return layout_t::ATTACHMENT_OPTIMAL;
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
return layout_t::TRANSFER_SRC_OPTIMAL;
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
return layout_t::TRANSFER_DST_OPTIMAL;
case VK_IMAGE_LAYOUT_PREINITIALIZED:
return layout_t::PREINITIALIZED;
case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
return layout_t::PRESENT_SRC;
case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
return layout_t::SHARED_PRESENT;
default:
return layout_t::UNDEFINED;
}
}

inline VkColorSpaceKHR getVkColorSpaceKHRFromColorSpace(ISurface::SColorSpace in)
{
if (in.primary == asset::ECP_SRGB && in.eotf == asset::EOTF_sRGB)
Expand Down Expand Up @@ -791,6 +817,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 +833,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
27 changes: 25 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,22 @@ 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 thread
Erfan-Ahmadi marked this conversation as resolved.
// https://docs.vulkan.org/refpages/latest/refpages/source/vkCopyImageToMemory.html
bool copyImageToMemory(IGPUImage* const srcImage, const IGPUImage::LAYOUT srcImageLayout, const core::bitflag<IGPUImage::E_HOST_IMAGE_COPY_FLAGS> flags, const std::span<const IGPUImage::SImageToMemoryCopy> regions);
//https://docs.vulkan.org/refpages/latest/refpages/source/vkCopyImageToImage.html
bool copyImageToImage(IGPUImage* const srcImage, const IGPUImage::LAYOUT srcImageLayout, IGPUImage* const dstImage, const IGPUImage::LAYOUT dstImageLayout, const core::bitflag<IGPUImage::E_HOST_IMAGE_COPY_FLAGS> flags, const std::span<const IGPUImage::SImageCopy> regions);

struct SImageLayoutTransition
{
IGPUImage* image = nullptr;
IGPUImage::LAYOUT oldLayout = IGPUImage::LAYOUT::UNDEFINED;
IGPUImage::LAYOUT newLayout = IGPUImage::LAYOUT::UNDEFINED;
IGPUImage::SSubresourceRange subresourceRange = {};
};
// https://docs.vulkan.org/refpages/latest/refpages/source/vkTransitionImageLayout.html
bool transitionImageLayout(const std::span<const SImageLayoutTransition> transitions);

//! Shaders
struct SShaderCreationParameters
Expand Down Expand Up @@ -1134,6 +1151,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 +1197,11 @@ 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;
virtual bool copyImageToMemory_impl(IGPUImage* const srcImage, const IGPUImage::LAYOUT srcImageLayout, const core::bitflag<IGPUImage::E_HOST_IMAGE_COPY_FLAGS> flags, const std::span<const IGPUImage::SImageToMemoryCopy> regions) = 0;
virtual bool copyImageToImage_impl(IGPUImage* const srcImage, const IGPUImage::LAYOUT srcImageLayout, IGPUImage* const dstImage, const IGPUImage::LAYOUT dstImageLayout, const core::bitflag<IGPUImage::E_HOST_IMAGE_COPY_FLAGS> flags, const std::span<const IGPUImage::SImageCopy> regions) = 0;
virtual bool transitionImageLayout_impl(const std::span<const SImageLayoutTransition> transitions) = 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 +1647,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_
15 changes: 14 additions & 1 deletion include/nbl/video/IPhysicalDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,16 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
APIVersion getAPIVersion() const { return m_initData.properties.apiVersion; }
const SFeatures& getFeatures() const { return m_initData.features; }

struct SHostImageCopyProperties
{
uint64_t copySrcLayouts = 0ull;
uint64_t copyDstLayouts = 0ull;
uint8_t optimalTilingLayoutUUID[VK_UUID_SIZE] = {};
bool identicalMemoryTypeRequirements = false;
};

const SHostImageCopyProperties& getHostImageCopyProperties() const { return m_initData.hostImageCopyProperties; }

struct MemoryType
{
core::bitflag<IDeviceMemoryAllocation::E_MEMORY_PROPERTY_FLAGS> propertyFlags = IDeviceMemoryAllocation::EMPF_NONE;
Expand Down Expand Up @@ -443,7 +453,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 +465,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 Expand Up @@ -672,6 +684,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable

SProperties properties = {};
SFeatures features = {};
SHostImageCopyProperties hostImageCopyProperties = {};
SMemoryProperties memoryProperties = {};

using qfam_props_array_t = core::smart_refctd_dynamic_array<const SQueueFamilyProperties>;
Expand Down
Loading
Loading