@@ -105,16 +105,19 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
105
105
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-srcStageMask-03854
106
106
constexpr auto HostBit = asset::PIPELINE_STAGE_FLAGS::HOST_BIT;
107
107
if (barrier.dep .srcStageMask .hasFlags (HostBit)||barrier.dep .dstStageMask .hasFlags (HostBit))
108
+ m_logger.log (" Source and destination queue family index should be equal, HOST_BIT is set [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
108
109
return false ;
109
110
// spec doesn't require it now, but we do
110
111
switch (barrier.ownershipOp )
111
112
{
112
113
case IGPUCommandBuffer::SOwnershipTransferBarrier::OWNERSHIP_OP::ACQUIRE:
113
114
if (barrier.dep .srcStageMask || barrier.dep .srcAccessMask )
115
+ m_logger.log (" Ownership operation ACQUIRE requires, srcStageMask and srcAccessMask being set to 0, in [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
114
116
return false ;
115
117
break ;
116
118
case IGPUCommandBuffer::SOwnershipTransferBarrier::OWNERSHIP_OP::RELEASE:
117
119
if (barrier.dep .dstStageMask || barrier.dep .dstAccessMask )
120
+ m_logger.log (" Ownership operation RELEASE requires, dstStageMask and dstAccessMask being set to 0, in [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
118
121
return false ;
119
122
break ;
120
123
default :
@@ -134,12 +137,15 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
134
137
const auto & range = barrier.range ;
135
138
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier2-buffer-parameter
136
139
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier2-offset-01188
137
- if (!range.buffer || range.size ==0u )
140
+ if (!range.buffer || range.size == 0u ) {
141
+ m_logger.log (" No buffer was specified [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
138
142
return false ;
143
+ }
139
144
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier2-offset-01187
140
145
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier2-offset-01189
141
146
const size_t remain = range.size !=IGPUCommandBuffer::SBufferMemoryBarrier<ResourceBarrier>{}.range .size ? range.size :1ull ;
142
147
if (range.offset +remain>range.buffer ->getSize ())
148
+ m_logger.log (" Invalid range was specified [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
143
149
return false ;
144
150
145
151
if constexpr (std::is_same_v<IGPUCommandBuffer::SOwnershipTransferBarrier,ResourceBarrier>)
@@ -1030,38 +1036,54 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
1030
1036
template <typename CreationParams, typename ExtraLambda>
1031
1037
inline CreationParams::SSpecializationValidationResult commonCreatePipelines (IGPUPipelineCache* const pipelineCache, const std::span<const CreationParams> params, ExtraLambda&& extra)
1032
1038
{
1033
- if (pipelineCache && !pipelineCache->wasCreatedBy (this ))
1039
+ if (pipelineCache && !pipelineCache->wasCreatedBy (this )) {
1040
+ m_logger.log (" Invalid pipelineCache was given [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1034
1041
return {};
1035
- if (params.empty ())
1042
+ }
1043
+ if (params.empty ()) {
1044
+ m_logger.log (" No parameters were given [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1036
1045
return {};
1046
+ }
1037
1047
1038
1048
typename CreationParams::SSpecializationValidationResult retval = {.count =0 ,.dataSize =0 };
1039
1049
for (auto i=0 ; i<params.size (); i++)
1040
1050
{
1041
1051
const auto & ci = params[i];
1042
1052
1043
1053
const auto validation = ci.valid ();
1044
- if (!validation)
1054
+ if (!validation) {
1055
+ m_logger.log (" Invalid parameters were given (params[%d]) [%s - %s:%p]" , system::ILogger::ELL_ERROR, i, __FUNCTION__, __FILE__, __LINE__);
1045
1056
return {};
1057
+ }
1046
1058
1047
- if (!ci.layout ->wasCreatedBy (this ))
1059
+ if (!ci.layout ->wasCreatedBy (this )) {
1060
+ m_logger.log (" Invalid layout was given (params[%d]) [%s - %s:%p]" , system::ILogger::ELL_ERROR, i, __FUNCTION__, __FILE__, __LINE__);
1048
1061
return {};
1062
+ }
1049
1063
1050
1064
constexpr auto AllowDerivativesFlag = CreationParams::FLAGS::ALLOW_DERIVATIVES;
1051
1065
if (ci.basePipeline )
1052
1066
{
1053
- if (!ci.basePipeline ->wasCreatedBy (this ))
1067
+ if (!ci.basePipeline ->wasCreatedBy (this )) {
1068
+ m_logger.log (" Invalid basePipeline was specified (params[%d]) [%s - %s:%p]" , system::ILogger::ELL_ERROR, i, __FUNCTION__, __FILE__, __LINE__);
1054
1069
return {};
1055
- if (!ci.basePipeline ->getCreationFlags ().hasFlags (AllowDerivativesFlag))
1070
+ }
1071
+ if (!ci.basePipeline ->getCreationFlags ().hasFlags (AllowDerivativesFlag)) {
1072
+ m_logger.log (" Invalid basePipeline was specified (params[%d]) [%s - %s:%p]" , system::ILogger::ELL_ERROR, i, __FUNCTION__, __FILE__, __LINE__);
1056
1073
return {};
1074
+ }
1057
1075
}
1058
1076
// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkComputePipelineCreateInfo.html#VUID-VkComputePipelineCreateInfo-flags-07985
1059
- else if (ci.basePipelineIndex <-1 || ci.basePipelineIndex >=i || ci.basePipelineIndex >=0 && !params[ci.basePipelineIndex ].flags .hasFlags (AllowDerivativesFlag))
1077
+ else if (ci.basePipelineIndex < -1 || ci.basePipelineIndex >= i || ci.basePipelineIndex >= 0 && !params[ci.basePipelineIndex ].flags .hasFlags (AllowDerivativesFlag)) {
1078
+ m_logger.log (" Invalid basePipeline was specified (params[%d]) [%s - %s:%p]" , system::ILogger::ELL_ERROR, i, __FUNCTION__, __FILE__, __LINE__);
1060
1079
return {};
1080
+ }
1061
1081
1062
1082
for (auto info : ci.getShaders ())
1063
- if (info.shader && !extra (info))
1064
- return {};
1083
+ if (info.shader && !extra (info)) {
1084
+ m_logger.log (" Invalid shader were specified (params[%d]) [%s - %s:%p]" , system::ILogger::ELL_ERROR, i, __FUNCTION__, __FILE__, __LINE__);
1085
+ return {};
1086
+ }
1065
1087
1066
1088
retval += validation;
1067
1089
}
@@ -1158,30 +1180,44 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
1158
1180
1159
1181
inline bool invalidCreationParams (const IGPUAccelerationStructure::SCreationParams& params)
1160
1182
{
1161
- if (!getEnabledFeatures ().accelerationStructure )
1183
+ if (!getEnabledFeatures ().accelerationStructure ) {
1184
+ m_logger.log (" Acceleration structure feature is not enabled [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1162
1185
return true ;
1186
+ }
1163
1187
constexpr size_t MinAlignment = 256u ;
1164
- if (!params.bufferRange .isValid () || !params.bufferRange .buffer ->wasCreatedBy (this ) || (params.bufferRange .offset &(MinAlignment-1 ))!=0u )
1188
+ if (!params.bufferRange .isValid () || !params.bufferRange .buffer ->wasCreatedBy (this ) || (params.bufferRange .offset & (MinAlignment - 1 )) != 0u ) {
1189
+ m_logger.log (" Invalid bufferRange was given [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1165
1190
return true ;
1191
+ }
1166
1192
const auto bufferUsages = params.bufferRange .buffer ->getCreationParams ().usage ;
1167
- if (!bufferUsages.hasFlags (IGPUBuffer::EUF_ACCELERATION_STRUCTURE_STORAGE_BIT))
1193
+ if (!bufferUsages.hasFlags (IGPUBuffer::EUF_ACCELERATION_STRUCTURE_STORAGE_BIT)) {
1194
+ m_logger.log (" Invalid bufferRange was given [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1168
1195
return true ;
1169
- if (params.flags .hasFlags (IGPUAccelerationStructure::SCreationParams::FLAGS::MOTION_BIT) && !getEnabledFeatures ().rayTracingMotionBlur )
1196
+ }
1197
+ if (params.flags .hasFlags (IGPUAccelerationStructure::SCreationParams::FLAGS::MOTION_BIT) && !getEnabledFeatures ().rayTracingMotionBlur ) {
1198
+ m_logger.log (" Ray tracing motion blur feature is not enabled [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1170
1199
return true ;
1200
+ }
1171
1201
return false ;
1172
1202
}
1173
1203
template <class BufferType >
1174
1204
bool invalidFeaturesForASBuild (const bool motionBlur) const
1175
1205
{
1176
1206
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureBuildSizesKHR-accelerationStructure-08933
1177
- if (!m_enabledFeatures.accelerationStructure )
1207
+ if (!m_enabledFeatures.accelerationStructure ) {
1208
+ m_logger.log (" Acceleration structure feature is not enabled [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1178
1209
return true ;
1210
+ }
1179
1211
// not sure of VUID
1180
- if (std::is_same_v<BufferType,asset::ICPUBuffer> && !m_enabledFeatures.accelerationStructureHostCommands )
1212
+ if (std::is_same_v<BufferType, asset::ICPUBuffer> && !m_enabledFeatures.accelerationStructureHostCommands ) {
1213
+ m_logger.log (" Acceleration structure host commands feature is not enabled [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1181
1214
return true ;
1215
+ }
1182
1216
// not sure of VUID
1183
- if (motionBlur && !m_enabledFeatures.rayTracingMotionBlur )
1217
+ if (motionBlur && !m_enabledFeatures.rayTracingMotionBlur ) {
1218
+ m_logger.log (" Ray tracing motion blur feature is not enabled [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1184
1219
return true ;
1220
+ }
1185
1221
1186
1222
return false ;
1187
1223
}
@@ -1196,16 +1232,22 @@ template<typename ResourceBarrier>
1196
1232
inline bool ILogicalDevice::validateMemoryBarrier (const uint32_t queueFamilyIndex, const IGPUCommandBuffer::SImageMemoryBarrier<ResourceBarrier>& barrier) const
1197
1233
{
1198
1234
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-image-parameter
1199
- if (!barrier.image )
1235
+ if (!barrier.image ) {
1236
+ m_logger.log (" Invalid image handle [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1200
1237
return false ;
1238
+ }
1201
1239
const auto & params = barrier.image ->getCreationParameters ();
1202
1240
1203
1241
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-subresourceRange-01486
1204
- if (barrier.subresourceRange .baseMipLevel >=params.mipLevels )
1242
+ if (barrier.subresourceRange .baseMipLevel >= params.mipLevels ) {
1243
+ m_logger.log (" Invalid Mip level [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1205
1244
return false ;
1245
+ }
1206
1246
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-subresourceRange-01488
1207
- if (barrier.subresourceRange .baseArrayLayer >=params.arrayLayers )
1247
+ if (barrier.subresourceRange .baseArrayLayer >= params.arrayLayers ) {
1248
+ m_logger.log (" Invalid array layer [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1208
1249
return false ;
1250
+ }
1209
1251
// TODO: https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-subresourceRange-01724
1210
1252
// TODO: https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-subresourceRange-01725
1211
1253
@@ -1214,14 +1256,20 @@ inline bool ILogicalDevice::validateMemoryBarrier(const uint32_t queueFamilyInde
1214
1256
{
1215
1257
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-image-03319
1216
1258
constexpr auto DepthStencilAspects = IGPUImage::EAF_DEPTH_BIT|IGPUImage::EAF_STENCIL_BIT;
1217
- if (aspectMask.value &(~DepthStencilAspects))
1259
+ if (aspectMask.value & (~DepthStencilAspects)) {
1260
+ m_logger.log (" Invalid aspect mask [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1218
1261
return false ;
1219
- if (bool (aspectMask.value &DepthStencilAspects))
1262
+ }
1263
+ if (bool (aspectMask.value & DepthStencilAspects)) {
1264
+ m_logger.log (" Invalid aspect mask [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1220
1265
return false ;
1266
+ }
1221
1267
}
1222
1268
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-image-01671
1223
- else if (aspectMask!=IGPUImage::EAF_COLOR_BIT)
1269
+ else if (aspectMask != IGPUImage::EAF_COLOR_BIT) {
1270
+ m_logger.log (" Invalid aspect mask [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1224
1271
return false ;
1272
+ }
1225
1273
1226
1274
const bool layoutTransform = barrier.oldLayout !=barrier.newLayout ;
1227
1275
bool ownershipTransfer = false ;
@@ -1238,7 +1286,8 @@ inline bool ILogicalDevice::validateMemoryBarrier(const uint32_t queueFamilyInde
1238
1286
if (layoutTransform || ownershipTransfer)
1239
1287
{
1240
1288
const bool srcStageIsHost = inner->srcStageMask .hasFlags (asset::PIPELINE_STAGE_FLAGS::HOST_BIT);
1241
- auto mismatchedLayout = [¶ms,aspectMask,srcStageIsHost]<bool dst>(const IGPUImage::LAYOUT layout) -> bool
1289
+ const auto logger = m_logger.get ();
1290
+ auto mismatchedLayout = [¶ms,aspectMask,srcStageIsHost, logger]<bool dst>(const IGPUImage::LAYOUT layout) -> bool
1242
1291
{
1243
1292
switch (layout)
1244
1293
{
@@ -1256,42 +1305,66 @@ inline bool ILogicalDevice::validateMemoryBarrier(const uint32_t queueFamilyInde
1256
1305
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-aspectMask-08703
1257
1306
// and we check the following all at once:
1258
1307
case IGPUImage::LAYOUT::ATTACHMENT_OPTIMAL:
1259
- if (!dst && srcStageIsHost)
1308
+ if (!dst && srcStageIsHost) {
1309
+ logger->log (" Invalid srcStageMask, must not include HOST_BIT [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1260
1310
return true ;
1311
+ }
1261
1312
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-03938
1262
- if (aspectMask && !params.usage .hasFlags (IGPUImage::E_USAGE_FLAGS::EUF_RENDER_ATTACHMENT_BIT))
1313
+ if (aspectMask && !params.usage .hasFlags (IGPUImage::E_USAGE_FLAGS::EUF_RENDER_ATTACHMENT_BIT)) {
1314
+ logger->log (" Invalid image usage [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1263
1315
return true ;
1316
+ }
1264
1317
break ;
1265
1318
case IGPUImage::LAYOUT::READ_ONLY_OPTIMAL:
1266
- if (!dst && srcStageIsHost)
1319
+ if (!dst && srcStageIsHost) {
1320
+ logger->log (" Invalid srcStageMask, must not include HOST_BIT [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1267
1321
return true ;
1322
+ }
1268
1323
{
1269
1324
constexpr auto ValidUsages = IGPUImage::E_USAGE_FLAGS::EUF_SAMPLED_BIT|IGPUImage::E_USAGE_FLAGS::EUF_INPUT_ATTACHMENT_BIT;
1270
1325
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-oldLayout-01211
1271
1326
if (aspectMask.hasFlags (IGPUImage::EAF_STENCIL_BIT))
1272
1327
{
1273
- if (!bool (params.actualStencilUsage ()&ValidUsages))
1328
+ if (!bool (params.actualStencilUsage () & ValidUsages)) {
1329
+ logger->log (" Invalid stencil usages [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1274
1330
return true ;
1331
+ }
1275
1332
}
1276
- else if (!bool (params.usage &ValidUsages))
1333
+ else if (!bool (params.usage & ValidUsages)) {
1334
+ logger->log (" Invalid image usages [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1277
1335
return true ;
1336
+ }
1278
1337
}
1279
1338
break ;
1280
1339
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-oldLayout-01212
1281
1340
case IGPUImage::LAYOUT::TRANSFER_SRC_OPTIMAL:
1282
- if (!dst && srcStageIsHost || !params.usage .hasFlags (IGPUImage::E_USAGE_FLAGS::EUF_TRANSFER_SRC_BIT))
1341
+ if (!dst && srcStageIsHost) {
1342
+ logger->log (" Invalid srcStageMask, must not include HOST_BIT [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1283
1343
return true ;
1344
+ }
1345
+ if (!params.usage .hasFlags (IGPUImage::E_USAGE_FLAGS::EUF_TRANSFER_SRC_BIT)) {
1346
+ logger->log (" Invalid image usage [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1347
+ return true ;
1348
+ }
1284
1349
break ;
1285
1350
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-oldLayout-01213
1286
1351
case IGPUImage::LAYOUT::TRANSFER_DST_OPTIMAL:
1287
- if (!dst && srcStageIsHost || !params.usage .hasFlags (IGPUImage::E_USAGE_FLAGS::EUF_TRANSFER_DST_BIT))
1352
+ if (!dst && srcStageIsHost) {
1353
+ logger->log (" Invalid srcStageMask, must not include HOST_BIT [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1288
1354
return true ;
1355
+ }
1356
+ if (!params.usage .hasFlags (IGPUImage::E_USAGE_FLAGS::EUF_TRANSFER_DST_BIT)) {
1357
+ logger->log (" Invalid image usage [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1358
+ return true ;
1359
+ }
1289
1360
break ;
1290
1361
// https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-oldLayout-01198
1291
1362
case IGPUImage::LAYOUT::UNDEFINED: [[fallthrough]];
1292
1363
case IGPUImage::LAYOUT::PREINITIALIZED:
1293
- if constexpr (dst)
1364
+ if constexpr (dst) {
1365
+ logger->log (" Invalid newLayout [%s - %s:%p]" , system::ILogger::ELL_ERROR, __FUNCTION__, __FILE__, __LINE__);
1294
1366
return true ;
1367
+ }
1295
1368
break ;
1296
1369
// TODO: https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-oldLayout-02088
1297
1370
// TODO: https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-07006
0 commit comments