Android 8.1 และสูงกว่ามีการรองรับการจัดการสีที่สามารถใช้เพื่อมอบประสบการณ์ที่สอดคล้องกันในเทคโนโลยีการแสดงผล แอปที่ทำงานบน Android สามารถเข้าถึงความสามารถเต็มรูปแบบของจอแสดงผลช่วงกว้างเพื่อใช้ประโยชน์สูงสุดจากอุปกรณ์แสดงผล
Android รุ่นก่อนๆ ไม่มีการรองรับการจัดการสี แต่อาศัยเนื้อหาและจอแสดงผลที่เข้ากันได้แทน (เป้าหมายมักได้รับความช่วยเหลือจากอุตสาหกรรมทีวี) อย่างไรก็ตาม เทคโนโลยีการแสดงผลล่าสุดอนุญาตให้มีขอบเขตการแสดงผลที่ใหญ่ขึ้นมากซึ่งไม่แสดงเนื้อหาที่มีอยู่ตามที่คาดไว้ เมื่อใช้ Android 8.1 ขึ้นไป อุปกรณ์ที่ใช้จอแสดงผลช่วงกว้าง (เช่น ไดโอดเปล่งแสงอินทรีย์แบบแอกทีฟแมทริกซ์หรือ AMOLED, LCD บางรุ่น) สามารถดูเนื้อหาช่วงกว้างจากแอปได้
กำหนดการสนับสนุนอุปกรณ์
อุปกรณ์ที่มีจอแสดงผลสีกว้างที่ใช้ Android 8.1 ขึ้นไปควรรองรับการจัดการสี (สีกว้าง) ก่อนเปิดใช้งานคุณสมบัตินี้ ตรวจสอบให้แน่ใจว่าอุปกรณ์ตรงตามข้อกำหนดต่อไปนี้:
- จอแสดงผลของอุปกรณ์มีคุณสมบัติตรงตามข้อกำหนดด้านฮาร์ดแวร์ ซึ่งรวมถึงจอแสดงผลที่มีคุณสมบัติเฉพาะซึ่งรองรับพื้นที่สี Display-P3 หากจอแสดงผลไม่ตรงตามข้อกำหนดนี้ อย่าเปิดใช้งานการจัดการสี เพื่อลดผลกระทบของ CPU และ GPU ขอแนะนำให้รองรับ sRGB และ HDR10 แบบขยายในไปป์ไลน์การแสดงผล
- อุปกรณ์รองรับกระบวนการสอบเทียบจากโรงงานที่สร้างข้อมูลการสอบเทียบ (จัดเก็บไว้ในอุปกรณ์) เพื่อปรับความแปรปรวนในการผลิตในลักษณะการแสดงผล อย่างน้อยที่สุด ข้อมูลการสอบเทียบควรช่วยให้จอแสดงผลสามารถแสดงเนื้อหา sRGB และจุดสีขาว D65 และ D73 ได้อย่างแม่นยำ
หากเป็นไปตามข้อกำหนดเหล่านี้ คุณสามารถเปิดใช้งานคุณสมบัติการจัดการสีสำหรับอุปกรณ์ได้
ใช้การจัดการสี
หากต้องการใช้การจัดการสี ขั้นแรกให้อัปเดตไดรเวอร์ Hardware Composer 2 (HWC2) เพื่อทำความเข้าใจโหมดสีและนำโหมดเหล่านั้นไปใช้กับฮาร์ดแวร์ โดยเฉพาะอย่างยิ่ง ผู้แต่ง HWC2 จะต้องรายงานโหมดสี Display-P3 และ sRGB โดยใช้ HWCDisplay::GetColorModes
จากนั้น เปิดใช้งานส่วนขยาย OpenGL และการสนับสนุนไลบรารีที่จำเป็นเพื่อแปลปริภูมิสี OpenGL เป็นพื้นที่ข้อมูล HAL ส่วนขยาย OpenGL ที่จำเป็นประกอบด้วย:
-
EGL_EXT_pixel_format_float
. อนุญาตให้แอปสร้าง EGLSurfaces ที่แสดงได้ด้วยองค์ประกอบสีลอย 16 บิต ลำดับความสำคัญ: สูง (คาดว่านี่คือรูปแบบพิกเซลเริ่มต้นสำหรับแอปที่ใช้สีกว้าง) ต้องมีการสนับสนุนคนขับ -
EGL_KHR_gl_colorspace
สำหรับแอปที่ต้องการใช้เฟรมบัฟเฟอร์เริ่มต้นในรูปแบบ sRGB เพื่อให้บรรลุผลการเรนเดอร์ sRGB บนอุปกรณ์แสดงผลได้ง่ายขึ้น ส่วนขยายนี้อนุญาตให้สร้าง EGLSurfaces ที่จะแสดงผลใน sRGB โดยบริบท OpenGL ที่รองรับความสามารถนั้น ต้องการการสนับสนุนไดรเวอร์สำหรับพฤติกรรม sRGB
Android ยังมีส่วนขยายเพิ่มเติมดังต่อไปนี้:
-
EGL_EXT_colorspace_scrgb_linear
ส่วนขยายนี้มีตัวเลือกพื้นที่สีใหม่ scRGB ซึ่งแอปสามารถเลือกได้เมื่อสร้าง EGLSurface พื้นที่สี scRGB กำหนดพื้นที่อ้างอิงการแสดงผลเชิงเส้นที่มีจุดสีขาวและแม่สีเดียวกันกับ sRGB (ดังนั้นจึงเข้ากันได้กับ sRGB รุ่นเก่า) สิ่งนี้ไม่ควรต้องการการสนับสนุนไดรเวอร์และสามารถนำไปใช้ใน wrapper EGL ของ Android เพื่อให้มีประโยชน์ ส่วนขยายนี้จำเป็นต้องรองรับจุดลอยตัว 16 บิต (FP16) -
EGL_EXT_gl_colorspace_display_p3
และEGL_EXT_gl_colorspace_display_p3_linear
สำหรับแอปที่ต้องการใช้เฟรมบัฟเฟอร์เริ่มต้นรูปแบบ Display-P3 เพื่อให้บรรลุการเรนเดอร์ sRGB บนอุปกรณ์แสดงผลได้ง่ายขึ้น ส่วนขยายนี้อนุญาตให้สร้าง EGLSurfaces ที่จะแสดงผลใน Display-P3 โดยบริบท OpenGL ที่รองรับความสามารถนั้น สิ่งนี้สามารถนำไปใช้ใน wrapper ไดรเวอร์ EGL -
VK_EXT_swapchain_colorspace
(วัลแคน) ช่วยให้แอปสามารถแท็กกลุ่มการแลกเปลี่ยนด้วยปริภูมิสีที่พวกเขาใช้ รวมปริภูมิสีทั่วไปจำนวนหนึ่ง เช่น DCI-P3, Display-P3, AdobeRGB และ BT2020
การปรับแต่ง
คุณสามารถปรับแต่งคุณสมบัติการจัดการสีได้โดยการรองรับมาตรฐานสีที่หลากหลาย เช่น DCI-P3, AdobeRGB, Rec709 และ Rec2020 การปรับแต่งอื่นๆ ได้แก่:
- การสนับสนุนฮาร์ดแวร์สำหรับการแปลงสีในไปป์ไลน์การแสดงผล ช่วยให้สามารถสนับสนุนการแปลงสีได้หลายสีในฮาร์ดแวร์
- รองรับการแปลงสีแบบอิสระบนหลายเลเยอร์ (เช่น บางเลเยอร์อาจเป็น sRGB และเลเยอร์อื่นๆ แบบขยาย sRGB โดยแต่ละเลเยอร์มีไปป์ไลน์สีของตัวเอง) เมื่อมีการมองเห็นปริภูมิสีมากกว่าหนึ่งปริภูมิ ปริภูมิสีบางส่วนจะต้องถูกแปลงเป็นปริภูมิสีของจอแสดงผล ตามหลักการแล้ว การแปลงนี้ทำได้ดีที่สุดโดยเอ็นจิ้นการแสดงผล (ไม่เช่นนั้น Android จะต้องดำเนินการจัดองค์ประกอบ GPU)
การทดสอบ
หากต้องการทดสอบการจัดการสี ให้ใช้ทรัพยากรต่อไปนี้ใน opengl/tests
:
-
gl2_basic
เป็นการสาธิต OpenGL ง่ายๆ ที่ขอพื้นที่สี Display-P3 - การทดสอบ
EGL_test
สำหรับการรองรับส่วนขยายและการกำหนดค่าที่จำเป็น (10:10:10:2 และ FP16) -
test_wide_color
สร้างพื้นผิวในลักษณะเดียวกับ SurfaceFlinger (เช่น การกำหนดค่า พื้นที่สี และรูปแบบพิกเซล)
การดำเนินการอ้างอิง
สำหรับการดำเนินการอ้างอิง โปรดดูที่ frameworks/native
สำหรับส่วนหัว โปรดดูที่:
-
system/core/include/system/graphics.h
-
system/core/include/system/graphics-base.h
-
HAL_DATASPACE_*
-
HAL_COLOR_MODE_*
-