Update #53 - Improved FPS, reduced WebGL context loss crashes

This commit is contained in:
lax1dude
2025-07-06 12:31:55 -07:00
parent f3281c037f
commit 332a7bb11f
53 changed files with 568 additions and 383 deletions

View File

@ -22,6 +22,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.teavm.interop.Address;
import org.teavm.interop.Import;
import org.teavm.jso.JSBody;
import org.teavm.jso.JSObject;
@ -41,6 +42,7 @@ import org.teavm.jso.webaudio.PannerNode;
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
import net.lax1dude.eaglercraft.v1_8.internal.buffer.MemoryStack;
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayConverter;
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayCopy;
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.BetterJSStringConverter;
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.JOrbisAudioBufferDecoder;
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.WASMGCClientConfigAdapter;
@ -100,7 +102,10 @@ public class PlatformAudio {
if (silenceFile != null) {
MemoryStack.push();
try {
initKeepAliveHack(WASMGCDirectArrayConverter.byteArrayToStackU8Array(silenceFile));
int len = silenceFile.length;
Address addr = MemoryStack.malloc(len);
WASMGCDirectArrayCopy.memcpy(addr, silenceFile, 0, len);
initKeepAliveHack(addr, len);
}finally {
MemoryStack.pop();
}
@ -112,7 +117,7 @@ public class PlatformAudio {
private static native AudioContext getContext();
@Import(module = "platformAudio", name = "initKeepAliveHack")
private static native void initKeepAliveHack(Uint8Array array);
private static native void initKeepAliveHack(Address addr, int length);
protected static class BrowserAudioResource implements IAudioResource {

View File

@ -199,7 +199,7 @@ public class PlatformOpenGL {
@Import(module = "platformOpenGL", name = "glReadPixels")
static native void _wglReadPixelsN(int x, int y, int width, int height, int format, int type, ArrayBufferView array);
@Import(module = "platformOpenGL", name = "glReadPixels0")
@Import(module = "platformOpenGL", name = "glReadPixels")
static native void _wglReadPixelsN(int x, int y, int width, int height, int format, int type, ArrayBufferView array, int offset);
@Import(module = "platformOpenGL", name = "glPolygonOffset")
@ -367,7 +367,7 @@ public class PlatformOpenGL {
@Import(module = "platformOpenGL", name = "glBufferData")
static native void _wglBufferDataN(int target, ArrayBufferView typedArray, int usage);
@Import(module = "platformOpenGL", name = "glBufferData0")
@Import(module = "platformOpenGL", name = "glBufferData")
static native void _wglBufferDataN(int target, ArrayBufferView typedArray, int usage, int srcOffset, int length);
public static void _wglBufferSubData(int target, int dstOffset, ByteBuffer buffer) {
@ -397,7 +397,7 @@ public class PlatformOpenGL {
@Import(module = "platformOpenGL", name = "glBufferSubData")
static native void _wglBufferSubDataN(int target, int dstOffset, ArrayBufferView typedArray);
@Import(module = "platformOpenGL", name = "glBufferSubData0")
@Import(module = "platformOpenGL", name = "glBufferSubData")
static native void _wglBufferSubDataN(int target, int dstOffset, ArrayBufferView typedArray, int srcOffset, int length);
public static void _wglBindVertexArray(IVertexArrayGL objId) {
@ -450,7 +450,7 @@ public class PlatformOpenGL {
static native void _wglTexImage3DN(int target, int level, int internalFormat, int width, int height, int depth,
int border, int format, int type, ArrayBufferView typedArray);
@Import(module = "platformOpenGL", name = "glTexImage3D0")
@Import(module = "platformOpenGL", name = "glTexImage3D")
static native void _wglTexImage3DN(int target, int level, int internalFormat, int width, int height, int depth,
int border, int format, int type, ArrayBufferView typedArray, int offset);
@ -513,7 +513,7 @@ public class PlatformOpenGL {
static native void _wglTexImage2DN(int target, int level, int internalFormat, int width, int height, int border,
int format, int type, ArrayBufferView typedArray);
@Import(module = "platformOpenGL", name = "glTexImage2D0")
@Import(module = "platformOpenGL", name = "glTexImage2D")
static native void _wglTexImage2DN(int target, int level, int internalFormat, int width, int height, int border,
int format, int type, ArrayBufferView typedArray, int offset);
@ -565,7 +565,7 @@ public class PlatformOpenGL {
static native void _wglTexSubImage2D(int target, int level, int offsetx, int offsety, int width, int height,
int format, int type, ArrayBufferView typedArray);
@Import(module = "platformOpenGL", name = "glTexSubImage2D0")
@Import(module = "platformOpenGL", name = "glTexSubImage2D")
static native void _wglTexSubImage2D(int target, int level, int offsetx, int offsety, int width, int height,
int format, int type, ArrayBufferView typedArray, int offset);
@ -658,6 +658,9 @@ public class PlatformOpenGL {
@Import(module = "platformOpenGL", name = "glDrawElements")
public static native void _wglDrawElements(int mode, int count, int type, int offset);
@Import(module = "platformOpenGL", name = "glDrawRangeElements")
public static native void _wglDrawRangeElements(int mode, int start, int end, int count, int type, int offset);
@Import(module = "platformOpenGL", name = "glDrawArraysInstanced")
public static native void _wglDrawArraysInstanced(int mode, int first, int count, int instanced);

View File

@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.teavm.interop.Address;
import org.teavm.interop.Import;
import org.teavm.jso.JSBody;
import org.teavm.jso.JSObject;
@ -32,6 +33,7 @@ import org.teavm.jso.typedarrays.Uint8Array;
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime.JSEagRuntimeEvent;
import net.lax1dude.eaglercraft.v1_8.internal.buffer.MemoryStack;
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayConverter;
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayCopy;
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.BetterJSStringConverter;
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
@ -226,8 +228,10 @@ public class PlatformWebView {
}else if(packet.type == SPacketWebViewMessageV4EAG.TYPE_BINARY) {
MemoryStack.push();
try {
sendBinaryMessage(BetterJSStringConverter.stringToJS(currentMessageChannelName),
WASMGCDirectArrayConverter.byteArrayToStackU8Array(packet.data));
int len = packet.data.length;
Address addr = MemoryStack.malloc(len);
WASMGCDirectArrayCopy.memcpy(addr, packet.data, 0, len);
sendBinaryMessage(BetterJSStringConverter.stringToJS(currentMessageChannelName), addr, len);
}finally {
MemoryStack.pop();
}
@ -241,7 +245,7 @@ public class PlatformWebView {
private static native void sendStringMessage(JSString ch, JSString str);
@Import(module = "platformWebView", name = "sendBinaryMessage")
private static native void sendBinaryMessage(JSString ch, Uint8Array bin);
private static native void sendBinaryMessage(JSString ch, Address addr, int length);
private static void sendMessageToServer(String channelName, int type, byte[] data) {
if(channelName.length() > 255) {

View File

@ -16,6 +16,7 @@
package net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm;
import org.teavm.interop.Address;
import org.teavm.interop.Import;
import org.teavm.jso.JSObject;
import org.teavm.jso.JSProperty;
@ -124,16 +125,14 @@ public class IndexedDBFilesystem implements IEaglerFilesystem {
@Override
public void eaglerWrite(String pathName, ByteBuffer data) {
int len = data.remaining();
Uint8Array arr = new Uint8Array(len);
arr.set(WASMGCBufferAllocator.getByteBufferView(data));
if(!eaglerWrite(database, BetterJSStringConverter.stringToJS(pathName), arr.getBuffer())) {
throw new EaglerFileSystemException("Failed to write " + len + " byte file to indexeddb table: " + pathName);
if(!eaglerWrite(database, BetterJSStringConverter.stringToJS(pathName),
WASMGCBufferAllocator.getByteBufferAddress(data), data.remaining())) {
throw new EaglerFileSystemException("Failed to write " + data.remaining() + " byte file to indexeddb table: " + pathName);
}
}
@Import(module = "platformFilesystem", name = "eaglerWrite")
private static native boolean eaglerWrite(IDBDatabase database, JSString pathName, ArrayBuffer arr);
private static native boolean eaglerWrite(IDBDatabase database, JSString pathName, Address addr, int length);
@Override
public boolean eaglerExists(String pathName) {

View File

@ -21,7 +21,6 @@ import java.util.List;
import org.teavm.jso.JSObject;
import org.teavm.jso.JSProperty;
import org.teavm.jso.core.JSString;
import org.teavm.jso.typedarrays.Uint8Array;
import net.lax1dude.eaglercraft.v1_8.EagUtils;