Skip to content

Commit 958b60d

Browse files
committed
merge master, fix conflicts
2 parents b1a7731 + 60c2a20 commit 958b60d

File tree

10 files changed

+250
-21
lines changed

10 files changed

+250
-21
lines changed

include/nbl/asset/ICPUPolygonGeometry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class NBL_API2 ICPUPolygonGeometry final : public IPolygonGeometry<ICPUBuffer>
3030
inline core::smart_refctd_ptr<IAsset> clone(uint32_t _depth=~0u) const override
3131
{
3232
const auto nextDepth = _depth ? (_depth-1):0;
33-
auto retval = core::smart_refctd_ptr<ICPUPolygonGeometry>();
33+
auto retval = core::smart_refctd_ptr<ICPUPolygonGeometry>(new ICPUPolygonGeometry());
3434
retval->m_positionView = m_positionView.clone(nextDepth);
3535
retval->m_jointOBBView = m_jointOBBView.clone(nextDepth);
3636
retval->m_indexView = m_indexView.clone(nextDepth);

include/nbl/asset/IPolygonGeometry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ class IPolygonGeometry : public IIndexableGeometry<BufferType>, public IPolygonG
214214
case EF_R16_UINT:
215215
indexType = EIT_16BIT;
216216
break;
217-
case EF_R32_UINT: [[fallthrough]];
217+
case EF_R32_UINT:
218218
indexType = EIT_32BIT;
219219
break;
220220
default:

include/nbl/asset/utils/CPolygonGeometryManipulator.h

Lines changed: 139 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace nbl::asset
1616
{
1717

1818
//! An interface for easy manipulation of polygon geometries.
19-
class NBL_API2 CPolygonGeometryManipulator
19+
class CPolygonGeometryManipulator
2020
{
2121
public:
2222
static inline void recomputeContentHashes(ICPUPolygonGeometry* geo)
@@ -65,22 +65,153 @@ class NBL_API2 CPolygonGeometryManipulator
6565
{
6666
if (!geo || !geo->getPositionView() || geo->getPositionView().composed.rangeFormat>=IGeometryBase::EAABBFormat::Count)
6767
return {};
68-
// the AABB shall be the same format as the Position View's range Format
69-
IGeometryBase::SAABBStorage retval;
70-
//if (geo->getIndexView() || geo->isSkinned())
68+
69+
if (geo->getIndexView() || geo->isSkinned())
70+
{
71+
const auto jointViewCount = geo->getJointWeightViews().size();
72+
auto isVertexSkinned = [&jointViewCount](const ICPUPolygonGeometry* geo, uint64_t vertex_i)
73+
{
74+
if (!geo->isSkinned()) return false;
75+
for (auto weightView_i = 0u; weightView_i < jointViewCount; weightView_i++)
76+
{
77+
const auto& weightView = geo->getJointWeightViews()[weightView_i];
78+
hlsl::float32_t4 weight;
79+
weightView.weights.decodeElement(vertex_i, weight);
80+
for (auto channel_i = 0; channel_i < getFormatChannelCount(weightView.weights.composed.format); channel_i++)
81+
if (weight[channel_i] > 0.f)
82+
return true;
83+
}
84+
return false;
85+
};
86+
87+
auto addToAABB = [&](auto& aabb)->void
88+
{
89+
using aabb_t = std::remove_reference_t<decltype(aabb)>;
90+
if (geo->getIndexView())
91+
{
92+
for (auto index_i = 0u; index_i != geo->getIndexView().getElementCount(); index_i++)
93+
{
94+
hlsl::vector<uint32_t, 1> vertex_i;
95+
geo->getIndexView().decodeElement(index_i, vertex_i);
96+
if (isVertexSkinned(geo, vertex_i.x)) continue;
97+
typename aabb_t::point_t pt;
98+
geo->getPositionView().decodeElement(vertex_i.x, pt);
99+
aabb.addPoint(pt);
100+
}
101+
} else
102+
{
103+
for (auto vertex_i = 0u; vertex_i != geo->getPositionView().getElementCount(); vertex_i++)
104+
{
105+
if (isVertexSkinned(geo, vertex_i)) continue;
106+
typename aabb_t::point_t pt;
107+
geo->getPositionView().decodeElement(vertex_i, pt);
108+
aabb.addPoint(pt);
109+
}
110+
}
111+
};
112+
IGeometryBase::SDataViewBase tmp = geo->getPositionView().composed;
113+
tmp.resetRange();
114+
tmp.visitRange(addToAABB);
115+
return tmp.encodedDataRange;
116+
}
117+
else
71118
{
72-
// TODO: kevinyu
119+
return geo->getPositionView().composed.encodedDataRange;
73120
}
74-
//else
75-
retval = geo->getPositionView().composed.encodedDataRange;
76-
return retval;
77121
}
122+
78123
static inline void recomputeAABB(const ICPUPolygonGeometry* geo)
79124
{
80125
if (geo->isMutable())
81126
const_cast<IGeometryBase::SAABBStorage&>(geo->getAABBStorage()) = computeAABB(geo);
82127
}
83128

129+
static inline core::smart_refctd_ptr<ICPUPolygonGeometry> createTriangleListIndexing(const ICPUPolygonGeometry* geo)
130+
{
131+
const auto* indexing = geo->getIndexingCallback();
132+
if (!indexing) return nullptr;
133+
if (indexing->degree() != 3) return nullptr;
134+
135+
const auto originalView = geo->getIndexView();
136+
const auto originalIndexSize = originalView ? originalView.composed.stride : 0;
137+
const auto primCount = geo->getPrimitiveCount();
138+
const auto maxIndex = geo->getPositionView().getElementCount() - 1;
139+
const uint8_t indexSize = maxIndex <= std::numeric_limits<uint16_t>::max() ? sizeof(uint16_t) : sizeof(uint32_t);
140+
const auto outGeometry = core::move_and_static_cast<ICPUPolygonGeometry>(geo->clone(0u));
141+
142+
if (indexing && indexing->knownTopology() == EPT_TRIANGLE_LIST)
143+
return outGeometry;
144+
145+
146+
auto* outGeo = outGeometry.get();
147+
const auto indexBufferUsages = [&]
148+
{
149+
if (originalView) return originalView.src.buffer->getUsageFlags();
150+
return core::bitflag<IBuffer::E_USAGE_FLAGS>(IBuffer::EUF_INDEX_BUFFER_BIT);
151+
}();
152+
auto indexBuffer = ICPUBuffer::create({ primCount * indexing->degree() * indexSize, indexBufferUsages });
153+
auto indexBufferPtr = indexBuffer->getPointer();
154+
auto indexView = ICPUPolygonGeometry::SDataView{
155+
.composed = {
156+
.stride = indexSize,
157+
},
158+
.src = {
159+
.offset = 0,
160+
.size = indexBuffer->getSize(),
161+
.buffer = std::move(indexBuffer)
162+
}
163+
};
164+
165+
switch (indexSize)
166+
{
167+
case 2:
168+
{
169+
IPolygonGeometryBase::IIndexingCallback::SContext<uint16_t> context{
170+
.indexBuffer = geo->getIndexView().getPointer(),
171+
.indexSize = originalIndexSize,
172+
.beginPrimitive = 0,
173+
.endPrimitive = primCount,
174+
.out = indexBufferPtr,
175+
};
176+
indexing->operator()(context);
177+
178+
indexView.composed.encodedDataRange.u16.minVx[0] = 0;
179+
indexView.composed.encodedDataRange.u16.maxVx[0] = maxIndex;
180+
indexView.composed.format = EF_R16_UINT;
181+
indexView.composed.rangeFormat = IGeometryBase::EAABBFormat::U16;
182+
break;
183+
}
184+
case 4:
185+
{
186+
IPolygonGeometryBase::IIndexingCallback::SContext<uint32_t> context{
187+
.indexBuffer = geo->getIndexView().getPointer(),
188+
.indexSize = originalIndexSize,
189+
.beginPrimitive = 0,
190+
.endPrimitive = primCount,
191+
.out = indexBufferPtr,
192+
};
193+
indexing->operator()(context);
194+
195+
indexView.composed.encodedDataRange.u32.minVx[0] = 0;
196+
indexView.composed.encodedDataRange.u32.maxVx[0] = maxIndex;
197+
indexView.composed.format = EF_R32_UINT;
198+
indexView.composed.rangeFormat = IGeometryBase::EAABBFormat::U32;
199+
break;
200+
}
201+
default:
202+
{
203+
assert(false);
204+
return nullptr;
205+
}
206+
}
207+
208+
outGeo->setIndexing(IPolygonGeometryBase::TriangleList());
209+
outGeo->setIndexView(std::move(indexView));
210+
CGeometryManipulator::recomputeContentHash(outGeo->getIndexView());
211+
212+
return outGeometry;
213+
}
214+
84215
//! Comparison methods
85216
enum E_ERROR_METRIC
86217
{

include/nbl/builtin/hlsl/cpp_compat/impl/intrinsics_impl.hlsl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -365,11 +365,12 @@ struct find_lsb_helper<T>
365365
using return_t = int32_t;
366366
NBL_CONSTEXPR_FUNC static inline T __call(const T arg)
367367
{
368+
#pragma warning(suppress: 5063)
368369
if constexpr (std::is_constant_evaluated())
369370
{
370-
for (T ix = T(0); ix < sizeof(size_t) * 8; ix++)
371-
if ((T(1) << ix) & arg) return ix;
372-
return ~T(0);
371+
for (T ix = T(0); ix < sizeof(size_t) * 8; ix++)
372+
if ((T(1) << ix) & arg) return ix;
373+
return ~T(0);
373374
}
374375
return glm::findLSB<T>(arg);
375376
}

include/nbl/builtin/hlsl/spirv_intrinsics/core.hlsl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ static const bool HelperInvocation;
6868
static const uint32_t VertexIndex;
6969
[[vk::ext_builtin_input(spv::BuiltInInstanceIndex)]]
7070
static const uint32_t InstanceIndex;
71+
[[vk::ext_builtin_input(spv::BuiltInPrimitiveId)]]
72+
static const uint32_t PrimitiveId;
7173

7274
//! Vertex and friends
7375
[[vk::ext_builtin_output(spv::BuiltInPosition)]]

include/nbl/builtin/hlsl/spirv_intrinsics/raytracing.hlsl

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,109 @@ static const float32_t3 HitTriangleVertexPositionsKHR[3];
8686
[[vk::ext_instruction(spv::OpRayQueryGetIntersectionTriangleVertexPositionsKHR)]]
8787
float3 rayQueryGetIntersectionTriangleVertexPositionsKHR([[vk::ext_reference]] RayQueryKHR query, uint32_t committed)[3];
8888

89+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
90+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
91+
[[vk::ext_builtin_input(spv::BuiltInLaunchIdKHR)]]
92+
static const uint32_t3 LaunchIdKHR;
93+
94+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
95+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
96+
[[vk::ext_builtin_input(spv::BuiltInLaunchSizeKHR)]]
97+
static const uint32_t3 LaunchSizeKHR;
98+
99+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
100+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
101+
[[vk::ext_builtin_input(spv::BuiltInInstanceCustomIndexKHR)]]
102+
static const uint32_t InstanceCustomIndexKHR;
103+
104+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
105+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
106+
[[vk::ext_builtin_input(spv::BuiltInRayGeometryIndexKHR)]]
107+
static const uint32_t RayGeometryIndexKHR;
108+
109+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
110+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
111+
[[vk::ext_builtin_input(spv::BuiltInWorldRayOriginKHR)]]
112+
static const float32_t3 WorldRayOriginKHR;
89113

114+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
115+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
116+
[[vk::ext_builtin_input(spv::BuiltInWorldRayDirectionKHR)]]
117+
static const float32_t3 WorldRayDirectionKHR;
118+
119+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
120+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
121+
[[vk::ext_builtin_input(spv::BuiltInObjectRayOriginKHR)]]
122+
static const float32_t3 ObjectRayOriginKHR;
123+
124+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
125+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
126+
[[vk::ext_builtin_input(spv::BuiltInObjectRayDirectionKHR)]]
127+
static const float32_t3 ObjectRayDirectionKHR;
90128

91-
//! Ray Tracing Pipeline stuff (TODO: @kevyu)
129+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
130+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
131+
[[vk::ext_builtin_input(spv::BuiltInRayTminKHR)]]
132+
static const float32_t RayTminKHR;
133+
134+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
135+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
136+
[[vk::ext_builtin_input(spv::BuiltInRayTmaxKHR)]]
137+
static const float32_t RayTmaxKHR;
138+
139+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
140+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
141+
[[vk::ext_builtin_input(spv::BuiltInObjectToWorldKHR)]]
142+
static const float32_t4x3 ObjectToWorldKHR;
143+
144+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
145+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
146+
[[vk::ext_builtin_input(spv::BuiltInWorldToObjectKHR)]]
147+
static const float32_t4x3 WorldToObjectKHR;
148+
149+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
150+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
151+
[[vk::ext_builtin_input(spv::BuiltInHitKindKHR)]]
152+
static const uint32_t HitKindKHR;
153+
154+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
155+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
156+
[[vk::ext_builtin_input(spv::BuiltInIncomingRayFlagsKHR)]]
157+
static const uint32_t IncomingRayFlagsKHR;
158+
159+
template <typename PayloadT>
160+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
161+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
162+
[[vk::ext_instruction(spv::OpTraceRayKHR)]]
163+
void traceRayKHR(AccelerationStructureKHR AS, uint32_t rayFlags, uint32_t cullMask, uint32_t sbtOffset, uint32_t sbtStride, uint32_t missIndex, float32_t3 rayOrigin, float32_t rayTmin, float32_t3 rayDirection, float32_t rayTmax, [[vk::ext_reference]] PayloadT payload);
164+
165+
template <typename PayloadT>
166+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
167+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
168+
[[vk::ext_instruction(spv::OpTraceRayKHR)]]
169+
void traceRayKHR(RaytracingAccelerationStructure AS, uint32_t rayFlags, uint32_t cullMask, uint32_t sbtOffset, uint32_t sbtStride, uint32_t missIndex, float32_t3 rayOrigin, float32_t rayTmin, float32_t3 rayDirection, float32_t rayTmax, [[vk::ext_reference]] PayloadT payload);
170+
171+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
172+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
173+
[[vk::ext_instruction(spv::OpReportIntersectionKHR)]]
174+
bool reportIntersectionKHR(float32_t hit, uint32_t hitKind);
175+
176+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
177+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
178+
[[vk::ext_instruction(spv::OpIgnoreIntersectionKHR)]]
179+
void ignoreIntersectionKHR();
92180

93181
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
94182
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
95183
[[vk::ext_instruction(spv::OpTerminateRayKHR)]]
96-
void terminateRay();
184+
void terminateRayKHR();
185+
186+
template <typename T>
187+
[[vk::ext_capability(spv::CapabilityRayTracingKHR)]]
188+
[[vk::ext_extension("SPV_KHR_ray_tracing")]]
189+
[[vk::ext_instruction(spv::OpExecuteCallableKHR)]]
190+
void executeCallable(uint32_t sbtIndex, [[vk::ext_reference]] T payload);
191+
97192

98193
}
99194
}

include/nbl/video/utilities/CComputeBlit.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class CComputeBlit : public core::IReferenceCounted
123123
baseBucketCount = 512;
124124
break;
125125
case format_t::EF_R16_UNORM: [[fallthrough]];
126-
case format_t::EF_R16_SNORM: [[fallthrough]];
126+
case format_t::EF_R16_SNORM:
127127
baseBucketCount = 1024;
128128
break;
129129
case format_t::EF_R32_SFLOAT:

src/nbl/video/CVulkanLogicalDevice.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1594,7 +1594,7 @@ void CVulkanLogicalDevice::createRayTracingPipelines_impl(
15941594
const auto key = ShaderModuleKey{ spec.shader, spec.entryPoint };
15951595
if (shaderIndexes.find(key) == shaderIndexes.end())
15961596
{
1597-
shaderIndexes.insert({ key , std::distance<decltype(outCreateInfo->pStages)>(outCreateInfo->pStages, outShaderStage)});
1597+
shaderIndexes.insert({ key , static_cast<uint32_t>(std::distance<decltype(outCreateInfo->pStages)>(outCreateInfo->pStages, outShaderStage)) });
15981598
*(outShaderStage) = getVkShaderStageCreateInfoFrom(spec, shaderStage, false, outShaderModule, outEntryPoints, outRequiredSubgroupSize, outSpecInfo,outSpecMapEntry,outSpecData);
15991599
outShaderStage++;
16001600
}

src/nbl/video/ILogicalDevice.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,15 +1062,15 @@ bool ILogicalDevice::createRayTracingPipelines(IGPUPipelineCache* const pipeline
10621062

10631063
const auto missGroupCount = std::accumulate(params.begin(), params.end(), 0, [](uint32_t sum, auto& param)
10641064
{
1065-
return sum + param.shaderGroups.misses.size();
1065+
return sum + static_cast<uint32_t>(param.shaderGroups.misses.size());
10661066
});
10671067
const auto hitGroupCount = std::accumulate(params.begin(), params.end(), 0, [](uint32_t sum, auto& param)
10681068
{
1069-
return sum + param.shaderGroups.hits.size();
1069+
return sum + static_cast<uint32_t>(param.shaderGroups.hits.size());
10701070
});
10711071
const auto callableGroupCount = std::accumulate(params.begin(), params.end(), 0, [](uint32_t sum, auto& param)
10721072
{
1073-
return sum + param.shaderGroups.callables.size();
1073+
return sum + static_cast<uint32_t>(param.shaderGroups.callables.size());
10741074
});
10751075

10761076

0 commit comments

Comments
 (0)