importextensionex.pas2js.wasmapi.pp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. {
  2. This file is part of the Fresnel Library.
  3. Copyright (c) 2025 by the FPC & Lazarus teams.
  4. Pas2js Fresnel interface - Webassembly rendering API
  5. See the file COPYING.modifiedLGPL.txt, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit importextensionex.pas2js.wasmapi;
  12. {$mode ObjFPC}
  13. interface
  14. uses
  15. JS, WebOrWorker, wasienv, webassembly;
  16. type
  17. (*
  18. TImportExtension extended class that introduces
  19. - mechanism for cahing the DataView, to be extended with memory growth notification
  20. - methods to get/set utf16 strings from wasm memory without utf8 roundtrips
  21. *)
  22. { TImportExtensionEx }
  23. TImportExtensionEx = class (TImportExtension)
  24. private
  25. FWebAssemblyMemory : TJSArrayBuffer;
  26. FMemoryDataView : TJSDataView;
  27. FEnvMemoryDataView : TJSDataView;
  28. protected
  29. function GetUTF16FromMem(p : TWasmPointer; sizeInChars : Integer) : String;
  30. procedure SetUTF16ToMem(p : TWasmPointer; const text : String);
  31. procedure SetWebAssemblyMemory(aMemory : TJSArrayBuffer);
  32. function GetModuleMemoryDataView : TJSDataView; reintroduce; deprecated 'Use MemoryDataView';
  33. function GetMemoryDataView : TJSDataView;
  34. public
  35. property MemoryDataView : TJSDataView read GetMemoryDataView;
  36. property WebAssemblyMemory : TJSArrayBuffer read FWebAssemblyMemory write SetWebAssemblyMemory;
  37. end;
  38. implementation
  39. { TImportExtensionEx }
  40. // GetUTF16FromMem
  41. //
  42. function TImportExtensionEx.GetUTF16FromMem(p: TWasmPointer; sizeInChars: Integer): String;
  43. begin
  44. Result:=Env.GetUTF16StringFromMem(P,SizeInChars);
  45. end;
  46. // SetUTF16ToMem
  47. //
  48. procedure TImportExtensionEx.SetUTF16ToMem(p: TWasmPointer; const text: String);
  49. begin
  50. Env.SetUTF16StringInMem(P,Text);
  51. end;
  52. // SetWebAssemblyMemory
  53. //
  54. procedure TImportExtensionEx.SetWebAssemblyMemory(aMemory: TJSArrayBuffer);
  55. begin
  56. if FWebAssemblyMemory = aMemory then
  57. Exit;
  58. FWebAssemblyMemory := aMemory;
  59. if aMemory <> nil then
  60. FMemoryDataView := TJSDataView.New(aMemory)
  61. else FMemoryDataView := nil;
  62. end;
  63. // GetModuleMemoryDataView
  64. //
  65. function TImportExtensionEx.GetModuleMemoryDataView: TJSDataView;
  66. begin
  67. Result := inherited getModuleMemoryDataView;
  68. end;
  69. // GetMemoryDataView
  70. //
  71. function TImportExtensionEx.GetMemoryDataView: TJSDataView;
  72. var
  73. envMemory : JSValue;
  74. envWebAssemblyMemory : TJSWebAssemblyMemory absolute envMemory;
  75. begin
  76. if FWebAssemblyMemory = nil then
  77. begin
  78. envMemory := InstanceExports.Memory;
  79. if envMemory then
  80. begin
  81. if (FEnvMemoryDataView = nil) or (FEnvMemoryDataView.buffer <> envWebAssemblyMemory.buffer) then
  82. FEnvMemoryDataView := TJSDataView.New(envWebAssemblyMemory.buffer);
  83. Exit(FEnvMemoryDataView);
  84. end
  85. else
  86. Console.error('Memory not accessible from this call chain');
  87. end;
  88. Result := FMemoryDataView;
  89. end;
  90. end.