Skip to content

Commit ae6a4a5

Browse files
committed
merge master, fix conflicts
2 parents ff83045 + 2dce27d commit ae6a4a5

14 files changed

+404
-119
lines changed

include/nbl/asset/ICPURayTracingPipeline.h

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ class ICPURayTracingPipeline final : public ICPUPipeline<IRayTracingPipeline<ICP
2525
core::vector<SShaderSpecInfo> intersections;
2626
};
2727

28-
static core::smart_refctd_ptr<ICPURayTracingPipeline> create(const ICPUPipelineLayout* layout)
28+
static core::smart_refctd_ptr<ICPURayTracingPipeline> create(ICPUPipelineLayout* layout)
2929
{
3030
auto retval = new ICPURayTracingPipeline(layout);
3131
return core::smart_refctd_ptr<ICPURayTracingPipeline>(retval,core::dont_grab);
3232
}
3333

34-
35-
3634
constexpr static inline auto AssetType = ET_RAYTRACING_PIPELINE;
3735
inline E_TYPE getAssetType() const override { return AssetType; }
3836

@@ -83,12 +81,13 @@ class ICPURayTracingPipeline final : public ICPUPipeline<IRayTracingPipeline<ICP
8381
return nullptr;
8482
}
8583

86-
8784
inline bool valid() const override final
8885
{
8986
if (!m_layout) return false;
9087
if (!m_layout->valid()) return false;
9188
if (m_raygen.valid() == SShaderSpecInfo::INVALID_SPEC_INFO) return false;
89+
if (m_hitGroups.anyHits.size() != m_hitGroups.closestHits.size()) return false;
90+
if (m_hitGroups.anyHits.size() != m_hitGroups.intersections.size()) return false;
9291
return true;
9392
}
9493

@@ -102,7 +101,23 @@ class ICPURayTracingPipeline final : public ICPUPipeline<IRayTracingPipeline<ICP
102101
return m_params;
103102
}
104103

104+
inline uint32_t getMissGroupCount() const
105+
{
106+
return m_misses.size();
107+
}
108+
109+
inline uint32_t getHitGroupCount() const
110+
{
111+
return m_hitGroups.anyHits.size();
112+
}
113+
114+
inline uint32_t getCallableGroupCount() const
115+
{
116+
return m_callables.size();
117+
}
118+
105119
protected:
120+
using base_t::base_t;
106121
virtual ~ICPURayTracingPipeline() = default;
107122

108123
private:
@@ -112,18 +127,24 @@ class ICPURayTracingPipeline final : public ICPUPipeline<IRayTracingPipeline<ICP
112127
SHitGroupSpecInfos m_hitGroups;
113128
core::vector<SShaderSpecInfo> m_callables;
114129

115-
explicit ICPURayTracingPipeline(const ICPUPipelineLayout* layout)
130+
explicit ICPURayTracingPipeline(ICPUPipelineLayout* layout)
116131
: base_t(layout, {})
117132
{}
118133

119134
inline void visitDependents_impl(std::function<bool(const IAsset*)> visit) const override
120135
{
121-
if (!visit(m_raygen.shader.get()) return;
122-
for (const auto& missInfo : self->m_misses) if (!visit(missInfo.shader.get())) return;
123-
for (const auto& anyHitInfo : self->m_hitGroups.anyHits) if (!visit(anyHitInfo.shader.get())) return;
124-
for (const auto& closestHitInfo : self->m_hitGroups.closestHits) if (!visit(closestHitInfo.shader.get())) return;
125-
for (const auto& intersectionInfo : self->m_hitGroups.intersections) if (!visit(intersectionInfo.shader.get())) return;
126-
for (const auto& callableInfo : self->m_callables) if(!visit(callableInfo.shader.get())) return;
136+
if (!visit(m_layout.get())) return;
137+
if (!visit(m_raygen.shader.get())) return;
138+
auto noNullVisit = [&](const IShader* shader) -> bool
139+
{
140+
if (!shader) return true;
141+
return visit(shader);
142+
};
143+
for (const auto& missInfo : m_misses) if (!noNullVisit(missInfo.shader.get())) return;
144+
for (const auto& anyHitInfo : m_hitGroups.anyHits) if (!noNullVisit(anyHitInfo.shader.get())) return;
145+
for (const auto& closestHitInfo : m_hitGroups.closestHits) if (!noNullVisit(closestHitInfo.shader.get())) return;
146+
for (const auto& intersectionInfo : m_hitGroups.intersections) if (!noNullVisit(intersectionInfo.shader.get())) return;
147+
for (const auto& callableInfo : m_callables) if(!noNullVisit(callableInfo.shader.get())) return;
127148
}
128149

129150
inline core::smart_refctd_ptr<base_t> clone_impl(core::smart_refctd_ptr<ICPUPipelineLayout>&& layout, uint32_t depth) const override final

include/nbl/asset/IPipeline.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ namespace nbl::asset
2828
class IPipelineBase
2929
{
3030
public:
31+
// TODO: tbf these shouldn't even be laying around in `nbl::asset`, we should probably move to `nbl::video::IGPUPipelineBase`
3132
enum class CreationFlags : uint64_t
3233
{
3334
NONE = 0, // disallowed in maintanance5

include/nbl/asset/IRayTracingPipeline.h

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,16 @@ namespace nbl::asset
1414
class IRayTracingPipelineBase : public virtual core::IReferenceCounted
1515
{
1616
public:
17-
struct SCachedCreationParams final
18-
{
19-
uint32_t maxRecursionDepth : 6 = 0;
20-
uint32_t dynamicStackSize : 1 = false;
21-
};
22-
};
23-
24-
template<typename PipelineLayoutType>
25-
class IRayTracingPipeline : public IPipeline<PipelineLayoutType>, public IRayTracingPipelineBase
26-
{
27-
public:
28-
2917
#define base_flag(F) static_cast<uint64_t>(IPipelineBase::FLAGS::F)
3018
enum class CreationFlags : uint64_t
3119
{
3220
NONE = base_flag(NONE),
21+
// there's a bit of a problem, as the ICPUCompute and Graphics pipelines don't care about flags, because the following 4 flags
3322
DISABLE_OPTIMIZATIONS = base_flag(DISABLE_OPTIMIZATIONS),
3423
ALLOW_DERIVATIVES = base_flag(ALLOW_DERIVATIVES),
3524
FAIL_ON_PIPELINE_COMPILE_REQUIRED = base_flag(FAIL_ON_PIPELINE_COMPILE_REQUIRED),
3625
EARLY_RETURN_ON_FAILURE = base_flag(EARLY_RETURN_ON_FAILURE),
26+
// don't matter for ICPU Pipelines, we'd really need to have these separate from `base_flag` and use the `IRayTracingPipelineBase::CreationFlags` for the ICPU creation params only
3727
SKIP_BUILT_IN_PRIMITIVES = 1<<12,
3828
SKIP_AABBS = 1<<13,
3929
NO_NULL_ANY_HIT_SHADERS = 1<<14,
@@ -43,7 +33,19 @@ class IRayTracingPipeline : public IPipeline<PipelineLayoutType>, public IRayTra
4333
ALLOW_MOTION = 1<<20,
4434
};
4535
#undef base_flag
46-
using FLAGS = CreationFlags;
36+
37+
struct SCachedCreationParams final
38+
{
39+
core::bitflag<CreationFlags> flags = CreationFlags::NONE;
40+
uint32_t maxRecursionDepth : 6 = 0;
41+
uint32_t dynamicStackSize : 1 = false;
42+
};
43+
};
44+
45+
template<typename PipelineLayoutType>
46+
class IRayTracingPipeline : public IPipeline<PipelineLayoutType>, public IRayTracingPipelineBase
47+
{
48+
public:
4749

4850
inline const SCachedCreationParams& getCachedCreationParams() const { return m_params; }
4951

include/nbl/builtin/hlsl/cpp_compat/matrix.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct matrix final : private glm::mat<N,M,T>
3434
template<uint16_t K>
3535
inline friend matrix<T, N, K> mul(matrix const& lhs, matrix<T, M, K> const& rhs)
3636
{
37-
return matrix<T, N, K>(glm::operator*(reinterpret_cast<Base const&>(rhs), reinterpret_cast<matrix<T, M, K>::Base const&>(lhs)));
37+
return matrix<T, N, K>(glm::operator*(reinterpret_cast<matrix<T, M, K>::Base const&>(rhs), reinterpret_cast<Base const&>(lhs)));
3838
}
3939
inline friend vector<T, N> mul(matrix const& lhs, vector<T, M> const& rhs)
4040
{

include/nbl/video/IGPUComputePipeline.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ class IGPUComputePipeline : public IGPUPipeline<asset::IComputePipeline<const IG
7474
return {};
7575
}
7676

77+
inline core::bitflag<FLAGS>& getFlags() { return flags; }
78+
79+
inline core::bitflag<FLAGS> getFlags() const { return flags; }
80+
7781
const IGPUPipelineLayout* layout = nullptr;
7882
// TODO: Could guess the required flags from SPIR-V introspection of declared caps
7983
core::bitflag<FLAGS> flags = FLAGS::NONE;

include/nbl/video/IGPUGraphicsPipeline.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ class IGPUGraphicsPipeline : public IGPUPipeline<asset::IGraphicsPipeline<const
8787
return stages;
8888
}
8989

90+
inline core::bitflag<FLAGS>& getFlags() { return flags; }
91+
92+
inline core::bitflag<FLAGS> getFlags() const { return flags; }
93+
9094
const IGPUPipelineLayout* layout = nullptr;
9195
SShaderSpecInfo vertexShader;
9296
SShaderSpecInfo tesselationControlShader;

include/nbl/video/IGPURayTracingPipeline.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class IGPURayTracingPipeline : public IGPUPipeline<asset::IRayTracingPipeline<c
2424

2525
struct SCreationParams : public SPipelineCreationParams<const IGPURayTracingPipeline>
2626
{
27-
using FLAGS = pipeline_t::FLAGS;
27+
using FLAGS = IRayTracingPipelineBase::CreationFlags;
2828

2929
struct SShaderGroupsParams
3030
{
@@ -45,8 +45,6 @@ class IGPURayTracingPipeline : public IGPUPipeline<asset::IRayTracingPipeline<c
4545
SShaderGroupsParams shaderGroups;
4646

4747
SCachedCreationParams cached = {};
48-
// TODO: Could guess the required flags from SPIR-V introspection of declared caps
49-
core::bitflag<FLAGS> flags = FLAGS::NONE;
5048

5149
inline SSpecializationValidationResult valid() const
5250
{
@@ -76,7 +74,7 @@ class IGPURayTracingPipeline : public IGPUPipeline<asset::IRayTracingPipeline<c
7674
}
7775

7876
// https://docs.vulkan.org/spec/latest/chapters/pipelines.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470
79-
if (flags.hasFlags(FLAGS::NO_NULL_ANY_HIT_SHADERS) && !shaderGroup.anyHit.shader)
77+
if (cached.flags.hasFlags(FLAGS::NO_NULL_ANY_HIT_SHADERS) && !shaderGroup.anyHit.shader)
8078
return {};
8179

8280
if (shaderGroup.anyHit.shader)
@@ -86,7 +84,7 @@ class IGPURayTracingPipeline : public IGPUPipeline<asset::IRayTracingPipeline<c
8684
}
8785

8886
// https://docs.vulkan.org/spec/latest/chapters/pipelines.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471
89-
if (flags.hasFlags(FLAGS::NO_NULL_CLOSEST_HIT_SHADERS) && !shaderGroup.intersection.shader)
87+
if (cached.flags.hasFlags(FLAGS::NO_NULL_CLOSEST_HIT_SHADERS) && !shaderGroup.intersection.shader)
9088
return {};
9189
}
9290

@@ -137,6 +135,10 @@ class IGPURayTracingPipeline : public IGPUPipeline<asset::IRayTracingPipeline<c
137135
return stages;
138136
}
139137

138+
inline core::bitflag<FLAGS>& getFlags() { return cached.flags; }
139+
140+
inline core::bitflag<FLAGS> getFlags() const { return cached.flags; }
141+
140142
};
141143

142144
struct SShaderGroupHandle
@@ -153,7 +155,7 @@ class IGPURayTracingPipeline : public IGPUPipeline<asset::IRayTracingPipeline<c
153155
uint16_t intersection;
154156
};
155157

156-
inline core::bitflag<SCreationParams::FLAGS> getCreationFlags() const { return m_flags; }
158+
inline core::bitflag<SCreationParams::FLAGS> getCreationFlags() const { return getCachedCreationParams().flags; }
157159

158160
// Vulkan: const VkPipeline*
159161
virtual const void* getNativeHandle() const = 0;
@@ -170,13 +172,11 @@ class IGPURayTracingPipeline : public IGPUPipeline<asset::IRayTracingPipeline<c
170172
virtual uint16_t getDefaultStackSize() const = 0;
171173

172174
protected:
173-
IGPURayTracingPipeline(const SCreationParams& params) : IGPUPipeline(core::smart_refctd_ptr<const ILogicalDevice>(params.layout->getOriginDevice()), params.layout, params.cached),
174-
m_flags(params.flags)
175+
IGPURayTracingPipeline(const SCreationParams& params) : IGPUPipeline(core::smart_refctd_ptr<const ILogicalDevice>(params.layout->getOriginDevice()), params.layout, params.cached)
175176
{}
176177

177178
virtual ~IGPURayTracingPipeline() = default;
178179

179-
const core::bitflag<SCreationParams::FLAGS> m_flags;
180180
};
181181

182182
}

include/nbl/video/ILogicalDevice.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1258,7 +1258,7 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
12581258
}
12591259
}
12601260
// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkComputePipelineCreateInfo.html#VUID-VkComputePipelineCreateInfo-flags-07985
1261-
else if (ci.basePipelineIndex < -1 || ci.basePipelineIndex >= i || ci.basePipelineIndex >= 0 && !params[ci.basePipelineIndex].flags.hasFlags(AllowDerivativesFlag))
1261+
else if (ci.basePipelineIndex < -1 || ci.basePipelineIndex >= i || ci.basePipelineIndex >= 0 && !params[ci.basePipelineIndex].getFlags().hasFlags(AllowDerivativesFlag))
12621262
{
12631263
NBL_LOG_ERROR("Invalid basePipeline was specified (params[%d])", i);
12641264
return {};

include/nbl/video/asset_traits.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include "nbl/video/IGPUAccelerationStructure.h"
2222
#include "nbl/asset/ICPUPolygonGeometry.h"
2323
#include "nbl/video/IGPUPolygonGeometry.h"
24+
#include "nbl/asset/ICPURayTracingPipeline.h"
25+
#include "nbl/video/IGPURayTracingPipeline.h"
2426

2527

2628
namespace nbl::video
@@ -244,6 +246,20 @@ struct asset_traits<asset::ICPUPolygonGeometry>
244246
};
245247

246248

249+
template<>
250+
struct asset_traits<asset::ICPURayTracingPipeline>
251+
{
252+
// the asset type
253+
using asset_t = asset::ICPURayTracingPipeline;
254+
// Depends on shader and layout
255+
constexpr static inline bool HasChildren = true;
256+
// the video type
257+
using video_t = IGPURayTracingPipeline;
258+
// lookup type
259+
using lookup_t = const video_t*;
260+
};
261+
262+
247263
/* TODO
248264
template<>
249265
struct asset_traits<asset::ICPUFramebuffer>;

0 commit comments

Comments
 (0)