OpenGL backend (no more software rendering!)

This commit is contained in:
2026-08-28 06:44:02 -07:00
parent 80e222fa04
commit e300335e8a
8 changed files with 426 additions and 41 deletions
+4 -38
View File
@@ -55,7 +55,7 @@
#ifdef _WIN32
static ImXui::D3D11Renderer s_renderer;
#else
static ImXui::SoftwareRenderer s_renderer;
static ImXui::OpenGLRenderer s_renderer;
#endif
static ImXui::Canvas s_canvas;
static bool s_running = true;
@@ -2773,30 +2773,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {
CoUninitialize();
return 0;
}
#else
// 24-bit visuals expect BGRA byte order on x86, the renderer gives RGBA
static void swizzleToBlit() {
const uint8_t* fb = s_renderer.getFramebuffer();
size_t n = s_blit.size();
for (size_t i = 0; i < n; i += 4) {
s_blit[i] = fb[i + 2];
s_blit[i + 1] = fb[i + 1];
s_blit[i + 2] = fb[i];
s_blit[i + 3] = 255;
}
}
static void rebuildImage() {
if (s_img) XDestroyImage(s_img);
int w = s_renderer.getWidth();
int h = s_renderer.getHeight();
s_blit.resize((size_t)w * h * 4);
s_img = XCreateImage(s_dpy, s_visual, s_depth, ZPixmap, 0,
(char*)s_blit.data(), w, h, 32, w * 4);
}
static int x11Vk(KeySym ks, bool ctrl) {
switch (ks) {
case XK_Left: return VK_LEFT;
@@ -2838,7 +2815,6 @@ static void handleXEvent(XEvent& ev, Atom wmDelete) {
(ev.xconfigure.width != s_renderer.getWidth() ||
ev.xconfigure.height != s_renderer.getHeight())) {
s_renderer.resize(ev.xconfigure.width, ev.xconfigure.height);
rebuildImage();
layoutUI();
s_needRender = true;
}
@@ -3000,8 +2976,6 @@ int main() {
ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
StructureNotifyMask);
XMapWindow(s_dpy, s_win);
s_gc = XCreateGC(s_dpy, s_win, 0, nullptr);
s_curArrow = XCreateFontCursor(s_dpy, XC_left_ptr);
s_curIBeam = XCreateFontCursor(s_dpy, XC_xterm);
s_curHand = XCreateFontCursor(s_dpy, XC_hand2);
@@ -3018,7 +2992,7 @@ int main() {
XSetInputFocus(s_dpy, s_win, RevertToParent, CurrentTime);
XFlush(s_dpy);
if (!s_renderer.init(nullptr, 1280, 800)) {
if (!s_renderer.init(s_dpy, 1280, 800)) {
fprintf(stderr, "Renderer init failed\n");
return 1;
}
@@ -3038,9 +3012,7 @@ int main() {
setFontIdx(1);
layoutUI();
scrollToCaret();
s_rendererReady = true;
rebuildImage();
scrollToCaret(); s_rendererReady = true;
unsigned long lastBlink = nowMs();
while (s_running) {
@@ -3071,17 +3043,11 @@ int main() {
drawFileDialog();
s_renderer.endFrame(false);
s_blinkOnly = false;
swizzleToBlit();
XPutImage(s_dpy, s_win, s_gc, s_img, 0, 0, 0, 0,
s_renderer.getWidth(), s_renderer.getHeight());
XFlush(s_dpy);
}
usleep(5000);
if (!s_needRender && XPending(s_dpy) == 0) usleep(1000);
}
s_renderer.shutdown();
XDestroyImage(s_img);
XFreeGC(s_dpy, s_gc);
XDestroyWindow(s_dpy, s_win);
XCloseDisplay(s_dpy);
return 0;