Swappy untuk Vulkan

Bagian Vulkan dari Swappy.

Ringkasan

Typedef

SwappyVkFunctionProvider typedef
Struktur yang memungkinkan Anda menyediakan wrapper fungsi Vulkan Anda sendiri dengan memanggil SwappyVk_setFunctionProvider.

Fungsi

SwappyVk_destroySwapchain(VkDevice device, VkSwapchainKHR swapchain)
void
Menghancurkan instance SwappyVk yang terkait dengan swapchain.
SwappyVk_determineDeviceExtensions(VkPhysicalDevice physicalDevice, uint32_t availableExtensionCount, VkExtensionProperties *pAvailableExtensions, uint32_t *pRequiredExtensionCount, char **pRequiredExtensions)
void
Menentukan ekstensi perangkat Vulkan yang harus diaktifkan untuk VkDevice baru.
SwappyVk_getFenceTimeoutNS()
uint64_t
Mendapatkan parameter waktu tunggu fence untuk perangkat dengan driver yang rusak.
SwappyVk_initAndGetRefreshCycleDuration(JNIEnv *env, jobject jactivity, VkPhysicalDevice physicalDevice, VkDevice device, VkSwapchainKHR swapchain, uint64_t *pRefreshDuration)
bool
Menginisialisasi SwappyVk untuk perangkat tertentu dan swapchain, dan mendapatkan perkiraan durasi waktu antara periode pengosongan vertikal.
SwappyVk_injectTracer(const SwappyTracer *tracer)
void
Memasukkan fungsi callback untuk dipanggil setiap frame.
SwappyVk_queuePresent(VkQueue queue, const VkPresentInfoKHR *pPresentInfo)
VkResult
Memberi tahu Swappy untuk menampilkan satu atau beberapa gambar ke swapchain yang sesuai.
SwappyVk_setAutoPipelineMode(bool enabled)
void
Mengaktifkan fitur Mode Pipeline Otomatis untuk semua instance.
SwappyVk_setAutoSwapInterval(bool enabled)
void
Mengaktifkan fitur Interval Pertukaran Otomatis untuk semua instance.
SwappyVk_setFenceTimeoutNS(uint64_t fence_timeout_ns)
void
Parameter waktu tunggu fence dapat disetel untuk perangkat dengan driver yang rusak.
SwappyVk_setFunctionProvider(const SwappyVkFunctionProvider *pSwappyVkFunctionProvider)
void
Menyetel penyedia fungsi Vulkan.
SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns)
void
Menyetel durasi pertukaran maksimal untuk semua instance.
SwappyVk_setQueueFamilyIndex(VkDevice device, VkQueue queue, uint32_t queueFamilyIndex)
void
Memberi tahu Swappy, queueFamilyIndex yang digunakan untuk membuat VkQueue tertentu.
SwappyVk_setSwapIntervalNS(VkDevice device, VkSwapchainKHR swapchain, uint64_t swap_ns)
void
Memberi tahu Swappy bahwa durasi setiap gambar yang ditampilkan harus terlihat.
SwappyVk_setWindow(VkDevice device, VkSwapchainKHR swapchain, ANativeWindow *window)
void
Memberi tahu Swappy, ANativeWindow mana yang akan digunakan saat memanggil API ANativeWindow_*.

Makro

VK_NO_PROTOTYPES 1

Struct

SwappyVkFunctionProvider

Struktur yang memungkinkan Anda menyediakan wrapper fungsi Vulkan Anda sendiri dengan memanggil SwappyVk_setFunctionProvider.

Typedef

SwappyVkFunctionProvider

struct SwappyVkFunctionProvider SwappyVkFunctionProvider

Struktur yang memungkinkan Anda menyediakan wrapper fungsi Vulkan Anda sendiri dengan memanggil SwappyVk_setFunctionProvider.

Penggunaan fungsi ini bersifat opsional.

Fungsi

SwappyVk_destroySwapchain

void SwappyVk_destroySwapchain(
  VkDevice device,
  VkSwapchainKHR swapchain
)

Menghancurkan instance SwappyVk yang terkait dengan swapchain.

API ini diharapkan akan dipanggil sebelum memanggil ke vkDestroySwapchainKHR() agar Swappy dapat membersihkan status internal. Perhatikan bahwa jika hanya ada satu swapchain untuk perangkat, fungsi ini juga akan membersihkan semua resource yang terkait dengan perangkat.

Detail
Parameter
device
- VkDevice yang terkait dengan SwappyVk
swapchain
- VkSwapchainKHR yang aplikasi ingin Swappy menukarnya

SwappyVk_determineDeviceExtensions

void SwappyVk_determineDeviceExtensions(
  VkPhysicalDevice physicalDevice,
  uint32_t availableExtensionCount,
  VkExtensionProperties *pAvailableExtensions,
  uint32_t *pRequiredExtensionCount,
  char **pRequiredExtensions
)

Menentukan ekstensi perangkat Vulkan yang harus diaktifkan untuk VkDevice baru.

Swappy-for-Vulkan (SwappyVk) mendapatkan manfaat dari ekstensi perangkat Vulkan tertentu (misalnya VK_GOOGLE_display_timing). Sebelum aplikasi memanggil vkCreateDevice, SwappyVk perlu melihat daftar ekstensi yang tersedia (ditampilkan oleh vkEnumerateDeviceExtensionProperties) dan berpotensi mengidentifikasi satu atau beberapa ekstensi yang harus ditambahkan oleh aplikasi:

  • VkDeviceCreateInfo::enabledExtensionCount
  • VkDeviceCreateInfo::ppEnabledExtensionNames

sebelum aplikasi memanggil vkCreateDevice. Untuk setiap VkPhysicalDevice yang akan dipanggilkan vkCreateDevice, aplikasi harus memanggil fungsi ini, lalu harus menambahkan ekstensi yang diidentifikasi ke daftar yang diaktifkan untuk VkDevice. Mirip dengan berbagai fungsi Vulkan, fungsi ini dapat dipanggil dua kali, satu kali untuk mengidentifikasi jumlah ekstensi yang diperlukan, dan sekali lagi dengan memori yang dialokasikan aplikasi yang dapat digunakan fungsi untuk menulis.

Detail
Parameter
physicalDevice
- VkPhysicalDevice yang terkait dengan ekstensi yang tersedia.
availableExtensionCount
- Ini adalah nilai pPropertyCount yang ditampilkan dari vkEnumerateDeviceExtensionProperties.
pAvailableExtensions
- Ini adalah nilai pProperties yang ditampilkan dari vkEnumerateDeviceExtensionProperties.
pRequiredExtensionCount
- Jika pRequiredExtensions adalah nullptr, fungsi menyetelnya ke jumlah ekstensi yang diperlukan. Jika pRequiredExtensions adalah non-nullptr, ini adalah jumlah ekstensi wajib yang harus ditulis oleh fungsi ke pRequiredExtensions.
pRequiredExtensions
- Jika non-nullptr, ini adalah memori yang dialokasikan aplikasi tempat fungsi akan menulis nama ekstensi yang diperlukan. Ini adalah pointer ke array char* strings (yaitu sama dengan VkDeviceCreateInfo::ppEnabledExtensionNames).

SwappyVk_getFenceTimeoutNS

uint64_t SwappyVk_getFenceTimeoutNS()

Mendapatkan parameter waktu tunggu fence untuk perangkat dengan driver yang rusak.

Nilai defaultnya adalah 50.000.000.

SwappyVk_initAndGetRefreshCycleDuration

bool SwappyVk_initAndGetRefreshCycleDuration(
  JNIEnv *env,
  jobject jactivity,
  VkPhysicalDevice physicalDevice,
  VkDevice device,
  VkSwapchainKHR swapchain,
  uint64_t *pRefreshDuration
)

Menginisialisasi SwappyVk untuk perangkat tertentu dan swapchain, dan mendapatkan perkiraan durasi waktu antara periode pengosongan vertikal.

Menggunakan JNI untuk membuat kueri AppVsyncOffset dan PresentationDeadline.

Jika aplikasi Anda melayani lebih dari satu swapchain pada satu waktu, Anda harus memanggil ini untuk setiap swapchain sebelum memanggil swappyVkSetSwapInterval().

Durasi antara periode kosong vertikal (interval) dinyatakan sebagai perkiraan jumlah nanodetik antara periode kosong vertikal dari tampilan fisik swapchain.

Jika aplikasi mengonversi angka ini menjadi pecahan (misalnya 16.666.666 ndetik to 0,016666666) dan membaginya dengan pecahan tersebut, itu akan menjadi rasio refresh tampilan (misalnya 16.666.666 nanodetik sesuai dengan layar 60Hz, 11.111.111 ndetik sesuai dengan tampilan 90Hz).

Detail
Parameter
env
- JNIEnv yang diasumsikan berasal dari fungsi AttachCurrentThread
jactivity
- Handle objek NativeActivity, digunakan untuk JNI
physicalDevice
- VkPhysicalDevice yang terkait dengan swapchain
device
- VkDevice yang terkait dengan swapchain
swapchain
- VkSwapchainKHR yang aplikasi ingin Swappy menukarnya
pRefreshDuration
- Durasi siklus refresh yang ditampilkan
Hasil
bool - true jika nilai yang ditampilkan oleh pRefreshDuration valid, dan false jika error.

SwappyVk_injectTracer

void SwappyVk_injectTracer(
  const SwappyTracer *tracer
)

Memasukkan fungsi callback untuk dipanggil setiap frame.

Detail
Parameter
tracer
- Kumpulan fungsi callback

SwappyVk_queuePresent

VkResult SwappyVk_queuePresent(
  VkQueue queue,
  const VkPresentInfoKHR *pPresentInfo
)

Memberi tahu Swappy untuk menampilkan satu atau beberapa gambar ke swapchain yang sesuai.

Swappy akan memanggil vkQueuePresentKHR untuk aplikasi Anda. Swappy dapat menyisipkan struct ke pNext-chain VkPresentInfoKHR, atau dapat memasukkan perintah Vulkan lainnya untuk mencoba memenuhi interval pertukaran yang diinginkan.

Catatan:Jika aplikasi Anda mempresentasikan ke lebih dari satu swapchain pada satu waktu, dan jika menggunakan interval pertukaran yang berbeda untuk setiap swapchain, Swappy akan mencoba memenuhi interval pertukaran untuk setiap swapchain (lebih berhasil pada perangkat yang mendukung ekstensi waktu presentasi yang mendasarinya, seperti VK_GOOGLE_display_timing).

Detail
Parameter
queue
- VkQueue yang terkait dengan perangkat dan swapchain
pPresentInfo
- Pointer ke VkPresentInfoKHR yang berisi informasi tentang gambar apa yang akan ditampilkan pada swapchain.

SwappyVk_setAutoPipelineMode

void SwappyVk_setAutoPipelineMode(
  bool enabled
)

Mengaktifkan fitur Mode Pipeline Otomatis untuk semua instance.

Secara default, fitur ini diaktifkan. Mengubah fitur ini sepenuhnya bersifat opsional untuk menyempurnakan perilaku swappy.

Detail
Parameter
enabled
- True artinya mengaktifkan, false berarti menonaktifkan

SwappyVk_setAutoSwapInterval

void SwappyVk_setAutoSwapInterval(
  bool enabled
)

Mengaktifkan fitur Interval Pertukaran Otomatis untuk semua instance.

Secara default, fitur ini diaktifkan. Mengubah fitur ini sepenuhnya bersifat opsional untuk menyempurnakan perilaku swappy.

Detail
Parameter
enabled
- True artinya mengaktifkan, false berarti menonaktifkan

SwappyVk_setFenceTimeoutNS

void SwappyVk_setFenceTimeoutNS(
  uint64_t fence_timeout_ns
)

Parameter waktu tunggu fence dapat disetel untuk perangkat dengan driver yang rusak.

Nilai defaultnya adalah 50.000.000.

SwappyVk_setFunctionProvider

void SwappyVk_setFunctionProvider(
  const SwappyVkFunctionProvider *pSwappyVkFunctionProvider
)

Menyetel penyedia fungsi Vulkan.

Ini memungkinkan Anda memberikan objek yang akan digunakan untuk mencari fungsi Vulkan, misalnya untuk mengaitkan penggunaan fungsi tersebut.

Untuk menggunakan fungsi ini, Anda harus memanggil fungsi ini sebelum fungsi lainnya.

Penggunaan fungsi ini sepenuhnya bersifat opsional. Jika tidak menggunakannya, fungsi Vulkan yang diperlukan oleh Swappy akan dimuat secara dinamis dari libvulkan.so.

Detail
Parameter
provider
- objek penyedia

SwappyVk_setMaxAutoSwapIntervalNS

void SwappyVk_setMaxAutoSwapIntervalNS(
  uint64_t max_swap_ns
)

Menyetel durasi pertukaran maksimal untuk semua instance.

Menyetel durasi maksimal untuk Interval Pertukaran Otomatis dalam milidetik. Jika SwappyVk beroperasi dalam interval pertukaran otomatis dan durasi frame lebih lama dari durasi yang disediakan, SwappyVk tidak akan melakukan pacing dan hanya mengirimkan frame sesegera mungkin.

Detail
Parameter
max_swap_ns
- durasi pertukaran maksimal dalam milidetik.

SwappyVk_setQueueFamilyIndex

void SwappyVk_setQueueFamilyIndex(
  VkDevice device,
  VkQueue queue,
  uint32_t queueFamilyIndex
)

Memberi tahu Swappy, queueFamilyIndex yang digunakan untuk membuat VkQueue tertentu.

Swappy perlu mengetahui queueFamilyIndex yang digunakan untuk membuat VkQueue tertentu sehingga dapat digunakan saat melakukan presentasi.

Detail
Parameter
device
- VkDevice yang terkait dengan antrean
queue
- Antrean perangkat.
queueFamilyIndex
- Indeks kelompok antrean yang digunakan untuk membuat VkQueue.

SwappyVk_setSwapIntervalNS

void SwappyVk_setSwapIntervalNS(
  VkDevice device,
  VkSwapchainKHR swapchain,
  uint64_t swap_ns
)

Memberi tahu Swappy bahwa durasi setiap gambar yang ditampilkan harus terlihat.

Jika aplikasi Anda mempresentasikan ke lebih dari satu swapchain pada satu waktu, Anda harus memanggil ini untuk setiap swapchain sebelum melakukan presentasi.

Detail
Parameter
device
- VkDevice yang terkait dengan swapchain
swapchain
- VkSwapchainKHR yang aplikasi ingin Swappy menukarnya
swap_ns
- Durasi setiap gambar yang disajikan harus terlihat dalam nanodetik

SwappyVk_setWindow

void SwappyVk_setWindow(
  VkDevice device,
  VkSwapchainKHR swapchain,
  ANativeWindow *window
)

Memberi tahu Swappy, ANativeWindow mana yang akan digunakan saat memanggil API ANativeWindow_*.

Detail
Parameter
device
- VkDevice yang terkait dengan swapchain
swapchain
- VkSwapchainKHR yang aplikasi ingin Swappy menukarnya
window
- ANativeWindow yang digunakan untuk membuat VkSwapchainKHR

Makro

VK_NO_PROTOTYPES

 VK_NO_PROTOTYPES 1