Handle surface locking/unlocking on X11 (OpenGL-related)

This commit is contained in:
Pazaz 2022-04-20 16:48:32 -04:00
parent 8119ba8336
commit 3f54273220
2 changed files with 42 additions and 21 deletions

View file

@ -125,6 +125,8 @@ public final class GlRenderer {
@OriginalMember(owner = "client!tf", name = "I", descriptor = "Lclient!na;") @OriginalMember(owner = "client!tf", name = "I", descriptor = "Lclient!na;")
private static final JagString RADEON = Static28.parse("radeon"); private static final JagString RADEON = Static28.parse("radeon");
private static JAWTWindow window;
@OriginalMember(owner = "client!tf", name = "a", descriptor = "(Ljava/lang/String;)Lclient!na;") @OriginalMember(owner = "client!tf", name = "a", descriptor = "(Ljava/lang/String;)Lclient!na;")
private static JagString method4147(@OriginalArg(0) String arg0) { private static JagString method4147(@OriginalArg(0) String arg0) {
@Pc(3) byte[] local3; @Pc(3) byte[] local3;
@ -322,7 +324,7 @@ public final class GlRenderer {
} }
@OriginalMember(owner = "client!tf", name = "a", descriptor = "(Ljava/awt/Canvas;)V") @OriginalMember(owner = "client!tf", name = "a", descriptor = "(Ljava/awt/Canvas;)V")
public static void method4161(@OriginalArg(0) Canvas canvas) { public static void createAndDestroyContext(@OriginalArg(0) Canvas canvas) {
try { try {
if (!canvas.isDisplayable()) { if (!canvas.isDisplayable()) {
return; return;
@ -341,7 +343,7 @@ public final class GlRenderer {
glContext.release(); glContext.release();
glContext.destroy(); glContext.destroy();
glDrawable.setRealized(false); glDrawable.setRealized(false);
} catch (@Pc(30) Throwable local30) { } catch (@Pc(30) Throwable ex) {
} }
} }
@ -394,10 +396,10 @@ public final class GlRenderer {
vendor = gl.glGetString(GL2.GL_VENDOR); vendor = gl.glGetString(GL2.GL_VENDOR);
renderer = gl.glGetString(GL2.GL_RENDERER); renderer = gl.glGetString(GL2.GL_RENDERER);
@Pc(12) String vendor = GlRenderer.vendor.toLowerCase(); @Pc(12) String vendor = GlRenderer.vendor.toLowerCase();
if (vendor.indexOf("microsoft") != -1) { if (vendor.contains("microsoft")) {
result = 1; result = 1;
} }
if (vendor.indexOf("brian paul") != -1 || vendor.indexOf("mesa") != -1) { if (vendor.contains("brian paul") || vendor.contains("mesa")) {
result |= 0x1; result |= 0x1;
} }
@Pc(39) String version = gl.glGetString(GL2.GL_VERSION); @Pc(39) String version = gl.glGetString(GL2.GL_VERSION);
@ -483,29 +485,38 @@ public final class GlRenderer {
Static172.quit(); // MaterialManager Static172.quit(); // MaterialManager
} catch (@Pc(5) Throwable local5) { } catch (@Pc(5) Throwable local5) {
} }
gl = null;
} }
if (context != null) {
Static63.clear(); // GlCleaner if (window != null) {
try { if (!window.getLock().isLocked()) {
if (GLContext.getCurrent() == context) { window.lockSurface();
context.release(); }
if (context != null) {
Static63.clear(); // GlCleaner
try {
if (GLContext.getCurrent() == context) {
context.release();
}
} catch (@Pc(17) Throwable ex) {
}
try {
context.destroy();
} catch (@Pc(21) Throwable ex) {
} }
} catch (@Pc(17) Throwable ex) {
} }
try {
context.destroy();
} catch (@Pc(21) Throwable ex) {
}
context = null;
} }
if (drawable != null) { if (drawable != null) {
try { try {
drawable.setRealized(false); drawable.setRealized(false);
} catch (@Pc(30) Throwable ex) { } catch (@Pc(30) Throwable ex) {
} }
drawable = null;
} }
window = null;
gl = null;
context = null;
drawable = null;
Static120.method2398(); // LightingManager Static120.method2398(); // LightingManager
enabled = false; enabled = false;
} }
@ -659,9 +670,16 @@ public final class GlRenderer {
} }
@Pc(18) GLDrawableFactory factory = GLDrawableFactory.getFactory(profile); @Pc(18) GLDrawableFactory factory = GLDrawableFactory.getFactory(profile);
AWTGraphicsConfiguration config = AWTGraphicsConfiguration.create(canvas.getGraphicsConfiguration(), capabilities, capabilities); AWTGraphicsConfiguration config = AWTGraphicsConfiguration.create(canvas.getGraphicsConfiguration(), capabilities, capabilities);
JAWTWindow window = NewtFactoryAWT.getNativeWindow(canvas, config); window = NewtFactoryAWT.getNativeWindow(canvas, config);
drawable = factory.createGLDrawable(window); if (!window.getLock().isLocked()) {
drawable.setRealized(true); window.lockSurface();
}
try {
drawable = factory.createGLDrawable(window);
drawable.setRealized(true);
} finally {
window.unlockSurface();
}
@Pc(29) int swapBuffersAttempts = 0; @Pc(29) int swapBuffersAttempts = 0;
@Pc(36) int result; @Pc(36) int result;
while (true) { while (true) {
@ -678,6 +696,9 @@ public final class GlRenderer {
} }
Static231.sleep(1000L); Static231.sleep(1000L);
} }
if (window.getLock().isLocked()) {
window.unlockSurface();
}
gl = GLContext.getCurrentGL().getGL2(); gl = GLContext.getCurrentGL().getGL2();
new GLUgl2es1(); new GLUgl2es1();
enabled = true; enabled = true;

View file

@ -117,7 +117,7 @@ public final class Static197 {
} }
} }
if (arg1 == 0 && arg3 > 0) { if (arg1 == 0 && arg3 > 0) {
GlRenderer.method4161(Static154.canvas); GlRenderer.createAndDestroyContext(Static154.canvas);
} }
if (arg2 && arg1 > 0) { if (arg2 && arg1 > 0) {
Static154.canvas.setIgnoreRepaint(true); Static154.canvas.setIgnoreRepaint(true);