- Phoenix คือ เซิร์ฟเวอร์ X แบบใหม่ที่เขียนขึ้นใหม่ทั้งหมดด้วยภาษา Zig โดยไม่ได้ fork มาจาก Xorg เดิม และมุ่งเป็นทางเลือกสมัยใหม่
- ปัจจุบันสามารถรัน แอปพลิเคชันเรียบง่ายที่ใช้กราฟิก GLX, EGL, Vulkan แบบ nested ภายในเซิร์ฟเวอร์ X เดิมได้ แต่ยังไม่รองรับการรันแบบสแตนด์อโลน
- เพื่อความเรียบง่าย จึงรองรับเฉพาะแอปพลิเคชันที่เขียนในช่วง 20 ปีหลังและฮาร์ดแวร์ในช่วง 15 ปีหลัง และทำงานได้โดยไม่มีอินเทอร์เฟซไดรเวอร์ฝั่งเซิร์ฟเวอร์
- เสริม ความปลอดภัย ด้วยการแยกวิเคราะห์ข้อความโปรโตคอลอัตโนมัติ และจำกัดการเข้าถึงระหว่างแอปด้วย โครงสร้างแยกการทำงานแบบอิงการขอสิทธิ์
- รองรับเทคโนโลยีสมัยใหม่อย่าง HDR, VRR, หลายจอ, คอมโพสิตเตอร์ในตัว และมีแผนรองรับความเข้ากันได้กับ Wayland รวมถึงส่วนขยายโปรโตคอล X11
ภาพรวมของ Phoenix
- Phoenix เป็นเซิร์ฟเวอร์ X สมัยใหม่เพื่อใช้แทน Xorg โดยเป็น อิมพลีเมนเทชันที่เขียนขึ้นใหม่ทั้งหมดด้วยภาษา Zig
- ไม่ใช่การ fork จาก Xorg และมุ่งไปที่ โครงสร้างที่เรียบง่ายและปลอดภัยกว่า
- ขณะนี้ยังไม่อยู่ในระดับที่ใช้งานได้เต็มรูปแบบ และรองรับเฉพาะ การรันแบบ nested mode ภายในเซิร์ฟเวอร์ X เดิม
- สามารถทำ การเรนเดอร์เร่งด้วยฮาร์ดแวร์ ที่อิง GLX, EGL, Vulkan ได้
เป้าหมาย
ความเรียบง่าย
- เป็นเซิร์ฟเวอร์ที่เรียบง่ายกว่า Xorg โดย รองรับเพียงบางส่วนของโปรโตคอล X11
- รวมเฉพาะฟีเจอร์ที่จำเป็นสำหรับแอปพลิเคชันที่เขียนในช่วง 20 ปีหลัง
- มุ่งรองรับเฉพาะฮาร์ดแวร์ในช่วง 15 ปีหลังที่รองรับ Linux DRM และ Mesa GBM
- ไม่ใช้อินเทอร์เฟซ ไดรเวอร์ฝั่งเซิร์ฟเวอร์ แยกต่างหากเหมือน Xorg
- มีโครงสร้างคล้าย Wayland compositor
ความปลอดภัย
- ทำให้ปลอดภัยขึ้นด้วย การแยกวิเคราะห์ข้อความโปรโตคอลอัตโนมัติ
- ผ่านตัวเลือกบิลด์
ReleaseSafe ของ Zig ซึ่งช่วย ตรวจจับการทำงานที่ไม่ถูกต้องโดยอัตโนมัติ เช่น การเข้าถึงเกินขอบเขตของดัชนีอาร์เรย์
- โดยค่าเริ่มต้น แอปพลิเคชันจะทำงานแบบ แยกจากกัน
- การโต้ตอบกับแอปอื่นทำได้เฉพาะผ่าน การขอสิทธิ์ทาง GUI หรือ การให้สิทธิ์ล่วงหน้า เท่านั้น
- ตัวอย่าง: แอปบันทึกหน้าจอจะบันทึกได้เฉพาะหน้าต่างที่ระบุ
- เมื่อมีการจำกัดการเข้าถึง ไคลเอนต์จะได้รับ ข้อมูลจำลอง แทนข้อผิดพลาด
- ปุ่มลัดแบบโกลบอล จะทำงานเมื่อมีปุ่ม modifier รวมอยู่ด้วย (เช่น ctrl, shift)
- หากต้องการใช้ปุ่มลัดแบบโกลบอลโดยไม่มี modifier จะต้องมีสิทธิ์อย่างชัดเจน
- สามารถสลับกลับไปเป็น พฤติกรรมแบบเดียวกับ Xorg ได้ผ่านตัวเลือก
การรองรับเทคโนโลยีสมัยใหม่
- รองรับเทคโนโลยีจอภาพสมัยใหม่ เช่น หลายจอ, อัตรารีเฟรชต่างกัน, VRR, HDR
- ประมวลผลแยกอิสระตามแต่ละจอ แทนการใช้ framebuffer เดียว
การปรับปรุงการประมวลผลกราฟิก
- ให้ การเรนเดอร์แบบไม่มี tearing และ คอมโพสิตเตอร์ในตัว เป็นค่าเริ่มต้น
- หากมีการรันคอมโพสิตเตอร์ภายนอก (เช่น picom) จะปิดการทำงานอัตโนมัติ
- หากแอปแบบเต็มหน้าจอปิด vsync ระบบจะปรับให้เหมาะกับแอปนั้น
- มีเป้าหมายเพื่อลด latency ของ vsync และคอมโพสิตเตอร์
มาตรฐานใหม่
- กำหนดและจัดทำเอกสาร คุณสมบัติ DPI ต่อจอ (randr property)
- เพื่อให้แอปพลิเคชันสามารถสเกลคอนเทนต์ตาม DPI ของแต่ละจอได้
ส่วนขยายโปรโตคอล X11
- มีแผนจะขยายโปรโตคอล X11 เมื่อจำเป็นต่อ ฟีเจอร์ใหม่อย่าง HDR เป็นต้น
ความเข้ากันได้กับ Wayland
- คำนึงถึงกรณีที่บางแอปอาจรองรับเฉพาะ Wayland
- Phoenix อาจ รองรับ Wayland โดยตรง หรือรันผ่าน Wayland–X11 bridge (เช่น 12to11) ได้
เซิร์ฟเวอร์แสดงผลแบบ nested
- สามารถ รันแบบ nested พร้อมการเร่งด้วยฮาร์ดแวร์ภายใน X11 หรือ Wayland ได้
- มีประโยชน์ต่อการดีบัก Phoenix และ การทดสอบ window manager·compositor
- สามารถใช้เป็น เซิร์ฟเวอร์ทางเลือกของ Xwayland ในสภาพแวดล้อม Wayland ได้
สิ่งที่ไม่ใช่เป้าหมาย (Non-goals)
- การแทนที่เซิร์ฟเวอร์ Xorg อย่างสมบูรณ์ ไม่ใช่เป้าหมาย
- Xorg จะยังคงรองรับฟีเจอร์ X11 ได้มากกว่าและฮาร์ดแวร์รุ่นเก่า
- ไม่รองรับ หลาย X11 screens (รองรับเฉพาะหลายจอ)
- การเรียก GrabServer จะไม่มีผล
- เรื่อง ไคลเอนต์/เซิร์ฟเวอร์แบบ endian swap จะพิจารณาใหม่เมื่อจำเป็น
- ไม่รองรับ indirect GLX (การเรนเดอร์ระยะไกล)
- มีความซับซ้อนสูง และการสตรีมระยะไกลมีประสิทธิภาพมากกว่า
- หากจำเป็น สามารถทำการเรนเดอร์ระยะไกลผ่าน GLX proxy ได้
ความแตกต่างจากโปรโตคอล X11
- บางส่วนของโปรโตคอลแกนหลัก X11 ยังไม่ได้อิมพลีเมนต์ เช่น ฟีเจอร์เกี่ยวกับฟอนต์
- การเข้ารหัสสตริงใช้ UTF-8 เป็นค่าเริ่มต้น
- อย่างไรก็ตาม หากโปรโตคอลระบุเป็น ISO Latin-1 อย่างชัดเจนจะเป็นข้อยกเว้น
การติดตั้งและการบิลด์
การสร้างเอกสารโปรโตคอล X11
- คำสั่ง:
zig build -Dgenerate-docs=true
- ผลลัพธ์: สร้างไฟล์
.txt ใน ./zig-out/protocol/
- เป็นเอกสารที่สร้างอัตโนมัติในรูปแบบสไตล์เอกสารทางการ และ ยังเป็นฟีเจอร์ที่กำลังดำเนินการอยู่
การพึ่งพา
- Zig 0.14.1
- x11 (xcb) — สำหรับโหมด nested ของ X11 (
-Dbackends=x11)
- wayland (wayland-client, wayland-egl) — สำหรับโหมด nested ของ Wayland (
-Dbackends=wayland, ยังไม่รองรับในปัจจุบัน)
- drm (libdrm, gbm) — สำหรับการรันแบบสแตนด์อโลน (
-Dbackends=drm, ยังไม่รองรับในปัจจุบัน)
- OpenGL (libglvnd) — ให้
gl และ egl
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
แนวทางที่จะปรับโครงสร้าง X server ใหม่ใน สไตล์ Wayland น่าสนใจมาก
การรวม display server กับ compositor เข้าด้วยกันเป็นพื้นฐาน, แยกแอปออกจากกันโดยปริยาย, ตัดความสามารถรีโมตของ GLX ออก, และกล้าทิ้งโปรโตคอลรุ่นเก่า เป็นสิ่งที่น่าประทับใจ
ไม่แน่ใจว่าใครบ้างที่จะต้องการสิ่งนี้ แต่ตัวเลือกนี้ก็ดูสมเหตุสมผลไม่น้อย
ถ้าอย่างนั้นก็ไม่แน่ใจว่าความต่างคืออะไร อาจเป็นเพราะการวิเคราะห์ของฉัน ยังไม่ครบถ้วน
ยิ่งถ้ารันแอป Wayland ได้ด้วย ก็อาจมีผู้ใช้เลือกมันมากกว่าเดิมจริง ๆ
ชื่อ Phoenix ถูกใช้เยอะเกินไปแล้ว
มีทั้ง Phoenix ในเฟรมเวิร์ก Elixir และก็จำได้ว่าเคยเห็นในโปรเจกต์อื่นอีกหลายครั้ง
มันเป็นชื่อที่โหลพอ ๆ กับ ‘Apollo’ เลยคิดว่าถ้าจะทำโปรเจกต์ใหม่ควรค้นหาชื่อก่อน
ฝั่งนั้นมีชื่อแปลก ๆ เยอะอย่าง bandit, cowboy, thousand island, ranch, mint, finch
แล้วก็ยังมี ชื่อซ้ำกัน แบบ ExThing, ThingEx, Thingx บ่อยจนงงว่าอะไรคือมาตรฐาน
จำได้ว่าแม้แต่ในยุค 1980s ก็มีการตั้งชื่อซอฟต์แวร์ใหม่แบบนี้
ใน wxPython ก็มีโปรเจกต์ Phoenix เหมือนกัน เป็นชื่อที่เท่แต่ใช้กันเยอะเกินไป
โปรเจกต์นี้เจ๋งมาก
ฉันชอบ Wayland แต่ก็ยังรู้สึกคาใจกับ portal protocol และกลไกส่วนขยาย
เมื่อเทียบกับ Windows หรือ macOS ยังมีจุดที่ด้อยกว่าในแง่ productivity
การเขียน X11 ใหม่โดยมีความปลอดภัยฝังมาในตัว เป็นแนวทางที่น่าคาดหวัง
ดูเป็นโปรเจกต์ที่มีประโยชน์ และหวังว่าจะพัฒนาไปได้ดี
เมื่อต้นทศวรรษ 2000 แค่ติดตั้งยังยาก และแทบเป็นไปไม่ได้เลยสำหรับผู้ใช้ทั่วไปที่จะติดตั้งเอง
Linux distro ติดตั้งง่ายกว่ามาก และเหตุผลที่ Windows ช้าลงแล้วคนต้องซื้อ PC ใหม่ก็เพราะแบบนั้น
ที่บริษัทก็ทำงานบน GNOME + Wayland ได้โดยไม่มีปัญหา
ยินดีที่ได้เห็น โปรเจกต์อนุรักษ์ X แบบนี้
แม้จะชอบ Wayland มากกว่า แต่ก็ยังคิดว่ามีบางพื้นที่ที่ X ยังจำเป็นอยู่
ทีมพัฒนาใหม่ควรมาช่วยแบ่งภาระ
ถึงเวลาฝัง X11 ไปให้หมดและโฟกัสกับ display server เดียวแล้ว
ไม่รู้ว่าโปรเจกต์นี้จะทำงานได้ดีแค่ไหน แต่
ท่ามกลางกระแสรวมศูนย์โดยองค์กร (เช่น Wayland, GNOME, KDE ที่มีนักพัฒนาได้เงินเดือน)
ผมคิดว่าการมี โปรเจกต์คู่แข่ง เพิ่มขึ้นเป็นเรื่องดี
และก็สงสัยว่าถ้าจะทำ Xorg ให้ทันสมัยต้องใช้เงินทุนมากแค่ไหน
Wayland ออกมาตั้งแต่ปี 2008 แต่ผ่านมาเกือบ 20 ปีก็ยังตอบโจทย์ผู้ใช้ได้ไม่ครบ
การพยายามทำให้ตรงกับสเปกแคบ ๆ ที่องค์กรต้องการทำให้เห็นข้อจำกัดชัดเจน
นักพัฒนาแอปสามารถระบุ release mode ใน build script เป็นรูปแบบ
zig build --releaseได้หรือผู้ใช้จะส่ง
--releaseเองก็ได้ดูเหมือนผู้เขียน Phoenix จะเลือก โหมด ReleaseSafe เป็น release ทางการ
อีกอย่าง Phoenix ก็เป็นชื่อบ้านเกิดของผมด้วย
gpu-screen-recorder ที่ผู้เขียนคนเดียวกันทำ
คือ โปรแกรมอัดหน้าจอที่ดีที่สุด ที่ผมเคยใช้บน Wayland
อัด 4K 60fps ได้ทันทีแทบไม่ต้องตั้งค่าอะไร
สงสัยว่า แอป X11 รุ่นเก่า อย่าง xterm, emacs, xfig, ghostview จะใช้งานได้ไหม
จึงมีโอกาสสูงว่าจะทำงานได้ไม่สมบูรณ์ แต่ตัว implementation เองไม่ได้ซับซ้อน
เห็นว่าระบุว่าไม่ตั้งเป้ารองรับหลายหน้าจอ
งั้นก็สงสัยว่าจะใช้กับ window manager ที่รองรับ virtual desktop (อย่าง i3) ไม่ได้หรือเปล่า
ก็ไม่ได้มีปัญหากับการใช้หลายจอหรือ virtual desktop
น่าสนใจที่มันไม่ได้ใช้ XML protocol spec เพื่อ generate โค้ดแบบเดียวกับ Xorg