tl; dr pro The Vulkan -Spezifikation ist es ein undefiniertes Verhalten, um einen Win32 -Fenstergriff zwischen Grafik -Apis nach der Erschaffung eines Swapchains zu passieren. Away. Ich schreibe eine Videospiel -Engine, die ein Menü zwischen den Grafik -Backends wechselt. Initialisiert, ist der Übergang zwischen D3D9 und D3D11 glatt und wechselt von D3D zu Vulkan auch normal. Das Umschalten von Vulkan zu D3D verhalten nicht wie erwartet. Vulkan verlässt das Fenster, löst aber nicht frei. D3D11 und D3D9 werden nach dem Abschluss von Vulkan erfolgreich initialisiert, aber auch nicht, auch wenn Vulkan beendet ist (einschließlich der DLL mit Freelibrary () ). Ich trat durch den Debugger, um sicherzustellen, dass der Destruktor meines Vulkan -Kapitäns aufgerufen wird. Dxgiswapchain :: Present () meldet keine Probleme. Die Größe des Fensters (Upscaling) führt dazu, dass das gefrorene Vulkan -Bild immer noch angezeigt wird, aber jetzt mit schwarzen Grenzen außerhalb des vorherigen Ansichtsfensters (während immer noch im erweiterten Kundenbereich) erweitert wird. Die Neuinitialisierung von Vulkan aus D3D führt ohne Probleme aus, als ob Vulkan den Fensterkundenbereich wieder aufnimmt und wie gewohnt fortgesetzt wird. Ist dies ein Treiberfehler oder ein Fehler, den ich gemacht habe?
Code: Select all
HMODULE dll_;
VkInstance instance_;
VkSurfaceKHR surface_;
VkPhysicalDevice GPU_;
VkDevice device_;
VkSwapchainKHR swapChain_;
VkImage *swapChainImages_;
VkImageView *swapChainViews_;
VkFramebuffer *swapChainFrameBuffers_;
VkExtent2D swapChainExtent_;
VkFormat swapChainFormat_;
u32 swapChainImageCount_, frameIndex_, imageIndex_;
VkRenderPass renderPass_;
VkPipelineLayout pipelineLayout_;
VkPipeline pipeline_;
VkCommandPool commandPool_;
VkCommandBuffer commandBuffers_ [MAX_CONCURRENT_FRAMES]; // FENCE SYNCED
VkCommandBuffer drawCommandBuffers_ [MAX_CONCURRENT_FRAMES]; // FENCE SYNCED
VkFence frameFence_ [MAX_CONCURRENT_FRAMES]; // SYNC CMD BUFS
VkSemaphore imageReadySemaphores_[MAX_CONCURRENT_FRAMES];
VkSemaphore *drawDoneSemaphores_; // N = scImageCount
vk::q::FamilyIndices queueFamilyIndices_;
vk::q::Queues queues_;
< /code>
Vulkan Destructor: < /p>
VK::~VK()
{
if (dll_)
{
// Queues do not need to be released
// Logical device CAN be destroyed
if (device_)
{
freeSyncObjects(); // Waits for device idling
freeCommandPools();
if (pipeline_)
{
vkDestroyPipeline(device_, pipeline_, nullptr);
pipeline_ = nullptr;
}
if (pipelineLayout_)
{
vkDestroyPipelineLayout(device_, pipelineLayout_, nullptr);
pipelineLayout_ = nullptr;
}
if (renderPass_)
{
vkDestroyRenderPass(device_, renderPass_, nullptr);
renderPass_ = nullptr;
}
freeSwapchain();
vkDestroyDevice(device_, nullptr);
device_ = nullptr;
}
// Physical device cannot be destroyed
if (surface_)
{
vkDestroySurfaceKHR(instance_, surface_, nullptr);
surface_ = nullptr;
}
if (instance_)
{
vkDestroyInstance(instance_, nullptr);
instance_ = nullptr;
}
FreeLibrary(dll_);
dll_ = nullptr;
}
}
https://registry.khronos.org/vulkan/spe ... fader.html & surfa. Win32 -Fenster zwischen Grafik -APIs nach der Erstellung einer Swapchain.