299 {
300
303
304 std::shared_ptr<impeller::VertexDescriptor> vertex_descriptor;
305
306 const bool buffer_layouts_provided = !Dart_IsNull(buffer_layouts_handle);
307 const bool attributes_provided = !Dart_IsNull(attributes_handle);
308 const bool attribute_names_provided = !Dart_IsNull(attribute_names_handle);
309 if (buffer_layouts_provided != attributes_provided ||
310 attributes_provided != attribute_names_provided) {
312 "VertexLayout requires buffer layouts, attributes, and attribute "
313 "names to be provided together.");
314 }
315
316 if (buffer_layouts_provided) {
317
318
319
320
321
322
323
324 std::vector<int32_t> buffer_layouts_ints;
325 std::vector<int32_t> attribute_ints;
326 std::vector<char> attribute_names_bytes;
327 std::string copy_error;
328 {
332 if (buffer_layouts_data.length_in_bytes() %
333 (flutter::gpu::kBufferLayoutInts * sizeof(int32_t)) !=
334 0) {
335 copy_error =
336 "Internal error: buffer layouts ByteData has invalid length.";
337 } else if (attributes_data.length_in_bytes() %
338 (flutter::gpu::kAttributeInts * sizeof(int32_t)) !=
339 0) {
340 copy_error = "Internal error: attributes ByteData has invalid length.";
341 } else {
342 const auto* buffer_layouts_src =
343 static_cast<const int32_t*>(buffer_layouts_data.data());
344 const auto* attributes_src =
345 static_cast<const int32_t*>(attributes_data.data());
346 const auto* names_src =
347 static_cast<const char*>(attribute_names_data.data());
348 buffer_layouts_ints.assign(
349 buffer_layouts_src,
350 buffer_layouts_src +
351 buffer_layouts_data.length_in_bytes() / sizeof(int32_t));
352 attribute_ints.assign(
353 attributes_src, attributes_src + attributes_data.length_in_bytes() /
354 sizeof(int32_t));
355 attribute_names_bytes.assign(
356 names_src, names_src + attribute_names_data.length_in_bytes());
357 }
358 }
359 if (!copy_error.empty()) {
361 }
362
363 absl::StatusOr<std::shared_ptr<impeller::VertexDescriptor>> built =
364 flutter::gpu::BuildCustomVertexDescriptor(
365 *vertex_shader,
366 std::span<const int32_t>(buffer_layouts_ints.data(),
367 buffer_layouts_ints.size()),
368 std::span<const int32_t>(attribute_ints.data(),
369 attribute_ints.size()),
370 std::span<const char>(attribute_names_bytes.data(),
371 attribute_names_bytes.size()));
372 if (!built.ok()) {
374 }
375 vertex_descriptor = *std::move(built);
376 } else {
378 }
379
380 auto res = fml::MakeRefCounted<flutter::gpu::RenderPipeline>(
383 std::move(vertex_descriptor));
384 res->AssociateWithDartWrapper(wrapper);
385
386 return Dart_Null();
387}
bool RegisterSync(Context &context)
std::shared_ptr< impeller::VertexDescriptor > CreateVertexDescriptor() const
Dart_Handle ToDart(const T &object)