Редактировать: Ответ (но на вопрос закрыт) < /h2>
tl; DR в соответствии с спецификацией Vulkan, это неопределенное поведение для прохождения оконного ручки Win32 между графическими API после создания Swapchain. AWATE. I am writing a video game engine which has a menu to switch between graphics backends, two of which are implemented to where they initialise and draw a test triangle scene:
- Vulkan (red background)
- D3D11 (blue background)
Вульганские слои валидации отладки Vulkan не жалуются на проблемы, объекты выпускаются успешно и в правильном порядке. Я прошел через отладчик, чтобы обеспечить название деструктора моего вулканского инкапсутора, инициализации D3D11 и D3D11 выполняет команды Draw. DXGISWAPCHAIN :: Presest () не является вопросами сообщений. Изменение размера окна (повышение квалификации) приводит к тому, что замороженное изображение Vulkan все еще отображалось, но теперь расширяется с черными границами за пределами предыдущего просмотра (пока в пределах расширенной области клиента). Повторная инициализация Vulkan из D3D выполняет без проблем, как будто Vulkan захватывает область клиента окон и продолжается как обычно. Это ошибка драйвера или ошибка, которую я совершил?
Код: Выделить всё
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 ... rface.html
indeferse iteef/inefine. Win32 окно между графическими API после создания Swapchain.
Подробнее здесь: https://stackoverflow.com/questions/797 ... ase-window