提交 bc82b836 编写于 作者: M Matt Pharr

Use MapType to generate list of types for MaterialEvalQueue.

上级 cd3b4491
......@@ -13,6 +13,7 @@
#include <pbrt/lightsamplers.h>
#include <pbrt/materials.h>
#include <pbrt/ray.h>
#include <pbrt/util/containers.h>
#include <pbrt/util/pstd.h>
#include <pbrt/util/soa.h>
......@@ -437,13 +438,7 @@ using MediumScatterQueue = WorkQueue<MediumScatterWorkItem>;
// MaterialEvalQueue Definition
using MaterialEvalQueue = MultiWorkQueue<
MaterialEvalWorkItem<CoatedDiffuseMaterial>,
MaterialEvalWorkItem<CoatedConductorMaterial>,
MaterialEvalWorkItem<ConductorMaterial>, MaterialEvalWorkItem<DielectricMaterial>,
MaterialEvalWorkItem<DiffuseMaterial>,
MaterialEvalWorkItem<DiffuseTransmissionMaterial>, MaterialEvalWorkItem<HairMaterial>,
MaterialEvalWorkItem<MeasuredMaterial>, MaterialEvalWorkItem<SubsurfaceMaterial>,
MaterialEvalWorkItem<ThinDielectricMaterial>, MaterialEvalWorkItem<MixMaterial>>;
typename MapType<MaterialEvalWorkItem, typename MaterialHandle::Types>::type>;
} // namespace pbrt
......
......@@ -99,21 +99,21 @@ void ForAllQueued(const char *desc, WorkQueue<WorkItem> *q, int maxQueued, F fun
}
// MultiWorkQueue Definition
template <typename... Ts>
template <typename T>
class MultiWorkQueue;
template <>
class MultiWorkQueue<> {
class MultiWorkQueue<TypePack<>> {
public:
MultiWorkQueue(int n, Allocator alloc, pstd::span<const bool> haveType) {}
};
template <typename T, typename... Ts>
class MultiWorkQueue<T, Ts...> : public MultiWorkQueue<Ts...> {
class MultiWorkQueue<TypePack<T, Ts...>> : public MultiWorkQueue<TypePack<Ts...>> {
public:
// MultiWorkQueue Public Methods
MultiWorkQueue(int n, Allocator alloc, pstd::span<const bool> haveType)
: MultiWorkQueue<Ts...>(n, alloc, haveType.subspan(1, haveType.size())),
: MultiWorkQueue<TypePack<Ts...>>(n, alloc, haveType.subspan(1, haveType.size())),
q(haveType.front() ? n : 1, alloc) {}
template <typename Tsz>
......@@ -121,14 +121,14 @@ class MultiWorkQueue<T, Ts...> : public MultiWorkQueue<Ts...> {
if constexpr (std::is_same_v<Tsz, T>)
return q.Size();
else
return MultiWorkQueue<Ts...>::template Size<Tsz>();
return MultiWorkQueue<TypePack<Ts...>>::template Size<Tsz>();
}
PBRT_CPU_GPU
void Reset() {
q.Reset();
if constexpr (sizeof...(Ts) > 0)
MultiWorkQueue<Ts...>::Reset();
MultiWorkQueue<TypePack<Ts...>>::Reset();
}
template <typename Tg>
......@@ -136,7 +136,7 @@ class MultiWorkQueue<T, Ts...> : public MultiWorkQueue<Ts...> {
if constexpr (std::is_same_v<Tg, T>)
return &q;
else
return MultiWorkQueue<Ts...>::template Get<Tg>();
return MultiWorkQueue<TypePack<Ts...>>::template Get<Tg>();
}
template <typename Tq>
......@@ -144,7 +144,7 @@ class MultiWorkQueue<T, Ts...> : public MultiWorkQueue<Ts...> {
if constexpr (std::is_same_v<Tq, T>)
return q.Push(item);
else
return MultiWorkQueue<Ts...>::template Push<Tq>(item);
return MultiWorkQueue<TypePack<Ts...>>::template Push<Tq>(item);
}
private:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册