การจัดการฮอตปลั๊กใน Composer HAL

ความสามารถในการแสดงผล (เช่น โหมดการแสดงผลและประเภท HDR ที่รองรับ) สามารถเปลี่ยนแปลงไดนามิกบนอุปกรณ์ที่มีจอแสดงผลที่เชื่อมต่อภายนอก (ผ่าน HDMI หรือ DisplayPort) เช่น กล่องรับสัญญาณ Android TV (STB) และโอเวอร์เดอะท็อป (OTT) อุปกรณ์ การเปลี่ยนแปลงนี้อาจเกิดขึ้นจากสัญญาณฮอตปลั๊ก HDMI เช่น เมื่อผู้ใช้เปลี่ยนจากจอแสดงผลหนึ่งไปยังอีกจอภาพหนึ่ง หรือบู๊ตอุปกรณ์โดยไม่มีจอแสดงผลที่เชื่อมต่ออยู่ ตั้งแต่ Android 12 เป็นต้นไป มีการเปลี่ยนแปลงในเฟรมเวิร์กเพื่อจัดการกับ hot plugging และความสามารถในการแสดงผลแบบไดนามิก

หน้านี้ครอบคลุมถึงวิธีจัดการกับฮ็อตปลั๊กในการแสดงผลและการเปลี่ยนแปลงความสามารถในการแสดงผลในการใช้งาน Composer HAL นอกจากนี้ยังกล่าวถึงวิธีจัดการ framebuffer ที่เกี่ยวข้องและป้องกันสภาวะการแข่งขันในสถานการณ์เหล่านี้

กำลังอัปเดตความสามารถในการแสดงผล

ส่วนนี้อธิบายวิธีที่กรอบงาน Android จัดการกับการเปลี่ยนแปลงความสามารถในการแสดงผลที่เริ่มต้นโดย Composer HAL

ก่อนที่ Android จะสามารถจัดการกับการเปลี่ยนแปลงในความสามารถในการแสดงผลได้อย่างถูกต้อง OEM ต้องใช้ Composer HAL เพื่อให้ใช้ onHotplug(display, connection=CONNECTED) เพื่อแจ้งเฟรมเวิร์กเกี่ยวกับการเปลี่ยนแปลงความสามารถในการแสดงผล เมื่อใช้งานแล้ว Android จะจัดการการเปลี่ยนแปลงเพื่อแสดงความสามารถดังนี้:

  1. เมื่อตรวจพบการเปลี่ยนแปลงในความสามารถในการแสดงผล เฟรมเวิร์กจะได้รับการแจ้งเตือน onHotplug(display, connection=CONNECTED)
  2. เมื่อได้รับการแจ้งเตือน เฟรมเวิร์กจะลดสถานะการแสดงผลและสร้างใหม่ด้วยความสามารถใหม่จาก HAL โดยใช้ getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities และ getDisplayCapabilities
  3. เมื่อกรอบงานสร้างสถานะการแสดงผลใหม่ จะส่งการเรียกกลับ onDisplayChanged ไปยังแอปที่กำลังรับฟังเหตุการณ์ดังกล่าว

กรอบงานจัดสรรเฟรมบัฟเฟอร์ใหม่ใน onHotplug(display, connection=CONNECTED) ที่ตามมา ดูการ จัดการหน่วยความจำ framebuffer สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการกับสิ่งนี้

การจัดการสถานการณ์การเชื่อมต่อทั่วไป

ส่วนนี้ครอบคลุมถึงวิธีจัดการสถานการณ์การเชื่อมต่อต่างๆ อย่างเหมาะสมในการใช้งานของคุณเมื่อจอแสดงผลหลักเชื่อมต่อและตัดการเชื่อมต่อ

เฟรมเวิร์กของ Android นั้นถูกสร้างมาสำหรับอุปกรณ์พกพา ไม่มีการรองรับในตัวสำหรับจอแสดงผลหลักที่ตัดการเชื่อมต่อ HAL จะต้องแทนที่จอแสดงผลหลักด้วยการแสดงตัวยึดตำแหน่งในการโต้ตอบกับเฟรมเวิร์กในกรณีที่จอแสดงผลหลักถูกตัดการเชื่อมต่อทางกายภาพ

สถานการณ์ต่อไปนี้อาจเกิดขึ้นในกล่องรับสัญญาณและดองเกิลทีวีซึ่งมีจอแสดงผลที่เชื่อมต่อภายนอกซึ่งสามารถตัดการเชื่อมต่อได้ เพื่อใช้การสนับสนุนสำหรับสถานการณ์เหล่านี้ ให้ใช้ข้อมูลในตารางด้านล่าง:

สถานการณ์ การจัดการ
ไม่มีการแสดงผลที่เชื่อมต่อในขณะบูต
  • ส่งสัญญาณ onHotplug(display, connection=CONNECTED) จาก Composer HAL ไปยังเฟรมเวิร์ก
  • แทนที่สถานะการแสดงผลทางกายภาพภายใน Composer HAL ด้วยสถานะการแสดงตัวแทน

    หมายเหตุ: เราขอแนะนำให้แสดงตัวยึดตำแหน่งให้มีโหมดเดียวที่รองรับความละเอียด 1080x1920 และอัตราการรีเฟรช 60Hz เนื่องจากโหมดการแสดงผลนี้รองรับโดยแอปส่วนใหญ่

จอแสดงผลหลักเชื่อมต่อทางกายภาพ
  • ส่ง onHotplug(display, connection=CONNECTED) อื่นจาก Composer HAL ไปยังเฟรมเวิร์ก

    ซึ่งทำให้เฟรมเวิร์กโหลดความสามารถในการแสดงใหม่ทั้งหมด

จอแสดงผลหลักถูกตัดการเชื่อมต่อทางกายภาพ
  • ส่ง onHotplug(display, connection=CONNECTED) อื่นจาก Composer HAL ไปยังเฟรมเวิร์ก
  • แทนที่สถานะการแสดงผลทางกายภาพภายใน Composer HAL ด้วยสถานะการแสดงตัวแทน การแสดงตัวแทนต้องมีโหมดการแสดงผลเดียว เพื่อให้กรอบงานส่งการเรียกกลับ onDisplayChanged ไปยังแอป (เนื่องจากชุดของโหมดที่รองรับมีการเปลี่ยนแปลง) โหมดแสดงผลเดี่ยวนี้ต้องตรงกับโหมดที่ใช้งานล่าสุดของจอแสดงผลจริงก่อนที่จะตัดการเชื่อมต่อ เพื่อให้แอปไม่ได้รับ เหตุการณ์การเปลี่ยนแปลงการกำหนดค่า

การจัดการหน่วยความจำเฟรมบัฟเฟอร์

เมื่อจอแสดงผลที่เชื่อมต่อแล้วได้รับเหตุการณ์การแจ้งเตือน onHotplug(display, connection=CONNECTED) ที่ตามมา เฟรมเวิร์กจะจัดสรร framebuffers ใหม่ที่เกี่ยวข้องกับการแสดงผลนี้ การใช้งานอุปกรณ์ต้องคาดการณ์ถึงพฤติกรรมนี้และจัดการหน่วยความจำเฟรมบัฟเฟอร์อย่างเหมาะสม ใช้แนวทางต่อไปนี้ในการใช้งานของคุณ:

  • ก่อนส่งเหตุการณ์การแจ้งเตือน onHotplug(display, connection=CONNECTED) ที่ตามมา ตรวจสอบให้แน่ใจว่าได้ปล่อยแฮนเดิลไปยังเฟรมบัฟเฟอร์ เพื่อให้ระบบสามารถจัดสรรคืนได้อย่างเหมาะสม ก่อนที่จะจัดสรรใหม่ หากการจัดสรรคืนไม่สำเร็จ การจัดสรรใหม่อาจล้มเหลวเนื่องจากหน่วยความจำไม่เพียงพอ

  • เราแนะนำให้จัดสรรพูลหน่วยความจำเฉพาะสำหรับ framebuffers ที่แยกจากส่วนที่เหลือของบัฟเฟอร์หน่วยความจำกราฟิก

สิ่งนี้มีความสำคัญเนื่องจากระหว่างการจัดสรรคืนและการจัดสรรเฟรมบัฟเฟอร์ใหม่ กระบวนการของบุคคลที่สามสามารถพยายามจัดสรรหน่วยความจำกราฟิกได้ หากเฟรมบัฟเฟอร์ใช้พูลหน่วยความจำกราฟิกเดียวกัน และหากหน่วยความจำกราฟิกเต็ม กระบวนการของบุคคลที่สามอาจใช้หน่วยความจำกราฟิกที่เฟรมบัฟเฟอร์จัดสรรไว้ก่อนหน้านี้ ส่งผลให้หน่วยความจำไม่เพียงพอสำหรับการจัดสรรเฟรมบัฟเฟอร์ใหม่ (หรืออาจกระจายพื้นที่หน่วยความจำ) .

การใช้รหัสการกำหนดค่าตามลำดับเพื่อป้องกันสภาวะการแข่งขัน

สภาวะการแข่งขันอาจเกิดขึ้นได้หาก Composer HAL อัปเดตการกำหนดค่าการแสดงผลที่รองรับพร้อมกับเฟรมเวิร์กที่เรียก setActiveConfig หรือ setActiveConfigWithConstraints วิธีแก้ไขคือนำ Composer HAL ไปใช้เพื่อใช้ ID ตามลำดับและป้องกันปัญหานี้

ส่วนนี้อธิบายวิธีที่สภาวะการแข่งขันอาจเกิดขึ้น ตามด้วยรายละเอียดเกี่ยวกับวิธีการใช้ Composer HAL เพื่อให้ใช้รหัสตามลำดับเพื่อป้องกันเงื่อนไขดังกล่าว

พิจารณาลำดับของเหตุการณ์ต่อไปนี้ เมื่อไม่ได้กำหนด ID ตามลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่ ทำให้เกิดสภาวะการแข่งขัน:

  1. ID การกำหนดค่าการแสดงผลที่รองรับคือ:

    • id=1 , 1080x1920 60hz
    • id=2 , 1080x1920 50hz
  2. เฟรมเวิร์กเรียก setActiveConfig(display, config=1)

  3. พร้อมกัน Composer HAL จะประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผลและอัปเดตสถานะภายในเป็นชุดการกำหนดค่าการแสดงผลใหม่ ซึ่งแสดงดังนี้:

    • id=1 , 2160x3840 60hz
    • id=2 , 2160x3840 50hz
    • id=3 , 1080x1920 60hz
    • id=4 , 1080x1920 50hz
  4. ผู้แต่ง HAL ส่งเหตุการณ์ onHotplug ไปยังเฟรมเวิร์ก เพื่อแจ้งว่าชุดของโหมดที่รองรับมีการเปลี่ยนแปลง

  5. Composer HAL ได้รับ setActiveConfig(display, config=1) (จากขั้นตอนที่ 2)

  6. HAL ตีความว่าเฟรมเวิร์กได้ร้องขอการเปลี่ยนแปลงการกำหนดค่าเป็น 2160x3840 60hz แม้ว่าในความเป็นจริงแล้วต้องการ 1080x1920 60hz

กระบวนการที่ใช้การกำหนด ID แบบไม่ต่อเนื่องจะสิ้นสุดลงที่นี่ด้วยการตีความการเปลี่ยนแปลงการกำหนดค่าที่ต้องการอย่างไม่ถูกต้อง

การกำหนดค่า Composer HAL เพื่อใช้ ID ตามลำดับ

เพื่อหลีกเลี่ยงสภาพการแข่งขันดังกล่าว OEM ต้องใช้ Composer HAL ดังนี้:

  • เมื่อ Composer HAL อัปเดตการกำหนดค่าการแสดงผลที่รองรับ ระบบจะกำหนด ID ตามลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่
  • เมื่อเฟรมเวิร์กเรียก setActiveConfig หรือ setActiveConfigWithConstraints ด้วย ID การกำหนดค่าที่ไม่ถูกต้อง Composer HAL จะละเว้นการเรียก

ขั้นตอนเหล่านี้ใช้เพื่อป้องกันสภาพการแข่งขันตามที่แสดงในการสนทนาต่อไปนี้

พิจารณาลำดับของเหตุการณ์ต่อไปนี้ เมื่อมีการกำหนด ID ตามลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่:

  1. ID การกำหนดค่าการแสดงผลที่รองรับคือ:

    • id=1 , 1080x1920 60hz
    • id=2 , 1080x1920 50hz
  2. เฟรมเวิร์กเรียก setActiveConfig(display, config=1)

  3. เมื่อมีการประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผล ชุดต่อไปของ ID การกำหนดค่าจะถูกกำหนดโดยเริ่มจากจำนวนเต็มที่ถัดไปที่ไม่ได้ใช้ ซึ่งแสดงดังนี้:

    • id=3 , 2160x3840 60hz

    • id=4 , 2160x3840 50hz

    • id=5 , 1080x1920 60hz

    • id=6 , 1080x1920 50hz

  4. Composer HAL ส่งเหตุการณ์ onHotplug ไปยังเฟรมเวิร์ก เพื่อแจ้งว่าชุดของโหมดที่รองรับมีการเปลี่ยนแปลง

  5. Composer HAL ได้รับ setActiveConfig(display, config=1) (จากขั้นตอนที่ 2)

  6. ผู้แต่ง HAL ละเว้นการเรียกเนื่องจาก ID ไม่ถูกต้องอีกต่อไป

  7. กรอบงานรับและประมวลผลเหตุการณ์ onHotplug จากขั้นตอนที่ 4 โดยจะเรียกเข้าสู่ Composer HAL โดยใช้ฟังก์ชัน getDisplayConfigs และ getDisplayAttribute ด้วยฟังก์ชันเหล่านี้ เฟรมเวิร์กจะระบุ ID ใหม่ (5) สำหรับความละเอียดที่ต้องการและอัตราการรีเฟรชที่ 1080x1920 และ 60Hz

  8. กรอบงานส่งเหตุการณ์ setActiveConfig อื่นด้วย ID ที่อัปเดตเป็น 5

  9. Composer HAL ได้รับ setActiveConfig(display, config=5) จากขั้นตอนที่ 5

  10. HAL ตีความอย่างถูกต้องว่าเฟรมเวิร์กได้ร้องขอการเปลี่ยนแปลงการกำหนดค่าเป็น 1080x1920 60hz

ดังที่แสดงในตัวอย่างข้างต้น กระบวนการที่ใช้การกำหนด ID ตามลำดับทำให้แน่ใจได้ว่าสภาวะการแย่งชิงได้รับการป้องกันและการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้องจะได้รับการอัปเดต