我正在尝试使用 JsInterop 在 GWT 2.9.0 中使用 WebGPU,但在尝试将所有 WebGPU 接口映射到 Java 时遇到了一些问题。我所指的定义位于https://www.w3.org/TR/webgpu/#idl-index
1)我如何映射一个无符号长长的?
有一个 typedef:typedef [EnforceRange] unsigned long long GPUSize64;
例如在这里使用:
interface mixin GPURenderEncoderBase {
//...other declarations left out...
undefined drawIndirect(GPUBuffer indirectBuffer, GPUSize64 indirectOffset);
};
如果我把它包起来
@JsType(isNative = true, namespace = JsPackage.GLOBAL)
public class GPURenderEncoderBase {
//...other declarations left out...
@JsMethod
public final native void drawIndirect(GPUBuffer indirectBuffer, long indirectOffset);
}
我收到一条错误消息:
Parameter 'sourceOffset': type 'long' is not safe to access in JSNI code
鉴于我的更高级别的 API 仅在此处公开一个 int 以与其他 API 兼容,我可能只使用一个 int,但映射 GPUSize64 的正确解决方案是什么?
2)我如何包装字典?
当我尝试翻译以下定义时
dictionary GPUExtent3DDict {
required GPUIntegerCoordinate width;
GPUIntegerCoordinate height = 1;
GPUIntegerCoordinate depthOrArrayLayers = 1;
};
typedef (sequence<GPUIntegerCoordinate> or GPUExtent3DDict) GPUExtent3D;
像这样:
@JsType(isNative = false, namespace = JsPackage.GLOBAL)
public class GPUExtent3D {
public int width;
public int height = 1;
public int depthOrArrayLayers = 1;
}
然后按以下方式使用它:
...
GPUExtent3D size = new GPUExtent3D();
size.width = canvasWidth;
size.height = canvasHeight;
GPUCanvasConfiguration config = new GPUCanvasConfiguration();
config.size = size;
gpuCanvasContext.configure(config);
我可以编译得很好,但在运行时出现错误说
Uncaught (in promise) TypeError: Failed to execute 'configure' on 'GPUCanvasContext': Failed to read the 'size' property from 'GPUCanvasConfiguration': Failed to read the 'width' property from 'GPUExtent3DDict': Failed to read the 'width' property from 'GPUExtent3DDict': Required member is undefined.
令我困惑的是,它两次说“无法从'GPUExtent3DDict'读取'width'属性”,这暗示它需要嵌套的东西,并且可能与typedef中关于“sequence or GPUExtent3DDict”的最后一行有关,我不明白。当我以这种方式定义 GPUExtent3D 时:
public final class GPUExtent3D extends JavaScriptObject {
public static final native GPUExtent3D createNew() /*-{
return {height: 1, depthOrArrayLayers: 1};
}-*/;
protected GPUExtent3D() {}
public final native void width(int width) /*-{
this["width"] = width;
}-*/;
//...same for height and depthOrArrayLayers
}
然后像这样使用它:
...
GPUExtent3D size = GPUExtent3D.createNew();
size.width(canvasWidth);
size.height(canvasHeight);
size.depthOrArrayLayers(1);
GPUCanvasConfiguration config = new GPUCanvasConfiguration();
config.size = size;
gpuCanvasContext.configure(config);
它工作得很好,但我想用 JsInterop 方式而不是 JavaScriptObject 范围。我该怎么做呢?
3)如何映射一个枚举?
我还在这里找到了一个可行的解决方案,我想知道这是推荐的还是不推荐使用的/旧的方法给定一个枚举声明:
enum GPUPowerPreference {
"low-power",
"high-performance"
};
我可以像这样映射它吗
public final class GPUPowerPreference {
public static final String LOW_POWER = "low-power";
public static final String HIGH_POWER = "high-power";
private GPUPowerPreference() {}
}
或者有没有办法为此使用带有@JsEnum的java枚举(我试过但在值中使用的破折号有问题)
非常感谢,祝您有愉快的一天!