87 lines
2.5 KiB
C
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;
|
|
}
|