Android 13 کتابخانه ثابتی با قابلیت پیکربندی توسط فروشنده بهنام libtonemap معرفی میکند
که عملیات نگاشت رنگ را تعریف میکند و با فرایند SurfaceFlinger
و پیادهسازیهای Hardware Composer (HWC) همرسانی میشود. این ویژگی به سازندگان اصلی تجهیزات امکان میدهد
الگوریتمهای نگاشت رنگمایه نمایشگر خود را بین چارچوب
و فروشندگان تعریف و همرسانی کنند، که این امر عدم تطابق در نگاشت رنگمایه را کاهش میدهد.
در Android 12 و نسخههای پایینتر، عملیات نگاشت تن مختص نمایشگر بین HWC، SurfaceFlinger، و برنامهها همرسانی نمیشد. بسته به مسیر رندر، برای محتوای HDR، این امر منجر به عدم تطابق در کیفیت تصویر میشد، جایی که محتوای HDR به روشهای مختلفی به فضای خروجی نگاشت رنگ میشد. این موضوع در سناریوهایی مانند چرخش صفحهنمایش، که در آن استراتژی ترکیببندی بین GPU و DPU تغییر میکند، و در تفاوتهای رفتار رندرینگ بین TextureView و SurfaceView قابلمشاهده بود.
این صفحه جزئیات میانای کتابخانه libtonemap، سفارشیسازی، و اعتبارسنجی آن را شرح میدهد.
رابط کتابخانه نگاشت رنگمایه
کتابخانه libtonemap
حاوی پیادهسازیهای پشتیبانیشده توسط CPU و سایهزنهای SkSL است که میتوانند
توسط SurfaceFlinger برای ترکیببندی پسزمینه GPU و توسط HWC برای
تولید جدول مراجعه (LUT) نگاشت رنگ متصل شوند. نقطه ورود به libtonemap
این است:
android::tonemap::getToneMapper،
که شیئی را برمیگرداند که
واسط ToneMapper
را پیادهسازی میکند.
میانای ToneMapper از قابلیتهای زیر پشتیبانی میکند:
تولید کردن جدول مراجعه نگاشت رنگمایه
میانای
ToneMapper::lookupTonemapGainپیادهسازی واحد پردازش مرکزی از سایهزن تعریفشده درlibtonemap_LookupTonemapGainاست. این مورد توسط آزمایشهای واحد در چارچوب استفاده میشود، و شرکا میتوانند از آن برای کمک به تولید جدول مراجعه نگاشت رنگمایه در خط لوله رنگ خود استفاده کنند.libtonemap_LookupTonemapGainمقادیر رنگ را در فضای خطی مطلق و غیرنرمالشده، هم در RGB خطی و هم در XYZ، دریافت میکند و یک عدد اعشاری برمیگرداند که نشان میدهد رنگهای ورودی در فضای خطی باید در چه مقداری ضرب شوند.تولید سایهزن SkSL
واسط
ToneMapper::generateTonemapGainShaderSkSLرشته سایهزن SkSL را با درنظر گرفتن فضای داده منبع و مقصد برمیگرداند. سایهزن SkSL به پیادهسازی Skia برایRenderEngine، عنصر ترکیببندی شتابگرفته با واحد پردازش گرافیکی برای SurfaceFlinger متصل است. سایهزن همچنین بهlibhwuiمتصل است، تا نگاشت تن HDR به SDR بتواند بهطور کارآمد برایTextureViewانجام شود. ازآنجاییکه رشته تولیدشده در دیگر سایهزنهای SkSL مورد استفاده Skia درونخطی میشود، سایهزن باید از قوانین زیر پیروی کند:- رشته سایهزن باید نقطه ورودی با امضای
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)داشته باشد، که در آنlinearRGBمقدار نیت مطلق پیکسلهای RGB در فضای خطی است وxyzهمانlinearRGBاست که به XYZ تبدیل شده است. - هر روش کمکی که توسط رشته سایهزن استفاده میشود باید با رشته
libtonemap_پیشوندگذاری شود تا تعاریف سایهزن چارچوب تضاد نداشته باشند. بههمین ترتیب، ورودی یکنواخت باید باin_libtonemap_پیشوند داشته باشد.
- رشته سایهزن باید نقطه ورودی با امضای
تولید لباسهای یکشکل SkSL
میانای
ToneMapper::generateShaderSkSLUniformsبا دریافت فرادادهstructکه فراداده را از استانداردهای مختلف HDR و شرایط نمایش توصیف میکند، موارد زیر را برمیگرداند:فهرستی از یکنواختهایی که با یک سایهزن SkSL محدود شدهاند.
مقادیر یکنواخت
in_libtonemap_displayMaxLuminanceوin_libtonemap_inputMaxLuminance. این مقادیر توسط سایهزنهای چارچوب هنگام مقیاسبندی ورودی بهlibtonemapو عادیسازی برونداد درصورت لزوم استفاده میشوند.فرایند تولید یکنواختها نسبت به فضای داده ورودی و خروجی ناآشنا است.
سفارشیسازی
پیادهسازی مرجع کتابخانه
libtonemap
نتایج قابلقبولی تولید میکند. بااینحال، ازآنجاییکه الگوریتم نگاشت تن
مورد استفاده در ترکیب GPU میتواند با الگوریتم مورد استفاده در ترکیب DPU متفاوت باشد، استفاده از
پیادهسازی مرجع میتواند در برخیاز سناریوها مانند
پویانمایی چرخش باعث پرش شود. سفارشیسازی میتواند مشکلات کیفیت تصویر مختص فروشنده را حل کند.
به تولیدکنندگان اصلی سختافزار قویاً توصیه میشود که پیادهسازی libtonemap را لغو کنند تا
زیرکلاس ToneMapper خودشان را تعریف کنند که توسط getToneMapper برگردانده میشود.
هنگام سفارشیسازی پیادهسازی، انتظار میرود شرکا یکی از موارد زیر را انجام دهند:
- پیادهسازی
libtonemapرا مستقیماً اصلاح کنید. - کتابخانه ایستا خود را تعریف کنند، کتابخانه را بهعنوان یک کتابخانه مستقل کامپایل کنند، و فایل
.aکتابخانهlibtonemapرا با فایل تولیدشده از کتابخانه سفارشی خود جایگزین کنند.
تأمینکنندگان نیازی به تغییر کد هسته ندارند، اما چندین تأمینکننده باید جزئیات مربوط به الگوریتمهای نگاشت تن DPU را برای پیادهسازی صحیح با یکدیگر مبادله کنند.
اعتبارسنجی
برای اعتبارسنجی پیادهسازیتان، این مراحل را دنبال کنید:
ویدیوهای HDR را در صفحهنمایش با هر استاندارد HDR که سیستم نمایشگر پشتیبانی میکند پخش کنید، مانند HLG، HDR10، HDR10+، یا DolbyVision.
ترکیب GPU را روشن/خاموش کنید تا مطمئن شوید که هیچ پرش قابلتوجهی برای کاربر وجود ندارد.
برای روشن/خاموش کردن ترکیب GPU، از فرمان
adbزیر استفاده کنید:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
مسائل رایج
مشکلات زیر ممکن است در این پیادهسازی رخ دهد:
نواربندی زمانی رخ میدهد که هدف رندر استفادهشده توسط ترکیب GPU از دقت کمتری نسبتبه مقدار معمول برای محتوای HDR برخوردار باشد. برای مثال، زمانی که پیادهسازی HWC از قالبهای ۱۰ بیتی مات برای HDR مانند RGBA1010102 یا P010 پشتیبانی میکند، اما برای پشتیبانی از آلفا، ترکیب GPU را ملزم میکند که در قالب ۸ بیتی مانند RGBA8888 بنویسد، ممکن است باندینگ رخ دهد.
اگر DPU با دقتی متفاوت از GPU کار کند، تفاوتهای کمّیسازی باعث تغییر رنگ ظریفی میشود.
هرکدام از این مشکلات به تفاوتهای دقت نسبی سختافزار زیربنایی مربوط میشود. یک راه حل معمول این است که اطمینان حاصل شود که یک مرحله لرزش در مسیرهای با دقت پایینتر وجود دارد، که باعث میشود هرگونه تفاوت دقت کمتر برای انسان قابل درک باشد.