cudaslicer/examples/c_example.c
2026-09-25 18:09:19 +03:00

87 lines
2.5 KiB
C

#include "gpu_offset.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
printf("=== C API Example: Linking libcudaslicer_offset.so ===\n");
// 1. Initialize GPU
if (gpu_offset_init(0) != 0) {
fprintf(stderr, "Failed to initialize GPU\n");
return 1;
}
// 2. Create a test slice layer with a square polygon and a circular hole
GpuContour contours[2];
// Square exterior: 20mm x 20mm centered at origin
GpuPoint2D square_pts[4] = {
{ -10.0f, -10.0f },
{ 10.0f, -10.0f },
{ 10.0f, 10.0f },
{ -10.0f, 10.0f }
};
contours[0].points = square_pts;
contours[0].num_points = 4;
contours[0].is_hole = 0;
// Diamond interior hole
GpuPoint2D hole_pts[4] = {
{ 0.0f, -4.0f },
{ 4.0f, 0.0f },
{ 0.0f, 4.0f },
{ -4.0f, 0.0f }
};
contours[1].points = hole_pts;
contours[1].num_points = 4;
contours[1].is_hole = 1;
GpuSliceLayer layer;
layer.z_height = 0.20f;
layer.contours = contours;
layer.num_contours = 2;
// 3. Configure Offsets
float offset_dists[2] = { 0.45f, 0.90f };
GpuOffsetConfig config;
config.pitch_mm = 0.05f;
config.pad_mm = 1.0f;
config.offset_distances_mm = offset_dists;
config.num_offsets = 2;
config.use_gpu_rasterizer = 1;
// 4. Run GPU Offset
GpuLayerResult* results = NULL;
GpuOffsetStats stats = {0};
int ret = gpu_offset_polygon_layers(
&layer, 1,
-10.0f, -10.0f, 10.0f, 10.0f,
&config, &results, &stats
);
if (ret == 0 && results) {
printf("GPU Offset Successful!\n");
printf(" Rasterization: %.3f ms\n", stats.t_raster_ms);
printf(" H2D Transfer: %.3f ms\n", stats.t_h2d_ms);
printf(" GPU JFA Compute: %.3f ms\n", stats.t_gpu_jfa_ms);
printf(" D2H Transfer: %.3f ms\n", stats.t_d2h_ms);
printf(" Vectorization: %.3f ms\n", stats.t_vectorize_ms);
printf(" Total Time: %.3f ms\n", stats.t_total_pipeline_ms);
for (size_t o = 0; o < results[0].num_perimeters; ++o) {
printf(" Perimeter %zu (Offset -%.2f mm): %zu vector loops\n",
o + 1, results[0].perimeters[o].offset_distance_mm,
results[0].perimeters[o].num_contours);
}
gpu_offset_free_results(results, 1);
} else {
fprintf(stderr, "GPU Offset failed!\n");
}
gpu_offset_cleanup();
printf("=== Done ===\n");
return 0;
}