ישנו דרייבר אחד בלינוקס שיש לו היסטוריה ארוכה של בעיות "פוליטיות" והגדרות טכניות – זהו הדרייברים של כרטיסי המסך של nVidia. רבות כבר נכתב על הדרייברים של nVidia, כמה הם סגורים, מורכבים, לא תואמים תמיד, ו"עקשנים" בסירובם לרוץ בסביבות מסויימות.
לאלו החדשים בעולם הלינוקס, אתן היסטוריה קצרה (השאר יכולים לדלג כמה פיסקאות קדימה).
בלינוקס ישנם 2 סוגים של דרייברים לכרטיסים הגרפיים של nVidia ל-PC (ל-ARM זה סיפור אחר לגמרי). ישנו הדרייבר הפתוח בשם Nouveua. זהו דרייבר שנעשה ע"י "הנדסה לאחור" (Reverse Engineering) והוא בקוד פתוח. הדרייבר הזה נותן תמיכה טובה בגרפיקה דו/תלת מימד, וידאו, Boot גרפי ועוד. החל מפברואר חברת nVidia החלה גם לתרום קוד לדרייבר הזה (ולפני כן היא בשקט תרמה כרטיסים חדשים לפני יציאה רשמית כך שכרטיסים חדשים נתמכו ע"י הדרייבר ביום הראשון שהם יצאו לשוק). הדרייבר הזה יכול לשמש משתמשי לינוקס עם 1-2 מסכים בצורה די טובה אבל הוא חלש בביצועים בכל הקשור למשחקים, עריכת וידאו, תוכנות תלת מימד וכו'.
מהצד השני ישנו דרייבר בינארי רשמי של nVidia. הדרייבר הזה תומך בכל תכונה שיש לכרטיסי המסך מבוססי nVidia כולל תמיכה בדברים חדשים כמו Display Port, Thunderbolt (ללא "הכנסה חמה"), כרטיסים מרובים במחשב אחד, SLI, גרפיקה ווידאו מהיר (אותה מהירות כמו Windows). הדרייבר עצמו הוא סגור (הסיבות שהן סגור: הדרייברים של לינוקס, מק ו-Windows משתמשים באותו קוד בסיס ועקב שילוב של קוד מגורמים שונים מחוץ ל-nVidia – אין אפשרות לשחרר אותו), מה שגורם לו להיות בעייתי בעולם הלינוקס, עולם שבו גירסת הליבה משתנה תדיר והמשתמש גם יכול לשנות את הגירסה, ומכיוון שרוב הדרייבר הוא מודול ליבה (מפלצתי – 11.3 מגהבייט. שזה פי כמה וכמה יותר מכל מודול בליבה), יש צורך בקימפול מחדש בכל פעם שמשנים קרנל (ב-fedora יש את dkms ו-akmod שמטפלים בכך אוטומטית בעת הפעלת הלינוקס) – כך שמבחינת ביצועים הדרייבר יתן לך תוצאות טובות, אולם הדרך להגיע לשם היא לא תמיד קלה.
אחת הבעיות הגדולות עם הדרייבים הרשמיים של nVidia היא להסתדר עם ציוד בעייתי, וכשאני מדבר על ציוד בעייתי, אני מדבר על ציודים עלומי שם שלא ממש מחזירים מידע שהדרייבר מצפה לקבל. כך לדוגמא, הח"מ משתמש במסך IPS עם רזולוציית 2560X1440 מייצור קוריאני ללא שם (על המסך כתוב CrossOver אולם כשמנסים לקרוא דרך לינוקס וכרטיס המסך את הפרטים של הכרטיס, מקבלים תשובה של QHD270QHD270QHD270 וג'יבריש בכל הקשור לרזולוציות שהמסך תומך). כשהחלק הגרפי (Xorg) בלינוקס עולה, הדרייבר מיד נופל בטענה שהוא לא מכיר את המסך הזה. לעומתו הדרייבר החופשי Nouveau מבין שזהו עוד מסך עלום שם עם רזולוצייה של 2560X1440 והוא פשוט מתעלם ממה שהמסך אומר ומפעיל עליו את הרזולוציה הנ"ל – וזה עובד מצוין, רק שביצועי תלת מימד/משחקים וכו' לא תקבל.
הפתרון עם הדרייבר הסגור לבעיה זו היא לעקוף את המסך הבעייתי (אם יש לך יותר ממסך אחד), אך לפני כן אנו צריכים להבין איך הדרייבר מזהה את המסכים המחוברים אליו.
בעקרון יש מספר סוגי חיבורים שהדרייבר מתייחס אליהם. אני אתעלם כרגע מחיבורים פנימיים (LVDS – זה מתאים למערכות משובצות ומערכות אחרות שאינן חלק מהפוסט הזה) ונתייחס לחיבורים חיצוניים:
- חיבור VGA נחשב עבור הכרטיס הגרפי כחיבור למסך CRT ישן (כן, מסכי LCD עם חיבור VGA משתמשים במעגלים פנימיים להדמיית מסך אנלוגי) ולפיכך אם תחבר מסך ב-VGA, הדרייבר יציין לעצמו שיש CRT
- חיבורים כמו DVI, DVI-DL, Thunderbold, DisplayPort, HDMI הם חיבורים דיגיטליים ולפיכך הדרייבר ממפה אותם כחיבורי DFP (ר"ת Digital Flat Panel) ונותן להם מספרים, כך שאם יש לך מסך עם אחד מהחיבורים שציינתי לעיל, הוא ימפה אותם לפי סדר מספרי DFP-0, DFP-1 וכו'. קישוריות כזו כוללת תקשורת דו כיוונית מלאה והמסך נותן הרבה יותר מידע על עצמו לכרטיס המסך. הוא נותן לכרטיס הגרפי פרטים כמו גודל פיזי של הפאנל, כל האזולוציות שהוא תומך בהן, קצבי רענון מסך שהוא תומך בהם, נקודות לאינצ' (ככל שיש יותר נקודות – האותיות יהיו יותר קטנות ולכן אם אתה רואה את הטקסט באותיות מאוד קטנות – כדאי שתעלה את ה-DPI ל-128 לדוגמא במקום 96 שהוא ברירת המחדל), והאם המסך תומך בכיבוי, צריכת חשמל נמוכה ועוד.
לפיכך, אם המסך הבעייתי הוא בחיבור DFP-1 לדוגמא (כמו במקרה שלי), נצטרך להזין לו שורת ModeLine שתגדיר לו את הרזולוציה והרענון בצורה ידנית (כלומר ספציפית) או שנשתמש בקובץ בינארי פשוט ונבקש מהדרייבר שיתייחס לקובץ הבינארי במקום לנסות לקרוא את פרטי המסך. במידה ויש לך מספר מסכים בעייתיים, תוכל להשתמש בקבצים בינאריים שונים שנמצאים באינטרנט או שפשוט תוכל להזין את ה-ModeLine בתוך קובץ etc/xorg.cong/ כפי שזה מופיע ההרחבה בפוסט הזה.
חשוב לזכור: מכיוון שרוב הפצות הלינוקס מפעילות את עצמן במצב גרפי, אם התקנת את הדרייבר הבינארי, סביר להניח שתקבל סמן מהבהב ותו לא. לחץ על מקשים ALT F2 והתחבר כ-root ולאחר מכן הפעל פקודת: telinit 3 כדי שהלינוקס יעבור למצב טקסטואלי. לאחר שהגדרת את השינויים, תוכל לנסות אותם ע"י הפעלת פקודת startx (כדאי למחוק את קבצי var/log/Xorg*log/ לפני כן כדי שאם תהיה תקלה – תוכל לראות בקובץ החדש שנוצר היכן התקלה, סביר להניח שתראה זאת בסוף הקובץ ה-log). לאחר שתצליח להיכנס למצב גרפי, צא ממנו ע"י בחירה ב-logout או בחירת reboot.
עוד עניין חשוב: מחשבים ניידים רבים כיום נמכרים עם 2 מעבדים גרפיים: האחד הוא מה שמגיע במעבד (של אינטל) והשני הוא של nVidia. המעבדים של nVidia במחשבים ניידים כמובן שאינן כמו המעבדים בכרטיסים יעודיים, אבל הם יכולים להאיץ דברים מסויימים שצריך, דברים שהמעבד הגרפי של אינטל אין לו שום סיכוי להאיץ בצורה רצינית. השיטה שהמעבד של nVidia עובד במחשבים ניידים כאלו, הואיל ואין יציאת מסך נפרדת, היא להפנות את פלט הצ'יפ הגרפי – לתוך אזור זכרון שהמעבד הגרפי האינטלי נותן לו. תחשבו על זה כמו מסך ירוק או כחול בסרטים: מצלמים את הסרט עם מסך ירוק או כחול ברקע ולאחר מכן מחליפים את המסך הירוק או הכחול בגרפיקה ממוחשבת.
בלינוקס, בשביל להשתמש בכל הטרראם הזה, יש צורך בדרייבר משולב שנקרא BumbleBee (כן, כמו ההוא מ-Transformers). הדרייבר (הוא לא בדיוק דרייבר, זה יותר ערכת סקריפטים וספריות) לאחר ההתקנה אינו מספיק, ויש לבצע alias או לכתוב 2 שורות סקריפט ב-Bash כדי לגרום לאפליקציות להכיר בצ'יפ של nVidia ולרוץ על אותו צ'יפ גרפי. עוד פרטים בדף הבית של BumbleBee.
אם רוצים ביצועים יותר גבוהים מאותם מחשבים ניידיים ועם הצ'יפ של nVidia, אז תכירו את פרויקט Primus והחבילה primus נמצאת בכל גירסת לינוקס נפוצה. ב-Fedora אפשר להתקין בפשטות עם yum install primus
הרצת אפליקציה עם primus: כל מה שצריך זה לאמר למערכת להשתמש במנוע primus הוא להוסיף את הפרמטרים b primus- כלומר אם אני רוצה להריץ glxgears לדוגמא, אז הפקודה תהיה:
optirun -b primus glxgears
בהצלחה