การใช้งาน Vulkan

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

ในการใช้งาน Vulkan ให้สำเร็จ อุปกรณ์จะต้องประกอบด้วย:

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

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

ตัวโหลดวัลแคน

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

NDK รวมถึงโครง libvulkan.so ห้องสมุดสำหรับการเชื่อมโยง ไลบรารีส่งออกสัญลักษณ์เดียวกับตัวโหลด ปพลิเคชันเรียกฟังก์ชั่นที่ส่งออกจากความเป็นจริง libvulkan.so ห้องสมุดเพื่อเข้าสู่ฟังก์ชั่น trampoline ในรถตักดินซึ่งส่งไปยังชั้นที่เหมาะสมหรือขับรถอยู่บนพื้นฐานของอาร์กิวเมนต์แรกของพวกเขา vkGet*ProcAddr() โทรส่งกลับคำแนะนำการทำงานที่ trampolines จัดส่ง (นั่นคือมันเรียกโดยตรงในรหัสหลักของ 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 อนุพันธ์ wraps เดียว hw_module_t struct; เพียงหนึ่งคนขับรถได้รับการสนับสนุนและสตริงคง HWVULKAN_DEVICE_0 ถูกส่งไปยัง open()

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

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

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

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

กรณีการใช้งานสำหรับเลเยอร์รวมถึง:

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

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

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

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

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

Android 9 ขึ้นไปรองรับ Vulkan API เวอร์ชัน 1.1 Android 7 ถึง Android 9 รองรับ Vulkan API เวอร์ชัน 1.0 สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Vulkan 1.1 API ให้ดู Vulkan ข้อมูลจำเพาะ 1.1 API

ภาพรวมการสนับสนุน Vulkan 1.1

Vulkan 1.1 มีการรองรับการทำงานร่วมกันของหน่วยความจำ/การซิงโครไนซ์ ซึ่งช่วยให้ OEM สามารถรองรับ 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 1.1

อุปกรณ์ Android ควรรองรับ Vulkan 1.1 หาก:

  • เปิดตัวด้วย Android 10
  • รองรับ ABI 64 บิต
  • หน่วยความจำไม่ต่ำ

อุปกรณ์อื่นๆ สามารถเลือกสนับสนุน Vulkan 1.1 ได้

ในการใช้งาน Vulkan 1.1:

  1. เพิ่มคนขับ Vulkan ที่สนับสนุน Vulkan 1.1 บวกเพิ่มเติมของ Android 1.1 ข้อกำหนด CDD หรือปรับปรุง Vulkan ไดรเวอร์ที่มีอยู่ 1.0
  2. ตรวจสอบให้แน่ใจว่า PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000) ผลตอบแทน true โดยการเพิ่มกฎเช่นต่อไปนี้เพื่อที่เหมาะสม device.mk ไฟล์:
    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
    

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

ใน libvulkan.so การดำเนินการดังต่อไปนี้คนขับหน้าต่างระบบบูรณาการ (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 จำเป็นสำหรับรูปแบบและการใช้งาน แฟล็กการใช้งานที่ส่งคืนโดยไดรเวอร์จะถูกรวมเข้ากับแฟล็กการใช้งานที่ร้องขอโดยผู้ใช้ swapchain เมื่อจัดสรรบัฟเฟอร์

Android 7.x เรียกรุ่นก่อนหน้าของ VkSwapchainImageUsageFlagsANDROID() ชื่อ vkGetSwapchainGrallocUsageANDROID() Android 8.0 และสูงกว่า deprecates vkGetSwapchainGrallocUsageANDROID() แต่ยังคงเรียก vkGetSwapchainGrallocUsageANDROID() ถ้า vkGetSwapchainGrallocUsage2ANDROID() ไม่ได้ให้คนขับรถ:

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

vkGetSwapchainGrallocUsageANDROID() ไม่รองรับการใช้งานธง swapchain หรือขยายการใช้งานธง 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 app แรกเรียก vkCreateImage กับ VkImageSwapchainCreateInfoKHR โครงสร้างที่ถูกล่ามโซ่กับ VkImageCreateInfo โครงสร้าง แล้ว app เรียก vkBindImageMemory2(KHR) กับ VkBindImageMemorySwapchainInfoKHR โครงสร้างที่ถูกล่ามโซ่กับ VkBindImageMemoryInfo โครงสร้าง imageIndex ระบุไว้ใน VkBindImageMemorySwapchainInfoKHR โครงสร้างจะต้องเป็นดัชนีภาพ swapchain ที่ถูกต้อง ในขณะเดียวกันแพลตฟอร์มให้ VkNativeBufferANDROID โครงสร้างส่วนขยายที่มีข้อมูลที่สอดคล้องกันบัฟเฟอร์ Gralloc ไป VkBindImageMemoryInfo ห่วงโซ่เพื่อให้คนขับรถรู้ซึ่ง Gralloc buffer ลงลายมือชื่อผูกพัน VkImage กับ

การรับภาพ

vkAcquireImageANDROID ได้มาเป็นเจ้าของภาพ swapchain และการนำเข้ารั้วพื้นเมืองสัญญาณภายนอกทั้งที่มีอยู่ VkSemaphore วัตถุที่มีอยู่ VkFence วัตถุ:

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

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

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

ปล่อยภาพ

vkQueueSignalReleaseImageANDROID เตรียมภาพ swapchain สำหรับใช้ภายนอกสร้างรั้วพื้นเมืองและตารางรั้วพื้นเมืองที่จะส่งสัญญาณหลังจากสัญญาณอินพุทที่มีการส่งสัญญาณ:

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

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

หาก semaphores รอ (ถ้ามี) ส่งสัญญาณแล้วและ 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 ซึ่งรวมถึง:

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

ธงคุณลักษณะของวัลแคน

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

วันที่ของแบบฟอร์ม YYYY-MM-DD ถูกเข้ารหัสเป็นจำนวนเต็ม 32 บิตดังนี้:

  • บิต 0-15 เก็บปี
  • Bits 16-23 เก็บเดือน
  • Bits 24-31 เก็บได้ทั้งวัน

มูลค่าขั้นต่ำที่อนุญาตสำหรับธงคุณลักษณะ 0x07E30301 ซึ่งสอดคล้องกับวันที่ 2019/03/01 ซึ่งเป็นวันที่เกี่ยวข้องกับการทดสอบ Vulkan กรมส่งเสริมคุณภาพสิ่งแวดล้อมสำหรับ Android 10 ถ้าธงคุณลักษณะเป็นอย่างน้อยค่านี้เรียกร้องอุปกรณ์เพื่อ ผ่านการทดสอบ Android 10 Vulkan dEQP ทั้งหมด

ราคา 0x07E40301 สอดคล้องกับวันที่ 2020/03/01 ซึ่งเป็นวันที่เกี่ยวข้องกับการทดสอบ Vulkan กรมส่งเสริมคุณภาพสิ่งแวดล้อมสำหรับ Android 11 ถ้าธงคุณลักษณะอย่างน้อยค่านี้เรียกร้องอุปกรณ์ที่จะผ่านทั้งหมดของ Android 11 การทดสอบ Vulkan กรมส่งเสริมคุณภาพสิ่งแวดล้อม

ถ้าค่าคุณลักษณะธงเป็นอย่างน้อย 0x07E30301 แต่น้อยกว่า 0x07E40301 , ที่นี้หมายถึงว่าการเรียกร้องของอุปกรณ์ที่จะผ่านทั้งหมดของ Android 10 การทดสอบ Vulkan กรมส่งเสริมคุณภาพสิ่งแวดล้อม แต่ไม่รับประกันว่าจะผ่านการทดสอบ Vulkan กรมส่งเสริมคุณภาพสิ่งแวดล้อมที่ถูกเพิ่มสำหรับ Android 11

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