summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/gfx/debug-layer/debug-helper-functions.cpp4
-rw-r--r--tools/gfx/vulkan/vk-api.h19
-rw-r--r--tools/gfx/vulkan/vk-device.cpp90
-rw-r--r--tools/gfx/vulkan/vk-device.h5
-rw-r--r--tools/gfx/vulkan/vk-fence.cpp2
-rw-r--r--tools/gfx/vulkan/vk-shader-table.cpp6
6 files changed, 56 insertions, 70 deletions
diff --git a/tools/gfx/debug-layer/debug-helper-functions.cpp b/tools/gfx/debug-layer/debug-helper-functions.cpp
index e7c4e0246..e75d0a3c3 100644
--- a/tools/gfx/debug-layer/debug-helper-functions.cpp
+++ b/tools/gfx/debug-layer/debug-helper-functions.cpp
@@ -53,14 +53,14 @@ void validateAccelerationStructureBuildInputs(
case IAccelerationStructure::Kind::TopLevel:
if (!buildInputs.instanceDescs)
{
- GFX_DIAGNOSE_ERROR("IAccelerationStructure::BuildInputs::instanceDescs cannot be null "
+ GFX_DIAGNOSE_WARNING("IAccelerationStructure::BuildInputs::instanceDescs is null "
"when creating a top-level acceleration structure.");
}
break;
case IAccelerationStructure::Kind::BottomLevel:
if (!buildInputs.geometryDescs)
{
- GFX_DIAGNOSE_ERROR("IAccelerationStructure::BuildInputs::geometryDescs cannot be null "
+ GFX_DIAGNOSE_WARNING("IAccelerationStructure::BuildInputs::geometryDescs is null "
"when creating a bottom-level acceleration structure.");
}
for (int i = 0; i < buildInputs.descCount; i++)
diff --git a/tools/gfx/vulkan/vk-api.h b/tools/gfx/vulkan/vk-api.h
index c34372f45..f4caa8251 100644
--- a/tools/gfx/vulkan/vk-api.h
+++ b/tools/gfx/vulkan/vk-api.h
@@ -230,27 +230,15 @@ namespace gfx {
struct VulkanExtendedFeatureProperties
{
- // Float16 features
- VkPhysicalDeviceFloat16Int8FeaturesKHR float16Features = {
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR};
// 16 bit storage features
VkPhysicalDevice16BitStorageFeatures storage16BitFeatures = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR};
- // AtomicInt64 features
- VkPhysicalDeviceShaderAtomicInt64FeaturesKHR atomicInt64Features = {
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR};
// Atomic Float features
VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomicFloatFeatures = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT};
- // Timeline Semaphore features
- VkPhysicalDeviceTimelineSemaphoreFeatures timelineFeatures = {
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES};
// Extended dynamic state features
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT};
- // Subgroup extended type features
- VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures shaderSubgroupExtendedTypeFeatures = {
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES};
// Acceleration structure features
VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR};
@@ -261,9 +249,6 @@ struct VulkanExtendedFeatureProperties
// Ray query (inline ray-tracing) features
VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR};
- // Buffer device address features
- VkPhysicalDeviceBufferDeviceAddressFeatures bufferDeviceAddressFeatures = {
- VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES};
// Inline uniform block features
VkPhysicalDeviceInlineUniformBlockFeaturesEXT inlineUniformBlockFeatures = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT};
@@ -275,6 +260,10 @@ struct VulkanExtendedFeatureProperties
VkPhysicalDeviceShaderClockFeaturesKHR clockFeatures = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR
};
+
+ // Vulkan 1.2 features.
+ VkPhysicalDeviceVulkan12Features vulkan12Features = {
+ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES};
};
struct VulkanApi
diff --git a/tools/gfx/vulkan/vk-device.cpp b/tools/gfx/vulkan/vk-device.cpp
index b9dbb264f..b9ae23b15 100644
--- a/tools/gfx/vulkan/vk-device.cpp
+++ b/tools/gfx/vulkan/vk-device.cpp
@@ -124,6 +124,15 @@ Result DeviceImpl::getNativeDeviceHandles(InteropHandles* outHandles)
return SLANG_OK;
}
+template<typename T>
+static bool _hasAnySetBits(const T& val, size_t offset)
+{
+ const uint8_t* ptr = reinterpret_cast<const uint8_t*>(&val);
+ for (size_t i = offset; i < sizeof(val); i++)
+ if (ptr[i]) return true;
+ return false;
+}
+
Result DeviceImpl::initVulkanInstanceAndDevice(
const InteropHandle* handles, bool useValidationLayer)
{
@@ -380,10 +389,6 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
extendedFeatures.inlineUniformBlockFeatures.pNext = deviceFeatures2.pNext;
deviceFeatures2.pNext = &extendedFeatures.inlineUniformBlockFeatures;
- // Buffer device address features
- extendedFeatures.bufferDeviceAddressFeatures.pNext = deviceFeatures2.pNext;
- deviceFeatures2.pNext = &extendedFeatures.bufferDeviceAddressFeatures;
-
// Ray query features
extendedFeatures.rayQueryFeatures.pNext = deviceFeatures2.pNext;
deviceFeatures2.pNext = &extendedFeatures.rayQueryFeatures;
@@ -396,30 +401,14 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
extendedFeatures.accelerationStructureFeatures.pNext = deviceFeatures2.pNext;
deviceFeatures2.pNext = &extendedFeatures.accelerationStructureFeatures;
- // Subgroup features
- extendedFeatures.shaderSubgroupExtendedTypeFeatures.pNext = deviceFeatures2.pNext;
- deviceFeatures2.pNext = &extendedFeatures.shaderSubgroupExtendedTypeFeatures;
-
// Extended dynamic states
extendedFeatures.extendedDynamicStateFeatures.pNext = deviceFeatures2.pNext;
deviceFeatures2.pNext = &extendedFeatures.extendedDynamicStateFeatures;
- // Timeline Semaphore
- extendedFeatures.timelineFeatures.pNext = deviceFeatures2.pNext;
- deviceFeatures2.pNext = &extendedFeatures.timelineFeatures;
-
- // Float16
- extendedFeatures.float16Features.pNext = deviceFeatures2.pNext;
- deviceFeatures2.pNext = &extendedFeatures.float16Features;
-
// 16-bit storage
extendedFeatures.storage16BitFeatures.pNext = deviceFeatures2.pNext;
deviceFeatures2.pNext = &extendedFeatures.storage16BitFeatures;
- // Atomic64
- extendedFeatures.atomicInt64Features.pNext = deviceFeatures2.pNext;
- deviceFeatures2.pNext = &extendedFeatures.atomicInt64Features;
-
// robustness2 features
extendedFeatures.robustness2Features.pNext = deviceFeatures2.pNext;
deviceFeatures2.pNext = &extendedFeatures.robustness2Features;
@@ -435,6 +424,12 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
extendedFeatures.atomicFloatFeatures.pNext = deviceFeatures2.pNext;
deviceFeatures2.pNext = &extendedFeatures.atomicFloatFeatures;
+ if (VK_MAKE_VERSION(majorVersion, minorVersion, 0) >= VK_API_VERSION_1_2)
+ {
+ extendedFeatures.vulkan12Features.pNext = deviceFeatures2.pNext;
+ deviceFeatures2.pNext = &extendedFeatures.vulkan12Features;
+ }
+
m_api.vkGetPhysicalDeviceFeatures2(m_api.m_physicalDevice, &deviceFeatures2);
if (deviceFeatures2.features.shaderResourceMinLod)
@@ -454,15 +449,8 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
m_features.add("int16");
}
// If we have float16 features then enable
- if (extendedFeatures.float16Features.shaderFloat16)
+ if (extendedFeatures.vulkan12Features.shaderFloat16)
{
- // Link into the creation features
- extendedFeatures.float16Features.pNext = (void*)deviceCreateInfo.pNext;
- deviceCreateInfo.pNext = &extendedFeatures.float16Features;
-
- // Add the Float16 extension
- deviceExtensions.add(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME);
-
// We have half support
m_features.add("half");
}
@@ -480,13 +468,8 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
m_features.add("16-bit-storage");
}
- if (extendedFeatures.atomicInt64Features.shaderBufferInt64Atomics)
+ if (extendedFeatures.vulkan12Features.shaderBufferInt64Atomics)
{
- // Link into the creation features
- extendedFeatures.atomicInt64Features.pNext = (void*)deviceCreateInfo.pNext;
- deviceCreateInfo.pNext = &extendedFeatures.atomicInt64Features;
-
- deviceExtensions.add(VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME);
m_features.add("atomic-int64");
}
@@ -500,12 +483,8 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
m_features.add("atomic-float");
}
- if (extendedFeatures.timelineFeatures.timelineSemaphore)
+ if (extendedFeatures.vulkan12Features.timelineSemaphore)
{
- // Link into the creation features
- extendedFeatures.timelineFeatures.pNext = (void*)deviceCreateInfo.pNext;
- deviceCreateInfo.pNext = &extendedFeatures.timelineFeatures;
- deviceExtensions.add(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME);
m_features.add("timeline-semaphore");
}
@@ -518,12 +497,8 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
m_features.add("extended-dynamic-states");
}
- if (extendedFeatures.shaderSubgroupExtendedTypeFeatures.shaderSubgroupExtendedTypes)
+ if (extendedFeatures.vulkan12Features.shaderSubgroupExtendedTypes)
{
- extendedFeatures.shaderSubgroupExtendedTypeFeatures.pNext =
- (void*)deviceCreateInfo.pNext;
- deviceCreateInfo.pNext = &extendedFeatures.shaderSubgroupExtendedTypeFeatures;
- deviceExtensions.add(VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME);
m_features.add("shader-subgroup-extended-types");
}
@@ -554,12 +529,8 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
m_features.add("sm_6_6");
}
- if (extendedFeatures.bufferDeviceAddressFeatures.bufferDeviceAddress)
+ if (extendedFeatures.vulkan12Features.bufferDeviceAddress)
{
- extendedFeatures.bufferDeviceAddressFeatures.pNext = (void*)deviceCreateInfo.pNext;
- deviceCreateInfo.pNext = &extendedFeatures.bufferDeviceAddressFeatures;
- deviceExtensions.add(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
-
m_features.add("buffer-device-address");
}
@@ -589,6 +560,14 @@ Result DeviceImpl::initVulkanInstanceAndDevice(
m_features.add("realtime-clock");
}
+ if (_hasAnySetBits(
+ extendedFeatures.vulkan12Features,
+ offsetof(VkPhysicalDeviceVulkan12Features, pNext) + sizeof(void*)))
+ {
+ extendedFeatures.vulkan12Features.pNext = (void*)deviceCreateInfo.pNext;
+ deviceCreateInfo.pNext = &extendedFeatures.vulkan12Features;
+ }
+
VkPhysicalDeviceProperties2 extendedProps = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 };
VkPhysicalDeviceRayTracingPipelinePropertiesKHR rtProps = {
@@ -1505,14 +1484,23 @@ Result DeviceImpl::createTextureResource(
Result DeviceImpl::createBufferResource(
const IBufferResource::Desc& descIn, const void* initData, IBufferResource** outResource)
{
+ return createBufferResourceImpl(descIn, 0, initData, outResource);
+}
+
+Result DeviceImpl::createBufferResourceImpl(
+ const IBufferResource::Desc& descIn,
+ VkBufferUsageFlags additionalUsageFlag,
+ const void* initData,
+ IBufferResource** outResource)
+{
BufferResource::Desc desc = fixupBufferDesc(descIn);
const Size bufferSize = desc.sizeInBytes;
VkMemoryPropertyFlags reqMemoryProperties = 0;
- VkBufferUsageFlags usage = _calcBufferUsageFlags(desc.allowedStates);
- if (m_api.m_extendedFeatures.bufferDeviceAddressFeatures.bufferDeviceAddress)
+ VkBufferUsageFlags usage = _calcBufferUsageFlags(desc.allowedStates) | additionalUsageFlag;
+ if (m_api.m_extendedFeatures.vulkan12Features.bufferDeviceAddress)
{
usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
}
diff --git a/tools/gfx/vulkan/vk-device.h b/tools/gfx/vulkan/vk-device.h
index 462ba79c2..9731fd1d4 100644
--- a/tools/gfx/vulkan/vk-device.h
+++ b/tools/gfx/vulkan/vk-device.h
@@ -40,6 +40,11 @@ public:
const IBufferResource::Desc& desc,
const void* initData,
IBufferResource** outResource) override;
+ SLANG_NO_THROW Result SLANG_MCALL createBufferResourceImpl(
+ const IBufferResource::Desc& desc,
+ VkBufferUsageFlags additionalUsageFlag,
+ const void* initData,
+ IBufferResource** outResource);
virtual SLANG_NO_THROW Result SLANG_MCALL createBufferFromNativeHandle(
InteropHandle handle,
const IBufferResource::Desc& srcDesc,
diff --git a/tools/gfx/vulkan/vk-fence.cpp b/tools/gfx/vulkan/vk-fence.cpp
index ce4d29a0c..0cef86a13 100644
--- a/tools/gfx/vulkan/vk-fence.cpp
+++ b/tools/gfx/vulkan/vk-fence.cpp
@@ -26,7 +26,7 @@ FenceImpl::~FenceImpl()
Result FenceImpl::init(const IFence::Desc& desc)
{
- if (!m_device->m_api.m_extendedFeatures.timelineFeatures.timelineSemaphore)
+ if (!m_device->m_api.m_extendedFeatures.vulkan12Features.timelineSemaphore)
return SLANG_E_NOT_AVAILABLE;
VkSemaphoreTypeCreateInfo timelineCreateInfo;
diff --git a/tools/gfx/vulkan/vk-shader-table.cpp b/tools/gfx/vulkan/vk-shader-table.cpp
index f40331432..0b6488465 100644
--- a/tools/gfx/vulkan/vk-shader-table.cpp
+++ b/tools/gfx/vulkan/vk-shader-table.cpp
@@ -39,7 +39,11 @@ RefPtr<BufferResource> ShaderTableImpl::createDeviceBuffer(
ResourceStateSet(ResourceState::General, ResourceState::CopyDestination);
bufferDesc.type = IResource::Type::Buffer;
bufferDesc.sizeInBytes = tableSize;
- m_device->createBufferResource(bufferDesc, nullptr, bufferResource.writeRef());
+ static_cast<vk::DeviceImpl*>(m_device)->createBufferResourceImpl(
+ bufferDesc,
+ VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR,
+ nullptr,
+ bufferResource.writeRef());
TransientResourceHeapImpl* transientHeapImpl =
static_cast<TransientResourceHeapImpl*>(transientHeap);