OpenGL backend (no more software rendering!)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user