به نام خدا

سلام.

یک سری توضیحات از مفاهیمی که یاد گرفتم رو میخوام اینجا یادداشت کنم.

OpenGL چیست؟

عملا OpenGL تنها یک استاندارد برای API مربوط به کار های گرافیکی است (مثل ایجاد یک شی سه بعدی، ایجاد سایه و...) که باید توسط درایور کارت گرافیک پیاده سازی شود.

درایور کارت گرافیک موظف است این API را پیاده سازی کند و هر دستور آن را به چند دستور مربوط به پردازنده ی گرافیکی بشکند و برای GPU ارسال کند.

این نکته را در نظر داشته باشید که GPU واحد های پردازشی مخصوصی برای رندر های گرافیکی دارد به عنوان نمونه واحد Shader وظیفه ی سایه زدن را دارد.

 

Vulkan چیست؟

ولکان دقیقا مشابه OpenGL است که قرار است جایگزین آن شود. با توجه به پیشرفت تر شدن پردازنده های گرافکی و تغییر نیاز های رندر ها ولکان قرار است جایگزین OpenGL شود.

 

 

MESA3D چیست؟
در لینوکس MESA یک پیاده سازی از OpenGL و Vulkan است و این دستورات را گرفته و به کمک DRM برای پردازنده ی گرافیکی ارسال میکند. (عملا نوعی درایور کارت گرافیک OpenSource است).

 

DRM:

هر درایور کارت گرافیکی موظف است DRM را پیاده سازی کند. درایور کارت گرافیک اینتل که DRM را پیاده سازی میکند i915 نام دارد

برای دیدن درایور که دارد DRM را هندل میکند از دستور زیر استفاده کنید:

cat /sys/class/drm/cardX/device/driver/module/drivers

 

 

کارت گرافیک دارای چند Plane میباشد که به هر Plane یک فریم بافر اتچ شده است CRTC که یک واحد در DRM است وظیفه ی ادغام این Plane ها را دارد. به عنوان نمونه به کمک این قابلیت میتوان کرسر ماوس را یک Plane در نظر گرفت و عملا کرسر موس به صورت سخت افزاری روی صفحه نمایش داده میشود و لازم نیست هربار با تغییر ماوس صفحه مجددا رندر شود.

یا ممکن است وقتی یک فیلم را پلی میکند صفحه ی فیلم یک Plane در نظر گرفته شود و به صورت سخت افزاری با بکگراند دسکتاپ شما ترکیب شود.

تعداد Plane ها بسته به سخت افزار شما است ممکن است تنها یک پلین وجود داشته باشد و یا ممکن است تعداد پلین ها محدود باشد. در صورتی که تعداد پلین ها محدود باشد ممکن است مجبور باشید وظیفه ی ادغام را خودتان به صورت نرم افزاری هندل کنید.

تمامی موارد مربوط به گرافیک توسط کارت گرافیک در دیوایس فایل به آدرس /dev/dri/cardX قابل دسترسی است. برای تصویر برداری مجزا از هر Plane میتوانیم این فایل را باز کنیم و به کمک IOCTL ها و api های مربوط به DRM اطلاعات مربوط به PLANE ها را بگیریم و در نهایت آدرس فریم بافر ها را نیز استخراج کنیم و آن ها را در حافظه ی برنامه مپ کنیم و در نهایت مقادیر آن ها را درون فایل ذخیره کنیم.

البته با توجه به امنیت برای عدم دسترسی به پلین ها کرنل لینوکس جلوی مپ کردن حافظه را گرفته که برای اینکار باید کرنل لینوکس را پچ کنید. خط ۳۲۴ از فایل  drm_gem.c را کامنت کنید.

 

 

resuouce:

 

https://embear.ch/blog/drm-framebuffer

https://github.com/gopise/drmcap

https://man.archlinux.org/man/drm-kms.7.en

https://github.com/embear-engineering/drm-framebuffer