ใช้งาน Vulkan

Vulkan เป็นค่าใช้จ่ายแบบโอเวอร์เฮดต่ำ API ข้ามแพลตฟอร์มสำหรับ 3 มิติประสิทธิภาพสูง กราฟิก เช่นเดียวกับ OpenGL ES (GLES) Vulkan มีเครื่องมือสำหรับสร้าง กราฟิกแบบเรียลไทม์ในแอป ข้อดีของการใช้ Vulkan รวมถึงการลด CPU โอเวอร์เฮดและการรองรับภาษา SPIR-V แบบไบนารีระดับกลาง

อุปกรณ์ต้องมีสิ่งต่อไปนี้จึงจะใช้ Vulkan ได้สำเร็จ

  • ตัวโหลด Vulkan ที่ให้บริการโดย Android
  • ไดรเวอร์ Vulkan ซึ่งมาจาก SoC เช่น GPU IHV จะใช้ Vulkan API เพื่อรองรับฟังก์ชันการทำงาน Vulkan อุปกรณ์ Android อุปกรณ์ต้องการฮาร์ดแวร์ GPU ที่สามารถใช้งาน Vulkan ได้และไดรเวอร์ที่เกี่ยวข้อง GPU ต้องรองรับ GLES 3.1 ขึ้นไปด้วย โปรดปรึกษาผู้ให้บริการ SoC ของคุณเพื่อ ขอรับการสนับสนุนคนขับ

หากอุปกรณ์มีไดรเวอร์ Vulkan อุปกรณ์จะต้องประกาศ FEATURE_VULKAN_HARDWARE_LEVEL และ FEATURE_VULKAN_HARDWARE_VERSION ฟีเจอร์ของระบบ พร้อมเวอร์ชันที่ สะท้อนความสามารถของอุปกรณ์ได้อย่างถูกต้อง วิธีนี้จะช่วยให้มั่นใจได้ว่า อุปกรณ์เป็นไปตามข้อกำหนด เอกสารคำจำกัดความความเข้ากันได้ (CDD)

ตัวโหลด Vulkan

ตัวโหลด Vulkan platform/frameworks/native/vulkan คือ อินเทอร์เฟซหลักระหว่างแอป Vulkan และไดรเวอร์ Vulkan ของอุปกรณ์ วัลคาน ตัวโหลดได้รับการติดตั้งที่ /system/lib[64]/libvulkan.so ตัวโหลด ระบุจุดแรกเข้า Vulkan API หลัก ซึ่งเป็นจุดแรกเข้าของส่วนขยาย ของ Android CDD และส่วนขยายที่ไม่บังคับเพิ่มเติมอีกมากมาย หน้าต่าง ส่วนขยายสำหรับการผสานรวมระบบ (WSI) จะส่งออกโดยตัวโหลดและ ถูกนำไปใช้ในตัวโหลด ไม่ใช่ในไดรเวอร์ ตัวโหลดยังสนับสนุน การแจกแจงและโหลดเลเยอร์ที่สามารถแสดงส่วนขยายและการสกัดกั้นเพิ่มเติม การเรียก API หลักระหว่างการส่งไปยังคนขับ

NDK ประกอบด้วยคลังต้นขั้ว libvulkan.so สำหรับ และการลิงก์ ไลบรารีจะส่งออกสัญลักษณ์เดียวกับตัวโหลด แอปเรียกใช้ฟังก์ชัน ส่งออกจากไลบรารี libvulkan.so จริงไปยัง ป้อนฟังก์ชันแทรมโพลีนในตัวโหลด ซึ่งจะส่งฟังก์ชันแทรมโพลีนลงในตัวโหลด เลเยอร์หรือไดรเวอร์ตามอาร์กิวเมนต์แรก vkGet*ProcAddr() จะแสดงผลเคอร์เซอร์ฟังก์ชันที่แทรมโพลีนจะส่งไป (ซึ่งก็คือ ระบบจะเรียกใช้โค้ด API หลักโดยตรง) การเรียกใช้ผ่านฟังก์ชัน เคอร์เซอร์จะมีประสิทธิภาพมากกว่าสัญลักษณ์ที่ส่งออกแทน ข้ามแทรมโพลีนแล้วมอบหมายงานให้

การแจกแจงและการโหลดไดรเวอร์

เมื่อสร้างอิมเมจระบบ Android คาดหวังให้ระบบรู้ว่า GPU ใด พร้อมใช้งาน ตัวโหลดใช้กลไก HAL ที่มีอยู่ใน hardware.h เพื่อค้นหาและโหลดคนขับ เส้นทางที่แนะนำสำหรับไดรเวอร์ Vulkan แบบ 32 บิตและ 64 บิตคือ

/vendor/lib/hw/vulkan.<ro.hardware.vulkan>.so
/vendor/lib/hw/vulkan.<ro.product.platform>.so
/vendor/lib64/hw/vulkan.<ro.hardware.vulkan>.so
/vendor/lib64/hw/vulkan.<ro.product.platform>.so

ใน Android 7.0 ขึ้นไป อนุพันธ์ของ Vulkan hw_module_t รวมโครงสร้าง hw_module_t เดียว รองรับไดรเวอร์เพียงตัวเดียวและสตริงค่าคงที่ ผ่าน HWVULKAN_DEVICE_0 ไปยัง open()

อนุพันธ์ของ Vulkan hw_device_t สอดคล้องกับ ไดรเวอร์ที่รองรับอุปกรณ์จริงได้หลายเครื่อง สามารถขยายโครงสร้าง hw_device_t รายการไปยังการส่งออกได้ vkGetGlobalExtensionProperties(), vkCreateInstance() และ vkGetInstanceProcAddr() ฟังก์ชัน ตัวโหลดสามารถค้นหาสิ่งอื่นๆ ได้ทั้งหมด VkInstance(), VkPhysicalDevice() และ vkGetDeviceProcAddr() ฟังก์ชันโดยการเรียกใช้ vkGetInstanceProcAddr()ของโครงสร้าง hw_device_t

การค้นพบเลเยอร์และการโหลด

ตัวโหลด Vulkan สนับสนุนการระบุและการโหลดเลเยอร์ที่สามารถแสดง ส่วนขยายเพิ่มเติมและสกัดกั้นการเรียก API หลักระหว่างทางไปยัง คนขับ Android ไม่รวมเลเยอร์ในอิมเมจของระบบ อย่างไรก็ตาม แอปอาจมีเลเยอร์ใน APK

เมื่อใช้เลเยอร์ โปรดทราบว่ารูปแบบและนโยบายความปลอดภัยของ Android แตกต่างจากแพลตฟอร์มอื่นๆ อย่างมาก โดยเฉพาะอย่างยิ่ง Android ไม่อนุญาตให้ การโหลดโค้ดภายนอกลงในกระบวนการที่แก้ไขข้อบกพร่องไม่ได้ในเวอร์ชันที่ใช้งานจริง (ไม่ใช่รูท) และไม่อนุญาตให้โค้ดภายนอกตรวจสอบหรือควบคุมกระบวนการ หน่วยความจำ สถานะ และอื่นๆ ซึ่งรวมถึงข้อห้ามไม่ให้บันทึกข้อมูลหลัก, API การติดตาม และอื่นๆ ในดิสก์เพื่อการตรวจสอบในภายหลัง เฉพาะเลเยอร์ที่แสดงเป็นส่วนหนึ่งของ มีการเปิดใช้แอปที่แก้ไขข้อบกพร่องไม่ได้ในอุปกรณ์เวอร์ชันที่ใช้งานจริง และไดรเวอร์ต้องไม่มี ที่ละเมิดนโยบายเหล่านี้

กรณีการใช้งานเลเยอร์มีดังนี้

  • เลเยอร์เวลาพัฒนา — การตรวจสอบ ไม่ควรติดตั้งเลเยอร์และ Shim สำหรับเครื่องมือติดตาม/ทำโปรไฟล์/แก้ไขข้อบกพร่องใน ภาพระบบของอุปกรณ์เวอร์ชันที่ใช้งานจริง เลเยอร์และ Shim การตรวจสอบสำหรับ เครื่องมือการติดตาม/การสร้างโปรไฟล์/การแก้ไขข้อบกพร่องควรอัปเดตได้โดยไม่ต้องมีระบบ รูปภาพ นักพัฒนาแอปที่ต้องการใช้ ระหว่างการพัฒนาจะปรับเปลี่ยนแพ็กเกจแอปได้ เช่น ด้วยการเพิ่มไฟล์ในไดเรกทอรีไลบรารีในเครื่อง วิศวกร IHV และ OEM ต้องการวินิจฉัยข้อผิดพลาดในการจัดส่งแอปที่แก้ไขไม่ได้จะถือว่ามี สิทธิ์เข้าถึงบิลด์ที่ไม่ได้ใช้งานจริง (รูท) ของอิมเมจระบบ เว้นแต่แอปเหล่านั้น แก้ไขข้อบกพร่องได้ ดูข้อมูลเพิ่มเติมได้ที่เลเยอร์การตรวจสอบ Vulkan ใน Android
  • เลเยอร์ยูทิลิตี — เลเยอร์เหล่านี้จะแสดง ส่วนขยาย เช่น เลเยอร์ที่ใช้ตัวจัดการหน่วยความจำสำหรับหน่วยความจำของอุปกรณ์ นักพัฒนาซอฟต์แวร์จะเลือกเลเยอร์และเวอร์ชันของเลเยอร์เหล่านั้นเพื่อใช้ใน แอป แอปต่างๆ ที่ใช้เลเยอร์เดียวกันอาจยังคง เวอร์ชันต่างๆ นักพัฒนาแอปเลือกเลเยอร์ต่อไปนี้ที่จะจัดส่ง แพ็กเกจของแอป
  • เลเยอร์ที่แทรก (โดยนัย) — รวมถึงเลเยอร์ต่างๆ เช่น อัตราเฟรม โซเชียลเน็ตเวิร์ก และโปรแกรมเปิดเกมซ้อนทับที่ผู้ใช้แสดง หรือ แอปอื่นๆ โดยแอปไม่ทราบหรือไม่ยินยอม เหล่านี้ ละเมิดนโยบายความปลอดภัยของ Android และระบบไม่รองรับ

สำหรับแอปที่แก้ไขข้อบกพร่องไม่ได้ ตัวโหลดจะค้นหาเลเยอร์เฉพาะใน ไดเรกทอรีไลบรารีเนทีฟของแอปและพยายามโหลดไลบรารีที่มีชื่อ การจับคู่รูปแบบหนึ่งๆ (เช่น libVKLayer_foo.so)

สำหรับแอปที่แก้ไขข้อบกพร่องได้ ตัวโหลดจะค้นหาเลเยอร์ใน /data/local/debug/vulkan และพยายามโหลดเนื้อหาที่ตรงกับคลังรายการใดก็ได้ รูปแบบหนึ่งๆ โดยเฉพาะ

Android ช่วยให้สามารถพอร์ตเลเยอร์ที่มีการเปลี่ยนแปลงสภาพแวดล้อมของบิลด์ระหว่าง Android และแพลตฟอร์มอื่นๆ สำหรับรายละเอียดเกี่ยวกับอินเทอร์เฟซระหว่างเลเยอร์และ ตัวโหลด ดู สถาปัตยกรรมของอินเทอร์เฟซของ Vulkan Loader ตระกูล Khronos ที่ดูแลรักษา เลเยอร์การตรวจสอบความถูกต้องจะโฮสต์อยู่ใน เลเยอร์การตรวจสอบ Vulkan

เวอร์ชันและความสามารถของ Vulkan API

ตารางต่อไปนี้แสดงเวอร์ชัน Vulkan API สำหรับ Android รุ่นต่างๆ
รุ่นของ Android เวอร์ชัน Vulkan
Android 13 วัลคาน 1.3
Android 9 วัลคาน 1.1
Android 7 วัลกัน 1.0

ภาพรวมฟังก์ชันการทำงานของ Vulkan 1.3

Vulkan 1.3 รวมส่วนขยายที่ไม่บังคับจำนวนหนึ่งก่อนหน้านี้ไว้ในฟังก์ชันหลักของ Vulkan ฟังก์ชันการทำงานส่วนใหญ่นี้มีไว้โดยมีจุดประสงค์เพื่อเพิ่มการควบคุมและความละเอียด อินเทอร์เฟซการเขียนโปรแกรม Vulkan ไม่จำเป็นต้องใช้อินสแตนซ์ แสดงผล Pass แบบ Single-Pass อีกต่อไป แสดงผลออบเจ็กต์บัตรผ่านหรือเฟรมบัฟเฟอร์ สามารถลดจำนวนออบเจ็กต์สถานะไปป์ไลน์ทั้งหมด และ การซิงค์ภายใน API ได้รับการปรับปรุงใหม่ทั้งหมด Vulkan 1.3 มีข้อกำหนดฮาร์ดแวร์เหมือนกับ Vulkan 1.2, 1.1 และ 1.0 โดยการใช้งานส่วนใหญ่ในไดรเวอร์กราฟิกสำหรับ SoC โดยเฉพาะ ไม่ใช่ ในกรอบการทำงาน

ฟีเจอร์ที่สำคัญที่สุดของ Vulkan 1.3 สำหรับ Android มีดังนี้

  • การรองรับอินสแตนซ์ Render Pass ของ Single-Pass
  • สนับสนุนการสิ้นสุดการเรียกใช้ตัวปรับแสงเงาทันที
  • รายละเอียดในการสร้างไปป์ไลน์ การแชร์ และการควบคุม

Vulkan 1.3 ยังมีฟีเจอร์เล็กๆ มากมายและการปรับปรุงความสามารถในการใช้งาน API การเปลี่ยนแปลงทั้งหมด ที่ทำกับ Vulkan API หลักที่มีเวอร์ชันย่อย 1.3 สามารถดูได้ที่ การแก้ไขหลัก (Vulkan 1.3)

ภาพรวมฟังก์ชันการทำงานของ Vulkan 1.2

Vulkan 1.2 เพิ่มฟีเจอร์และส่วนขยายจำนวนหนึ่งที่ช่วยให้แพลตฟอร์ม API เรียบง่ายยิ่งขึ้น ซึ่งรวมถึง รุ่นหน่วยความจำแบบรวมและข้อมูลเพิ่มเติมที่ค้นหาได้จากไดรเวอร์อุปกรณ์ Vulkan 1.2 มีข้อกำหนดฮาร์ดแวร์เหมือนกับ Vulkan 1.0 และ 1.1 ทั้งหมดของ การนำไปใช้จะอยู่ในไดรเวอร์กราฟิกเฉพาะ SoC ไม่ใช่เฟรมเวิร์ก

ฟีเจอร์ Vulkan 1.2 ที่สำคัญที่สุดสำหรับ Android คือการรองรับพื้นที่เก็บข้อมูล 8 บิต

Vulkan 1.2 ยังมีฟีเจอร์เล็กๆ มากมายและการปรับปรุงความสามารถในการใช้งาน API การเปลี่ยนแปลงทั้งหมด ที่ทำกับ Vulkan API หลักที่มีการแก้ไขเล็กน้อย 1.2 ได้ที่ การแก้ไขหลัก (Vulkan 1.2)

ภาพรวมฟังก์ชันการทำงานของ Vulkan 1.1

Vulkan 1.1 มีการสนับสนุนการทำงานร่วมกันของหน่วยความจำ/การซิงค์ ซึ่ง ทำให้ OEM รองรับ Vulkan 1.1 ในอุปกรณ์ นอกจากนี้ การทํางานร่วมกันของหน่วยความจํา/การซิงค์ยังช่วยให้นักพัฒนาแอปตรวจสอบได้ว่าอุปกรณ์รองรับ Vulkan 1.1 หรือไม่ และใช้งานอย่างมีประสิทธิภาพเมื่อรองรับ Vulkan 1.1 Vulkan 1.1 มีข้อกําหนดด้านฮาร์ดแวร์เหมือนกับ Vulkan 1.0 แต่การใช้งานส่วนใหญ่อยู่ในโปรแกรมควบคุมกราฟิกเฉพาะ SOC ไม่ใช่ในเฟรมเวิร์ก

ฟีเจอร์ที่สำคัญที่สุดของ Vulkan 1.1 สำหรับ Android มีดังนี้

  • รองรับการนำเข้าและส่งออกบัฟเฟอร์หน่วยความจำและการซิงค์ข้อมูล วัตถุจากภายนอก Vulkan (สำหรับการทำงานร่วมกันด้วยกล้อง ตัวแปลงรหัส และ GLES)
  • การรองรับรูปแบบ YCbCr

Vulkan 1.1 ยังมีฟีเจอร์เล็กๆ มากมายและการปรับปรุงความสามารถในการใช้งาน API การเปลี่ยนแปลงทั้งหมด ซึ่งสร้างให้กับ Vulkan API หลักที่มีเวอร์ชันย่อย 1.1 ได้ที่ การแก้ไขหลัก (Vulkan 1.1)

เลือกการสนับสนุน Vulkan

อุปกรณ์ Android ควรรองรับชุดฟีเจอร์ Vulkan ขั้นสูงสุดที่มีอยู่ โดยมีเงื่อนไขดังนี้ รองรับ ABI 64 บิตและหน่วยความจำไม่ใช่น้อย

อุปกรณ์ที่ใช้ Android 13 ขึ้นไปควรรองรับ Vulkan 1.3

อุปกรณ์ที่เปิดตัวผ่าน Android 10 ควรรองรับ Vulkan 1.1

อุปกรณ์อื่นๆ จะรองรับ Vulkan 1.3, 1.2 และ 1.1 หรือไม่ก็ได้

รองรับเวอร์ชัน Vulkan

อุปกรณ์ Android รองรับเวอร์ชัน Vulkan หากเป็นไปตามเงื่อนไขต่อไปนี้

  1. เพิ่มไดรเวอร์ Vulkan ที่รองรับเวอร์ชัน Vulkan ที่สนใจ (ต้องเป็นเวอร์ชัน Vulkan อย่างใดอย่างหนึ่ง 1.3, 1.1 หรือ 1.0) ควบคู่ไปกับข้อกำหนด CDD เพิ่มเติมของข้อกำหนด เวอร์ชันของ Android หรืออัปเดตไดรเวอร์ Vulkan ที่มีอยู่สำหรับหมายเลขเวอร์ชัน Vulkan ที่ต่ำกว่า
  2. สำหรับ Vulkan 1.3 หรือ 1.1 โปรดตรวจสอบว่าฟีเจอร์ของระบบที่ตัวจัดการแพ็กเกจแสดงผลกลับมา true สำหรับเวอร์ชัน Vulkan ที่ถูกต้อง
    • สำหรับ Vulkan 1.3 ฟีเจอร์นี้คือ PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
    • สำหรับ Vulkan 1.1 ฟีเจอร์นี้คือ PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000)
    เครื่องมือจัดการแพ็กเกจจะแสดง true สำหรับ Vulkan 1.3 และ Vulkan 1.1 ด้วยการเพิ่มกฎ ดังนี้ ลงในไฟล์ device.mk ที่เหมาะสม
    • เพิ่มข้อมูลต่อไปนี้สำหรับ Vulkan 1.3
      PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_3.xml:
      $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
      
    • เพิ่มข้อมูลต่อไปนี้สำหรับ Vulkan 1.1
      PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:
      $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml

โปรไฟล์ Android Baseline (ABP)

เราขอแนะนําให้อุปกรณ์ Android ทุกเครื่องมีคุณสมบัติตรงตามโปรไฟล์ Android Baseline 2022 ล่าสุดตาม ที่ระบุไว้ใน คำแนะนำเกี่ยวกับโปรไฟล์ Android ขั้นพื้นฐาน

อุปกรณ์ที่รองรับ Android 14 ขึ้นไปและ Vulkan API ต้อง ดำเนินการตามฟังก์ชันทั้งหมดที่กำหนดไว้ใน โปรไฟล์ Android Baseline 2021 รายการฟังก์ชันการทำงานทั้งหมดที่จำเป็นมีดังนี้ ระบุในไฟล์ json ของโปรไฟล์ Vulkan แต่เป็นชุดย่อยคีย์ของ ประกอบด้วย

  • พื้นผิวที่บีบอัดผ่าน ASTC และ ETC
  • กำหนดพื้นที่สีได้จนถึง VK_EXT_swapchain_colorspace
  • ตัวอย่างการแรเงาและการประมาณค่าในช่วงแบบหลายตัวอย่างผ่าน sampleRateShading

การผสานรวมระบบหน้าต่าง (WSI)

ผู้ขับขี่ใช้สิ่งต่อไปนี้ใน libvulkan.so ส่วนขยาย Windows System Integration (WSI):

  • VK_KHR_surface
  • VK_KHR_android_surface
  • VK_KHR_swapchain
  • VK_KHR_driver_properties ติดตั้งใช้งานสำหรับ Vulkan 1.1 ใน Android 10 เท่านั้น
  • VK_GOOGLE_display_timing ติดตั้งใช้งานสําหรับเวอร์ชัน Vulkan ทั้งหมด ใน Android 10

ออบเจ็กต์ VkSurfaceKHR และ VkSwapchainKHR และทั้งหมด การโต้ตอบกับ ANativeWindow จะได้รับการจัดการโดยแพลตฟอร์ม ต่อผู้ขับขี่ การติดตั้งใช้งาน WSI อาศัย VK_ANDROID_native_buffer ซึ่งต้อง รองรับโดยคนขับ ส่วนขยายนี้จะใช้โดยการติดตั้ง WSI เท่านั้น ไม่แสดงในแอป

แฟล็กการใช้งาน Gralloc

การติดตั้งใช้งาน Vulkan อาจต้องจัดสรรบัฟเฟอร์ Swapchain ด้วย แฟล็กการใช้งาน Gralloc ส่วนตัวที่กำหนดโดยการใช้งาน เมื่อสร้าง Swapchain Android ขอให้ไดรเวอร์แปลการใช้งานรูปแบบและรูปภาพที่ขอ แจ้งเป็นแฟล็กการใช้งาน Gralloc โดยการเรียกใช้:

typedef enum VkSwapchainImageUsageFlagBitsANDROID {
    VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID = 0x00000001,
    VK_SWAPCHAIN_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkSwapchainImageUsageFlagBitsANDROID;
typedef VkFlags VkSwapchainImageUsageFlagsANDROID;

VkResult VKAPI vkGetSwapchainGrallocUsage2ANDROID(
    VkDevice                          device,
    VkFormat                          format,
    VkImageUsageFlags                 imageUsage,
    VkSwapchainImageUsageFlagsANDROID swapchainUsage,
    uint64_t*                         grallocConsumerUsage,
    uint64_t*                         grallocProducerUsage
);

พารามิเตอร์ format และ imageUsage นำมาจาก โครงสร้าง VkSwapchainCreateInfoKHR คนขับควรเติม *grallocConsumerUsage และ *grallocProducerUsage กับ แฟล็กการใช้งาน Gralloc ที่จำเป็นสำหรับรูปแบบ และการใช้งาน แฟล็กการใช้งานที่แสดงผลโดยไดรเวอร์จะรวมอยู่กับการใช้งาน ที่ผู้บริโภคการสลับเชนขอเมื่อจัดสรรบัฟเฟอร์

Android 7.x เรียกใช้ VkSwapchainImageUsageFlagsANDROID() เวอร์ชันก่อนหน้า ชื่อ vkGetSwapchainGrallocUsageANDROID() การเลิกใช้งาน Android 8.0 ขึ้นไป vkGetSwapchainGrallocUsageANDROID() แต่ยังคงโทรอยู่ vkGetSwapchainGrallocUsageANDROID() หาก คนขับไม่ได้ให้บริการ vkGetSwapchainGrallocUsage2ANDROID():

VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
    VkDevice            device,
    VkFormat            format,
    VkImageUsageFlags   imageUsage,
    int*                grallocUsage
);

vkGetSwapchainGrallocUsageANDROID() ไม่รองรับการใช้งานการสลับเชน หรือ Flag การใช้งาน Gralloc แบบขยาย

รูปภาพที่ถ่ายโดยใช้ Gralloc

VkNativeBufferANDROID คือโครงสร้างส่วนขยาย vkCreateImage สำหรับการสร้างรูปภาพที่สำรองข้อมูลโดยบัฟเฟอร์ Gralloc VkNativeBufferANDROID คือ ที่ให้ไว้กับ vkCreateImage() ในVkImageCreateInfo ห่วงโซ่โครงสร้างบ้าน มีการโทรหา vkCreateImage() ด้วย VkNativeBufferANDROID ในระหว่างการโทรหา vkCreateSwapchainKHR การใช้ WSI จะจัดสรร จำนวนบัฟเฟอร์ดั้งเดิมที่ขอสำหรับ Swapchain จากนั้นสร้าง VkImage สำหรับแต่ละรายการ:

typedef struct {
    VkStructureType             sType; // must be VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID
    const void*                 pNext;

    // Buffer handle and stride returned from gralloc alloc()
    buffer_handle_t             handle;
    int                         stride;

    // Gralloc format and usage requested when the buffer was allocated.
    int                         format;
    int                         usage;
    // Beginning in Android 8.0, the usage field above is deprecated and the
    // usage2 struct below was added. The usage field is still filled in for
    // compatibility with Android 7.0 drivers. Drivers for Android 8.0
    // should prefer the usage2 struct, especially if the
    // android.hardware.graphics.allocator HAL uses the extended usage bits.
    struct {
        uint64_t                consumer;
        uint64_t                producer;
    } usage2;
} VkNativeBufferANDROID;

เมื่อสร้างรูปภาพที่อิงกับ Gralloc, VkImageCreateInfo จะมี ข้อมูลต่อไปนี้

  .sType               = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
  .pNext               = the above VkNativeBufferANDROID structure
  .imageType           = VK_IMAGE_TYPE_2D
  .format              = a VkFormat matching the format requested for the gralloc buffer
  .extent              = the 2D dimensions requested for the gralloc buffer
  .mipLevels           = 1
  .arraySize           = 1
  .samples             = 1
  .tiling              = VK_IMAGE_TILING_OPTIMAL
  .usage               = VkSwapchainCreateInfoKHR::imageUsage
  .flags               = 0
  .sharingMode         = VkSwapchainCreateInfoKHR::imageSharingMode
  .queueFamilyCount    = VkSwapchainCreateInfoKHR::queueFamilyIndexCount
  .pQueueFamilyIndices = VkSwapchainCreateInfoKHR::pQueueFamilyIndices

ใน Android 8.0 ขึ้นไป แพลตฟอร์มนี้จะมี VkSwapchainImageCreateInfoKHR โครงสร้างส่วนขยายใน จัดสรรเชน VkImageCreateInfo ให้กับ vkCreateImage แล้ว เมื่อต้องใช้แฟล็กการใช้งานอิมเมจ Swapchain สำหรับ Swapchain โครงสร้างส่วนขยายมีแฟล็กการใช้งานอิมเมจ Swapchain ดังนี้

typedef struct {
    VkStructureType                        sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
    const void*                            pNext;

    VkSwapchainImageUsageFlagsANDROID      usage;
} VkSwapchainImageCreateInfoANDROID;

ใน Android 10 ขึ้นไป แพลตฟอร์มจะรองรับ VK_KHR_swapchain v70 ดังนั้นแอป Vulkan จึงสามารถสร้าง VkImage ได้รับการสนับสนุนโดยหน่วยความจำ Swapchain แอปจะโทรก่อน vkCreateImage ด้วย VkImageSwapchainCreateInfoKHR โดยเชื่อมโยงกับโครงสร้าง VkImageCreateInfo จากนั้น แอปเรียก vkBindImageMemory2(KHR) ด้วย VkBindImageMemorySwapchainInfoKHR ซึ่งเชื่อมโยงอยู่กับ VkBindImageMemoryInfo imageIndex ที่ระบุในโครงสร้าง VkBindImageMemorySwapchainInfoKHR ต้อง เป็นดัชนีรูปภาพ Swapchain ที่ถูกต้อง ในขณะเดียวกัน แพลตฟอร์มจะให้ VkNativeBufferANDROID โครงสร้างส่วนขยายที่มี ข้อมูลบัฟเฟอร์ Gralloc ไปยังเชน VkBindImageMemoryInfo ดังนั้น คนขับจะทราบว่าบัฟเฟอร์ Gralloc ใดที่จะผูก VkImage เข้ากับ

รับรูปภาพ

vkAcquireImageANDROID เป็นเจ้าของอิมเมจ Swapเชน และนำเข้าการเชื่อมต่อแบบเนทีฟที่มีสัญญาณจากภายนอกไปยัง ออบเจ็กต์ VkSemaphore และออบเจ็กต์ VkFence ที่มีอยู่

VkResult VKAPI vkAcquireImageANDROID(
    VkDevice            device,
    VkImage             image,
    int                 nativeFenceFd,
    VkSemaphore         semaphore,
    VkFence             fence
);

มีการเรียกใช้ vkAcquireImageANDROID() ระหว่าง vkAcquireNextImageKHRเพื่อนําเข้า ในออบเจ็กต์ VkSemaphore และ VkFence แบบเนทีฟ จากแอป (แต่ทั้งวัตถุกลางและรั้ว (ไม่บังคับ) ในการโทรนี้) คนขับอาจใช้โอกาสนี้เพื่อแสดงความขอบคุณ และจัดการการเปลี่ยนแปลงสถานะบัฟเฟอร์ Gralloc จากภายนอก ผู้ขับขี่จำนวนมากจะไม่ ต้องดำเนินการอะไรที่นี่ การเรียกนี้จะวาง VkSemaphore และ VkFence อยู่ในสถานะรอดำเนินการเดียวกันเสมือนว่าได้รับสัญญาณจาก vkQueueSubmit เพื่อให้คิวรอได้ชั่วคราว และแอปก็รออยู่ริมรั้วได้

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

เผยแพร่รูปภาพ

vkQueueSignalReleaseImageANDROID เตรียมรูปภาพ Swapchain สำหรับ การใช้งานภายนอก สร้างรั้วแบบเนทีฟ และกำหนดเวลาให้สัญญาณรั้วแบบดั้งเดิมหลังจาก สัญญาณป้อนเข้าที่ส่งสัญญาณดังนี้

VkResult VKAPI vkQueueSignalReleaseImageANDROID(
    VkQueue             queue,
    uint32_t            waitSemaphoreCount,
    const VkSemaphore*  pWaitSemaphores,
    VkImage             image,
    int*                pNativeFenceFd
);

vkQueuePresentKHR() โทรหา vkQueueSignalReleaseImageANDROID() ในคิวที่ระบุ คนขับต้องติดตั้งรั้วพื้นฐานที่ไม่มีสัญญาณ จนกว่าจะครบทั้ง waitSemaphoreCount เครื่องหมายใน pWaitSemaphores สัญญาณ และทำงานเพิ่มเติมที่จำเป็นเพื่อ เตรียม image ให้พร้อมสำหรับการนำเสนอ

หากลําดับการรอ (หากมี) ส่งสัญญาณแล้ว และ queue ไม่มีความเคลื่อนไหวแล้ว คนขับสามารถตั้งค่า *pNativeFenceFd เป็น -1 แทนคำอธิบายไฟล์รั้วแบบเนทีฟจริง ซึ่งแสดงให้เห็นว่า ไม่ต้องรออะไร ผู้โทรเป็นเจ้าของและปิดข้อบ่งชี้ไฟล์ แสดงผลใน *pNativeFenceFd

ไดรเวอร์จำนวนมากสามารถเพิกเฉยต่อพารามิเตอร์รูปภาพได้ แต่บางคนอาจต้องจัดเตรียม โครงสร้างข้อมูลฝั่ง CPU ที่เชื่อมโยงกับบัฟเฟอร์ Gralloc สำหรับใช้งานโดยภายนอก ผู้บริโภครูปภาพ การเตรียมเนื้อหาบัฟเฟอร์สำหรับใช้โดยผู้บริโภคภายนอก แบบไม่พร้อมกันเป็นส่วนหนึ่งของการเปลี่ยนรูปภาพเป็น VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

หากรูปภาพสร้างด้วย VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID ผู้ขับขี่จะต้อง อนุญาตให้เรียก vkQueueSignalReleaseImageANDROID() ซ้ำได้ โดยไม่ขัดขวางการโทรไปยัง vkAcquireImageANDROID()

แชร์การสนับสนุนรูปภาพที่นำเสนอได้

อุปกรณ์บางเครื่องสามารถแชร์การเป็นเจ้าของรูปภาพเดียวระหว่าง ไปป์ไลน์การแสดงผลและการใช้ Vulkan เพื่อลดเวลาในการตอบสนอง ใน Android 9 ขึ้นไป ตัวโหลดจะมีการโฆษณา ส่วนขยาย VK_KHR_shared_presentable_image ตามของผู้ขับ การตอบกลับการโทรหา vkGetPhysicalDeviceProperties2

หากไดรเวอร์ไม่รองรับ Vulkan 1.1 หรือ ส่วนขยาย VK_KHR_physical_device_properties2 ตัวโหลดไม่ โฆษณาการสนับสนุนรูปภาพที่นำเสนอได้ที่แชร์ได้ มิฉะนั้น ตัวโหลดจะสืบค้น ความสามารถของผู้ขับโดยโทรหา vkGetPhysicalDeviceProperties2() และรวมโครงสร้างต่อไปนี้ในส่วน เชน VkPhysicalDeviceProperties2::pNext รายการ:

typedef struct {
    VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID
    const void*     pNext;
    VkBool32        sharedImage;
} VkPhysicalDevicePresentationPropertiesANDROID;

หากผู้ขับขี่แชร์การเป็นเจ้าของรูปภาพกับจอแสดงผลได้ ระบบจะตั้งค่าสมาชิก sharedImage เป็น VK_TRUE

การตรวจสอบความถูกต้อง

OEM สามารถทดสอบการใช้งาน Vulkan โดยใช้ CTS ซึ่งประกอบด้วยสิ่งต่อไปนี้

  • การทดสอบ Kronos Vulkan Conformance ในโมดูล CtsDeqpTestCases ซึ่งรวมถึงการทดสอบ API ที่ทำงานสำหรับ Vulkan 1.0, 1.1, 1.2 และ 1.3
  • โมดูล CtsGraphicsTestCases ซึ่งทดสอบว่าอุปกรณ์ ที่กำหนดค่าไว้อย่างถูกต้องสำหรับความสามารถของ Vulkan ที่รองรับ

แฟล็กฟีเจอร์ Vulkan

อุปกรณ์ที่รองรับ Android 11 ขึ้นไปและรองรับ Vulkan API เพื่อแสดงแฟล็กฟีเจอร์ android.software.vulkan.deqp.level ค่าของแฟล็กฟีเจอร์นี้ คือวันที่ที่เข้ารหัสเป็นค่าจำนวนเต็ม ซึ่งระบุวันที่ที่เชื่อมโยงกับ Vulkan dEQP จะทดสอบที่อุปกรณ์อ้างว่าผ่าน

วันที่ในรูปแบบ YYYY-MM-DD จะได้รับการเข้ารหัสเป็นจำนวนเต็ม 32 บิตดังนี้

  • เกมบิต 0-15 เก็บได้ในปีนี้
  • Bits 16-23 เก็บของเดือน
  • ขายของ 24-31 ในแต่ละวัน

ค่าต่ำสุดที่อนุญาตสำหรับแฟล็กฟีเจอร์คือ 0x07E30301 ซึ่งสอดคล้องกับวันที่ 2019-03-01 ซึ่งเป็นวันที่ที่เชื่อมโยงกับ การทดสอบ Vulkan dEQP สำหรับ Android 10 หากธงฟีเจอร์มีค่าอย่างน้อยเท่ากับนี้ อุปกรณ์อ้างว่าผ่านการทดสอบ dEQP ทั้งหมดของ Android 10 Vulkan

ค่า 0x07E40301 ตรงกับวันที่ 2020-03-01 ซึ่งเท่ากับ วันที่ที่เกี่ยวข้องกับการทดสอบ Vulkan dEQP สำหรับ Android 11 หากฟีเจอร์ อย่างน้อยตัวบ่งชี้คือค่านี้ อุปกรณ์อ้างว่าผ่าน Android 11 ทั้งหมด การทดสอบ Vulkan dEQP

ค่า 0x07E60301 ตรงกับวันที่ 2022-03-01 ซึ่งเท่ากับ วันที่ที่เกี่ยวข้องกับการทดสอบ Vulkan dEQP สำหรับ Android 13 หากธงฟีเจอร์มีค่าอย่างน้อยเท่ากับนี้ อุปกรณ์อ้างว่าผ่าน Vulkan ของ Android 13 ทั้งหมด การทดสอบ dEQP

อุปกรณ์ที่มีการแจ้งเตือนฟีเจอร์ที่เจาะจง (ได้แก่ 0x07E30301, 0x07E40301, 0x07E60301) อ้างว่าผ่านการทดสอบ dEQP ทั้งหมดของ Android Vulkan ของ Flag ฟีเจอร์ (Android 10, Android 11, Android 13 ตามลำดับ) อุปกรณ์นี้ อาจผ่านการทดสอบ Vulkan dEQP จาก Android รุ่นหลังจากนี้

Vulkan dEQP เป็นส่วนหนึ่งของ Android CTS จาก Android 11 ให้ใช้ตัวทดสอบ dEQP คอมโพเนนต์ของ CTS รับรู้ถึง android.software.vulkan.deqp.level แฟล็กฟีเจอร์ และข้ามการทดสอบ Vulkan dEQP ที่สอดคล้องกับ แฟล็กฟีเจอร์ - อุปกรณ์ไม่อ้างว่ารองรับ การทดสอบดังกล่าว รายงานว่าขับผ่านเพียงเล็กน้อย