tiny.sdfii.ffi.Api
Defined in ffi.
API (18)
Actions
Public operations.
bindconfigureBehaviorsissueQuerypublishedRevisionqueryAuthoritysdfii_abi_versionsdfii_engine_core_backend_selectsdfii_engine_core_configure_behaviorssdfii_engine_core_createsdfii_engine_core_destroysdfii_engine_core_failure_fallbacksdfii_engine_core_field_query_routesdfii_engine_core_plan_uploadsdfii_engine_core_render_plansdfii_engine_core_render_routesdfii_engine_core_world_stepsubmitworldStep
Source
Source: fun/sdfii/src/engine/bind.zig
zig
const Self = @This();const std = @import("std");const Engine = @import("root.zig").internals.engine;const ffi = @import("sdfii_ffi");const types = ffi.types;const allocator_policy = ffi.allocator_policy;const Router = @import("sdfii_backend").router;const UploadPlanner = @import("sdfii_backend").upload;const low_level = @import("abi/root.zig").core;const abi_allocator = allocator_policy.exportedHandleAllocator();engine: *Engine,pub fn bind(engine: *Engine) Self { return .{ .engine = engine, };}pub fn worldStep(self: *const Self, commands: types.CommandBatch, input: types.FrameInput) types.StepResult { return self.engine.worldStep(commands, input);}pub fn configureBehaviors(self: *const Self, request: types.BehaviorConfigRequest) !void { try self.engine.behavior.configureFromFfi(self.engine.allocator, request);}pub fn submit(self: *const Self, commands: types.CommandBatch, input: types.FrameInput) types.StepResult { return self.worldStep(commands, input);}pub fn issueQuery(self: *const Self, request: types.QueryRequest) types.QueryResult { const current = self.engine.currentPublishedScene(); const published = current.ptr() orelse return .{}; if (published.revision != request.compiled_revision or !self.engine.queries.isBoundTo(request.compiled_revision)) { return .{}; } return .{ .compiled_revision = request.compiled_revision, .match_count = 0, };}pub fn publishedRevision(self: *const Self) types.PublishedRevisionSummary { const current = self.engine.currentPublishedScene(); const published = current.ptr() orelse return .{}; return .{ .compiled_revision = published.revision, .source_tick = published.view.source_tick, .entity_count = @as(u32, @intCast(published.view.entity_count)), .asset_count = @as(u32, @intCast(published.view.asset_count)), .fragment_count = @as(u32, @intCast(published.program_state.fragment_count)), .edit_fragment_count = @as(u32, @intCast(published.program_state.edit_fragment_count)), .overlap_region_count = @as(u32, @intCast(published.query_state.overlap_region_count)), .dirty_region_count = @as(u32, @intCast(published.query_state.dirtyRegionCountForRevision(published.revision))), .supports_field_queries = types.flagFromBool(published.query_state.supportsFieldQueries()), };}pub fn queryAuthority(self: *const Self, compiled_revision: u64) types.QueryAuthoritySummary { const current = self.engine.currentPublishedScene(); const summary = self.engine.queries.describeBinding( if (current.has_value) current.value else null, compiled_revision, ); return .{ .requested_revision = summary.requested_revision, .published_revision = summary.published_revision, .bound_revision = summary.bound_revision, .revision_matches = types.flagFromBool(summary.revision_matches), .query_bound = types.flagFromBool(summary.query_bound), .supports_field_queries = types.flagFromBool(summary.supports_field_queries), };}pub fn sdfii_abi_version() u32 { return 8;}test "abi version records direct typed boundary" { try std.testing.expectEqual(@as(u32, 8), sdfii_abi_version());}pub fn sdfii_engine_core_create(limits: ?*const types.EngineLimits) ?*Engine { const requested = limits orelse return null; if (requested.reserved != 0) return null; const engine = abi_allocator.create(Engine) catch return null; engine.* = Engine.initFallible(abi_allocator, .{ .entity_capacity = requested.entity_capacity, .physics_scratch = .{ .program_nodes = requested.physics_program_nodes }, .ui = .{ .surfaces = requested.ui_surfaces, .surface = .{ .nodes = requested.ui_nodes_per_surface, .runs = requested.ui_text_runs_per_surface, .styles = requested.ui_text_styles_per_surface, .semantic_bytes = requested.ui_semantic_bytes_per_surface, }, }, }) catch { abi_allocator.destroy(engine); return null; }; return engine;}pub fn sdfii_engine_core_destroy(engine: ?*Engine) void { if (engine) |value| { value.deinit(); abi_allocator.destroy(value); }}pub fn sdfii_engine_core_world_step( engine: ?*Engine, commands: *const types.CommandBatch, input: *const types.FrameInput, out: *types.StepResult,) c_int { const e = engine orelse return low_level.SDFII_ERR_NULL_HANDLE; const api = bind(e); out.* = api.worldStep(commands.*, input.*); return 0;}pub fn sdfii_engine_core_configure_behaviors( engine: ?*Engine, request: *const types.BehaviorConfigRequest,) c_int { const e = engine orelse return low_level.SDFII_ERR_NULL_HANDLE; const api = bind(e); api.configureBehaviors(request.*) catch return -1; return 0;}pub fn sdfii_engine_core_backend_select( request: *const types.BackendSelectionRequest, out: *types.BackendSelectionResult,) c_int { out.* = Router.previewBackendSelection(request.*); return 0;}pub fn sdfii_engine_core_render_route( request: *const types.RenderRouteRequest, out: *types.RenderRouteResult,) c_int { out.* = Router.chooseRenderRoute(request.*); return 0;}pub fn sdfii_engine_core_field_query_route( request: *const types.FieldQueryRouteRequest, out: *types.FieldQueryRouteResult,) c_int { out.* = Router.chooseFieldQueryRoute(request.*); return 0;}pub fn sdfii_engine_core_failure_fallback( request: *const types.FallbackRequest, out: *types.FallbackResult,) c_int { out.* = Router.chooseFailureFallback(request.*); return 0;}pub fn sdfii_engine_core_render_plan( request: *const types.RenderPlanRequest, out: *types.RenderPlanResult,) c_int { out.* = Router.renderPlan(request.*); return 0;}pub fn sdfii_engine_core_plan_upload( request: *const types.UploadPlanRequest, out: *types.UploadPlanResult,) c_int { out.* = UploadPlanner.preview(request.*); return 0;}test "backend planner ffi honors caller-provided availability snapshots" { const summary = types.CompiledArtifactSummary{ .compiled_revision = 2, .node_count = 4, .material_count = 1, .light_count = 1, .root_node = 3, .execution_ir_version = 2, .native_payload_version = 2, .supports_graphics_output = 1, .supports_field_queries = 1, }; const availability = types.BackendAvailability{ .zig_cpu_available = 1, .accy_available = 1, }; var selection: types.BackendSelectionResult = .{}; try std.testing.expectEqual(@as(c_int, 0), sdfii_engine_core_backend_select(&.{ .summary = summary, .availability = availability, }, &selection)); try std.testing.expectEqual(@backingInt(types.BackendKind.accy), selection.selected_backend); var field_query: types.FieldQueryRouteResult = .{}; try std.testing.expectEqual(@as(c_int, 0), sdfii_engine_core_field_query_route(&.{ .summary = summary, .availability = availability, .backend = selection.selected_backend, }, &field_query)); try std.testing.expectEqual(@backingInt(types.BackendKind.accy), field_query.query_backend); try std.testing.expectEqual(@backingInt(types.FieldQueryRouteReason.native_distance_sampling), field_query.reason); var route: types.RenderRouteResult = .{}; try std.testing.expectEqual(@as(c_int, 0), sdfii_engine_core_render_route(&.{ .summary = summary, .availability = availability, .backend = selection.selected_backend, .graphics_requested = 1, }, &route)); try std.testing.expectEqual(@backingInt(types.RenderRoute.graphics_fast_path), route.route); var upload: types.UploadPlanResult = .{}; try std.testing.expectEqual(@as(c_int, 0), sdfii_engine_core_plan_upload(&.{ .summary = summary, .availability = availability, .backend = selection.selected_backend, }, &upload)); try std.testing.expectEqual(@backingInt(types.UploadPlanMode.full), upload.mode);}Source: fun/sdfii/src/engine/ffi.zig:4
zig
pub const Api = api;Audit
| Definitions | 19 |
|---|---|
| Public names | 19 |
| Members | 0 |
| Version | 26.7.0 |
| Revision | daab053ee433 |