From c44d37b5cf83823c3403a622345a92ae93449f40 Mon Sep 17 00:00:00 2001
From: yuanhecai <[EMAIL REDACTED]>
Date: Mon, 10 Nov 2025 09:36:13 +0800
Subject: [PATCH] loongarch: Switch to software render when using LG100 series
---
src/render/SDL_render.c | 42 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index cc3d16959bcb1..ae435d63a174b 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -29,6 +29,12 @@
#include "software/SDL_render_sw_c.h"
#include "../video/SDL_pixels_c.h"
+#if defined(__loongarch__)
+#if SDL_VIDEO_OPENGL
+#include "SDL_opengl.h"
+#endif /* SDL_VIDEO_OPENGL */
+#endif
+
#if defined(__ANDROID__)
#include "../core/android/SDL_android.h"
#endif
@@ -954,6 +960,34 @@ static void SDL_CalculateSimulatedVSyncInterval(SDL_Renderer *renderer, SDL_Wind
}
#endif /* !SDL_RENDER_DISABLED */
+#if defined(__loongarch__)
+static SDL_bool SDL_CheckIntegratedGraphics()
+{
+ SDL_Window *window = SDL_CreateWindow("OpenGL test", -32, -32, 32, 32,
+ SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN);
+ SDL_bool has_lg100_or_lg110 = SDL_FALSE;
+
+ if (window) {
+ SDL_GLContext context = SDL_GL_CreateContext(window);
+
+ if (context) {
+ const GLubyte *(APIENTRY *glGetStringFunc)(GLenum) =
+ SDL_GL_GetProcAddress("glGetString");
+ if (glGetStringFunc) {
+ const char *renderer = (const char*)glGetStringFunc(GL_RENDERER);
+ if (renderer && (SDL_strstr(renderer, "LG110") ||
+ SDL_strstr(renderer, "LG100"))) {
+ has_lg100_or_lg110 = SDL_TRUE;
+ }
+ }
+ SDL_GL_DeleteContext(context);
+ }
+ SDL_DestroyWindow(window);
+ }
+ return has_lg100_or_lg110;
+}
+#endif
+
SDL_Renderer *SDL_CreateRenderer(SDL_Window *window, int index, Uint32 flags)
{
#ifndef SDL_RENDER_DISABLED
@@ -967,6 +1001,14 @@ SDL_Renderer *SDL_CreateRenderer(SDL_Window *window, int index, Uint32 flags)
Android_ActivityMutex_Lock_Running();
#endif
+/* CPU acceleration runs faster than integrated graphics on Loongson at present. */
+#if defined(__linux__) && defined(__loongarch__)
+ if (SDL_CheckIntegratedGraphics()) {
+ SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION, "0");
+ flags = SDL_RENDERER_SOFTWARE;
+ }
+#endif
+
if (!window) {
SDL_InvalidParamError("window");
goto error;