V8 Fast API Calls
BlinkOn 14
Austin Eng / Google
Today’s V8 → Blink Bindings (Simplified)
function foo() {� …� obj.draw(3, ...);� ...�}
void DrawOperationCallback(v8::FunctionCallbackInfo<v8::Value>& info) {� …� v8::Local<v8::Object> v8_receiver = info.This();� WebGPURenderPassEncoder* blink_receiver =� V8WebGPURenderPassEncoder::ToWrappableUnsafe(v8_receiver);� …� auto&& arg1 = NativeValueTraits<IDLUnsignedLong>::ArgumentValue(� isolate, 0, info[0], exception_state);� …� blink_receiver->draw(arg1, ...)�}
void GPURenderPassEncoder::draw(uint32_t count, ...) {� …�}
V8 Fast API Bindings (Simplified)
function foo() {� …� obj.draw(3, ...);� ...�}
void DrawOperationNoAllocDirectCallback(� v8::Value* arg0_receiver, uint32_t arg1_count, ...) {� GPURenderPassEncoder* blink_receiver =� ToScriptWrappable(static_cast<v8::Object*>(arg0_receiver))� ->ToImpl<GPURenderPassEncoder>();�� blink_receiver->draw(arg1_count, ...)�}
void GPURenderPassEncoder::draw(uint32_t count, ...) {� …�}
V8 Fast API Bindings - Why is it faster?
Code path kicks in after Turbofan optimizes the callsite
20% Reduction in Main Thread CPU Time
V8 Fast API Call Restrictions
DeferredActions Queue
What’s Next?