@@ -116,42 +116,73 @@ llvm::Error offloadtest::buildPipelineAccelerationStructures(
116116 llvm::StringMap<size_t > BLASIndex;
117117
118118 for (const auto &BD : P.AccelStructs .BLAS ) {
119- llvm::SmallVector<TriangleGeometryDesc> Triangles;
120- Triangles.reserve (BD .Triangles .size ());
121- for (const auto &T : BD .Triangles ) {
122- assert (T.VertexBufferPtr && " VertexBufferPtr not resolved" );
123- auto VBOrErr = createBufferWithData (
124- Dev, " AS-Vertices" , UploadDesc, T.VertexBufferPtr ->Data [0 ].get (),
125- T.VertexBufferPtr ->size (), nullptr , nullptr );
126- if (!VBOrErr)
127- return VBOrErr.takeError ();
128-
129- TriangleGeometryDesc TGD ;
130- TGD .VertexBuffer = VBOrErr->get ();
131- TGD .VertexCount = T.VertexCount ;
132- TGD .VertexStride = T.VertexStride ;
133- TGD .VertexFormat = T.VertexFormat ;
134- TGD .Opaque = T.Opaque ;
135-
136- OutInputBuffers.push_back (std::move (*VBOrErr));
137-
138- if (T.IndexBufferPtr ) {
139- auto IBOrErr = createBufferWithData (
140- Dev, " AS-Indices" , UploadDesc, T.IndexBufferPtr ->Data [0 ].get (),
141- T.IndexBufferPtr ->size (), nullptr , nullptr );
142- if (!IBOrErr)
143- return IBOrErr.takeError ();
144- TGD .IndexBuffer = IBOrErr->get ();
145- TGD .IndexCount = T.IndexCount ;
146- TGD .IdxFormat = T.IdxFormat ;
147- OutInputBuffers.push_back (std::move (*IBOrErr));
119+ if (!BD .Triangles .empty () && !BD .AABBs .empty ())
120+ return llvm::createStringError (
121+ std::errc::invalid_argument,
122+ " BLAS '%s' mixes triangle and AABB geometry; pick one." ,
123+ BD .Name .c_str ());
124+ if (BD .Triangles .empty () && BD .AABBs .empty ())
125+ return llvm::createStringError (std::errc::invalid_argument,
126+ " BLAS '%s' has no geometry." ,
127+ BD .Name .c_str ());
128+
129+ llvm::Expected<BLASBuildRequest> ReqOrErr =
130+ llvm::createStringError (std::errc::invalid_argument, " uninitialized" );
131+ if (!BD .Triangles .empty ()) {
132+ llvm::SmallVector<TriangleGeometryDesc> Triangles;
133+ Triangles.reserve (BD .Triangles .size ());
134+ for (const auto &T : BD .Triangles ) {
135+ assert (T.VertexBufferPtr && " VertexBufferPtr not resolved" );
136+ auto VBOrErr = createBufferWithData (
137+ Dev, " AS-Vertices" , UploadDesc, T.VertexBufferPtr ->Data [0 ].get (),
138+ T.VertexBufferPtr ->size (), nullptr , nullptr );
139+ if (!VBOrErr)
140+ return VBOrErr.takeError ();
141+
142+ TriangleGeometryDesc TGD ;
143+ TGD .VertexBuffer = VBOrErr->get ();
144+ TGD .VertexCount = T.VertexCount ;
145+ TGD .VertexStride = T.VertexStride ;
146+ TGD .VertexFormat = T.VertexFormat ;
147+ TGD .Opaque = T.Opaque ;
148+
149+ OutInputBuffers.push_back (std::move (*VBOrErr));
150+
151+ if (T.IndexBufferPtr ) {
152+ auto IBOrErr = createBufferWithData (
153+ Dev, " AS-Indices" , UploadDesc, T.IndexBufferPtr ->Data [0 ].get (),
154+ T.IndexBufferPtr ->size (), nullptr , nullptr );
155+ if (!IBOrErr)
156+ return IBOrErr.takeError ();
157+ TGD .IndexBuffer = IBOrErr->get ();
158+ TGD .IndexCount = T.IndexCount ;
159+ TGD .IdxFormat = T.IdxFormat ;
160+ OutInputBuffers.push_back (std::move (*IBOrErr));
161+ }
162+ Triangles.push_back (TGD );
163+ }
164+ ReqOrErr = Dev.createTriangleBLASBuildRequest (Triangles, BuildFlagNone);
165+ } else {
166+ llvm::SmallVector<AABBGeometryDesc> AABBs;
167+ AABBs.reserve (BD .AABBs .size ());
168+ for (const auto &A : BD .AABBs ) {
169+ assert (A.AABBBufferPtr && " AABBBufferPtr not resolved" );
170+ auto ABOrErr = createBufferWithData (
171+ Dev, " AS-AABBs" , UploadDesc, A.AABBBufferPtr ->Data [0 ].get (),
172+ A.AABBBufferPtr ->size (), nullptr , nullptr );
173+ if (!ABOrErr)
174+ return ABOrErr.takeError ();
175+ AABBGeometryDesc AGD ;
176+ AGD .AABBBuffer = ABOrErr->get ();
177+ AGD .AABBCount = A.AABBCount ;
178+ AGD .AABBStride = A.AABBStride ;
179+ AGD .Opaque = A.Opaque ;
180+ OutInputBuffers.push_back (std::move (*ABOrErr));
181+ AABBs.push_back (AGD );
148182 }
149- Triangles. push_back ( TGD );
183+ ReqOrErr = Dev. createAABBBLASBuildRequest (AABBs, BuildFlagNone );
150184 }
151- // TODO: AABB geometry support (would mirror the triangle path).
152185
153- auto ReqOrErr =
154- Dev.createTriangleBLASBuildRequest (Triangles, BuildFlagNone);
155186 if (!ReqOrErr)
156187 return ReqOrErr.takeError ();
157188 auto ASOrErr = Dev.createAccelerationStructure (*ReqOrErr);
0 commit comments