(Win32) Wechsel von Vulkan auf D3D11 Renderer lässt das Fenster nicht freigeben [geschlossen]

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: (Win32) Wechsel von Vulkan auf D3D11 Renderer lässt das Fenster nicht freigeben [geschlossen]

by Anonymous » 24 Aug 2025, 02:06

Bearbeiten: Beantwortet (aber Frage geschlossen) < /h2>
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;
}
}
Bearbeiten, mit Antwort:
https://registry.khronos.org/vulkan/spe ... fader.html & surfa. Win32 -Fenster zwischen Grafik -APIs nach der Erstellung einer Swapchain.

Top