Skip to content

Commit ee3c62b

Browse files
make image usages constexpr, add some super cool utilities to device filter and Queue
1 parent 38b2d98 commit ee3c62b

File tree

3 files changed

+38
-25
lines changed

3 files changed

+38
-25
lines changed

include/nbl/video/IGPUQueue.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,19 @@ class IGPUQueue : public core::Interface, public core::Unmovable
6464
uint32_t getFamilyIndex() const { return m_familyIndex; }
6565
E_CREATE_FLAGS getFlags() const { return m_flags; }
6666

67+
// When dealing with external/foreign queues treat `other` as nullptr
68+
inline bool needsOwnershipTransfer(const IGPUQueue* other) const
69+
{
70+
if (!other)
71+
return true;
72+
73+
if (m_familyIndex==other->m_familyIndex)
74+
return false;
75+
76+
// TODO: take into account concurrent sharing indices, but then we'll need to remember the concurrent sharing family indices
77+
return true;
78+
}
79+
6780
inline constexpr static float DEFAULT_QUEUE_PRIORITY = 1.f;
6881

6982
// OpenGL: const egl::CEGL::Context*

include/nbl/video/IPhysicalDevice.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
392392
uint16_t transferDst : 1u;
393393
uint16_t log2MaxSamples : 3u; // 0 means cant use as a multisample image format
394394

395-
SUsage()
395+
constexpr SUsage()
396396
: sampledImage(0)
397397
, storageImage(0)
398398
, storageImageAtomic(0)
@@ -405,7 +405,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
405405
, log2MaxSamples(0)
406406
{}
407407

408-
SUsage(core::bitflag<asset::IImage::E_USAGE_FLAGS> usages):
408+
constexpr SUsage(core::bitflag<asset::IImage::E_USAGE_FLAGS> usages) :
409409
log2MaxSamples(0),
410410
sampledImage(usages.hasFlags(asset::IImage::EUF_SAMPLED_BIT)),
411411
storageImage(usages.hasFlags(asset::IImage::EUF_STORAGE_BIT)),
@@ -419,7 +419,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
419419
storageImageAtomic(0)
420420
{}
421421

422-
inline SUsage operator & (const SUsage& other) const
422+
constexpr SUsage operator&(const SUsage& other) const
423423
{
424424
SUsage result;
425425
result.sampledImage = sampledImage & other.sampledImage;
@@ -435,7 +435,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
435435
return result;
436436
}
437437

438-
inline SUsage operator | (const SUsage& other) const
438+
constexpr SUsage operator|(const SUsage& other) const
439439
{
440440
SUsage result;
441441
result.sampledImage = sampledImage | other.sampledImage;
@@ -451,7 +451,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
451451
return result;
452452
}
453453

454-
inline SUsage operator ^ (const SUsage& other) const
454+
constexpr SUsage operator^(const SUsage& other) const
455455
{
456456
SUsage result;
457457
result.sampledImage = sampledImage ^ other.sampledImage;
@@ -467,7 +467,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
467467
return result;
468468
}
469469

470-
inline bool operator<(const SUsage& other) const
470+
constexpr bool operator<(const SUsage& other) const
471471
{
472472
if (sampledImage && !other.sampledImage) return false;
473473
if (storageImage && !other.storageImage) return false;
@@ -482,7 +482,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
482482
return true;
483483
}
484484

485-
inline bool operator == (const SUsage& other) const
485+
constexpr bool operator==(const SUsage& other) const
486486
{
487487
return
488488
(sampledImage == other.sampledImage) &&
@@ -528,7 +528,7 @@ class NBL_API2 IPhysicalDevice : public core::Interface, public core::Unmovable
528528
EQF_NONE = 0,
529529
EQF_GRAPHICS_BIT = 0x01,
530530
EQF_COMPUTE_BIT = 0x02,
531-
EQF_TRANSFER_BIT = 0x04,
531+
EQF_TRANSFER_BIT = 0x04, // TODO: investigate whether GRAPHICS or COMPUTE can NOT report TRANSFER at the same time
532532
EQF_SPARSE_BINDING_BIT = 0x08,
533533
EQF_PROTECTED_BIT = 0x10
534534
};

include/nbl/video/utilities/SPhysicalDeviceFilter.h

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ namespace nbl::video
2727

2828
struct QueueRequirement
2929
{
30+
inline bool familyMatches(const IPhysicalDevice::SQueueFamilyProperties& props) const
31+
{
32+
if (!props.queueFlags.hasFlags(requiredFlags))
33+
return false;
34+
35+
// doesn't have disallowed flags
36+
if ((props.queueFlags&disallowedFlags).value)
37+
return false;
38+
39+
return maxImageTransferGranularity.width >= props.minImageTransferGranularity.width &&
40+
maxImageTransferGranularity.height >= props.minImageTransferGranularity.height &&
41+
maxImageTransferGranularity.depth >= props.minImageTransferGranularity.depth;
42+
}
43+
3044
core::bitflag<IPhysicalDevice::E_QUEUE_FLAGS> requiredFlags = IPhysicalDevice::E_QUEUE_FLAGS::EQF_NONE;
3145
core::bitflag<IPhysicalDevice::E_QUEUE_FLAGS> disallowedFlags = IPhysicalDevice::E_QUEUE_FLAGS::EQF_NONE;
3246
uint32_t queueCount = 0u;
@@ -160,25 +174,11 @@ namespace nbl::video
160174
for (uint32_t qfam = 0; qfam < queueProps.size(); ++qfam)
161175
{
162176
const auto& queueFamilyProps = queueProps[qfam];
163-
164-
// has requiredFlags
165-
if (queueFamilyProps.queueFlags.hasFlags(queueReqs.requiredFlags))
166-
{
167-
// doesn't have disallowed flags
168-
if ((queueFamilyProps.queueFlags & queueReqs.disallowedFlags).value == 0)
169-
{
170-
// imageTransferGranularity
171-
if (queueReqs.maxImageTransferGranularity.width >= queueFamilyProps.minImageTransferGranularity.width &&
172-
queueReqs.maxImageTransferGranularity.height >= queueFamilyProps.minImageTransferGranularity.height &&
173-
queueReqs.maxImageTransferGranularity.depth >= queueFamilyProps.minImageTransferGranularity.depth)
174-
{
175-
queueCount = (queueFamilyProps.queueCount > queueCount) ? 0ull : queueCount - queueFamilyProps.queueCount;
176-
}
177-
}
178-
}
177+
if (queueReqs.familyMatches(queueFamilyProps))
178+
queueCount -= core::min(queueFamilyProps.queueCount,queueCount);
179179
}
180180

181-
if (queueCount > 0)
181+
if (queueCount>0)
182182
return false;
183183
}
184184

0 commit comments

Comments
 (0)