Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vulkan threading tweaks and minor #10049

Merged
merged 11 commits into from Nov 5, 2017
1 change: 1 addition & 0 deletions Common/Vulkan/VulkanContext.cpp
Expand Up @@ -137,6 +137,7 @@ VkResult VulkanContext::CreateInstance(const char *app_name, int app_ver, uint32
if (res != VK_SUCCESS) {
init_error_ = "Failed to enumerate physical devices";
vkDestroyInstance(instance_, nullptr);
instance_ = nullptr;
return res;
}

Expand Down
2 changes: 1 addition & 1 deletion Common/Vulkan/VulkanContext.h
Expand Up @@ -378,7 +378,7 @@ class VulkanContext {

std::vector<VkDebugReportCallbackEXT> msg_callbacks;

VkSwapchainKHR swapchain_;
VkSwapchainKHR swapchain_ = VK_NULL_HANDLE;
VkFormat swapchainFormat_;

uint32_t queue_count = 0;
Expand Down
4 changes: 2 additions & 2 deletions GPU/Common/FramebufferCommon.cpp
Expand Up @@ -837,7 +837,7 @@ void FramebufferManagerCommon::SetViewport2D(int x, int y, int w, int h) {
}

void FramebufferManagerCommon::CopyDisplayToOutput() {
// DownloadFramebufferOnSwitch(currentRenderVfb_);
DownloadFramebufferOnSwitch(currentRenderVfb_);

currentRenderVfb_ = 0;

Expand Down Expand Up @@ -1072,7 +1072,7 @@ void FramebufferManagerCommon::DecimateFBOs() {
currentRenderVfb_ = 0;

for (auto iter : fbosToDelete_) {
delete iter;
iter->Release();
}
fbosToDelete_.clear();

Expand Down
3 changes: 3 additions & 0 deletions UI/EmuScreen.cpp
Expand Up @@ -1038,6 +1038,9 @@ void EmuScreen::render() {
if (!osm.IsEmpty() || g_Config.bShowDebugStats || g_Config.iShowFPSCounter || g_Config.bShowTouchControls || g_Config.bShowDeveloperMenu || g_Config.bShowAudioDebug || saveStatePreview_->GetVisibility() != UI::V_GONE || g_Config.bShowFrameProfiler) {
DrawContext *thin3d = screenManager()->getDrawContext();

// It's possible we never ended up outputted anything - make sure we have the backbuffer.
thin3d->BindFramebufferAsRenderTarget(nullptr, { RPAction::KEEP, RPAction::KEEP });

// This sets up some important states but not the viewport.
screenManager()->getUIContext()->Begin();

Expand Down
4 changes: 2 additions & 2 deletions Windows/GPU/WindowsVulkanContext.cpp
Expand Up @@ -208,7 +208,8 @@ bool WindowsVulkanContext::Init(HINSTANCE hInst, HWND hWnd, std::string *error_m
}

void WindowsVulkanContext::Shutdown() {
draw_->HandleEvent(Draw::Event::LOST_BACKBUFFER, g_Vulkan->GetBackbufferWidth(), g_Vulkan->GetBackbufferHeight());
if (draw_)
draw_->HandleEvent(Draw::Event::LOST_BACKBUFFER, g_Vulkan->GetBackbufferWidth(), g_Vulkan->GetBackbufferHeight());

delete draw_;
draw_ = nullptr;
Expand All @@ -227,7 +228,6 @@ void WindowsVulkanContext::SwapBuffers() {
}

void WindowsVulkanContext::Resize() {
g_Vulkan->WaitUntilQueueIdle();
draw_->HandleEvent(Draw::Event::LOST_BACKBUFFER, g_Vulkan->GetBackbufferWidth(), g_Vulkan->GetBackbufferHeight());
g_Vulkan->DestroyObjects();

Expand Down
1 change: 0 additions & 1 deletion android/jni/app-android.cpp
Expand Up @@ -341,7 +341,6 @@ void AndroidVulkanContext::SwapBuffers() {
}

void AndroidVulkanContext::Resize() {
g_Vulkan->WaitUntilQueueIdle();
draw_->HandleEvent(Draw::Event::LOST_BACKBUFFER, g_Vulkan->GetBackbufferWidth(), g_Vulkan->GetBackbufferHeight());
g_Vulkan->DestroyObjects();

Expand Down
13 changes: 13 additions & 0 deletions ext/native/thin3d/VulkanQueueRunner.cpp
Expand Up @@ -326,6 +326,7 @@ void VulkanQueueRunner::PerformRenderPass(const VKRStep &step, VkCommandBuffer c

vkCmdPipelineBarrier(cmd, srcStage, dstStage, 0, 0, nullptr, 0, nullptr, 1, &barrier);
iter.fb->color.layout = barrier.newLayout;
iter.fb->Release();
}
}

Expand Down Expand Up @@ -573,6 +574,10 @@ void VulkanQueueRunner::PerformBindFramebufferAsRenderTarget(const VKRStep &step
rp_begin.clearValueCount = numClearVals;
rp_begin.pClearValues = numClearVals ? clearVal : nullptr;
vkCmdBeginRenderPass(cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);

if (step.render.framebuffer) {
step.render.framebuffer->Release();
}
}

void VulkanQueueRunner::PerformCopy(const VKRStep &step, VkCommandBuffer cmd) {
Expand Down Expand Up @@ -646,6 +651,9 @@ void VulkanQueueRunner::PerformCopy(const VKRStep &step, VkCommandBuffer cmd) {
}
vkCmdCopyImage(cmd, src->depth.image, src->depth.layout, dst->depth.image, dst->depth.layout, 1, &copy);
}

src->Release();
dst->Release();
}

void VulkanQueueRunner::PerformBlit(const VKRStep &step, VkCommandBuffer cmd) {
Expand Down Expand Up @@ -729,6 +737,9 @@ void VulkanQueueRunner::PerformBlit(const VKRStep &step, VkCommandBuffer cmd) {
}
vkCmdBlitImage(cmd, src->depth.image, src->depth.layout, dst->depth.image, dst->depth.layout, 1, &blit, step.blit.filter);
}

src->Release();
dst->Release();
}

void VulkanQueueRunner::SetupTransitionToTransferSrc(VKRImage &img, VkImageMemoryBarrier &barrier, VkPipelineStageFlags &stage, VkImageAspectFlags aspect) {
Expand Down Expand Up @@ -831,6 +842,8 @@ void VulkanQueueRunner::PerformReadback(const VKRStep &step, VkCommandBuffer cmd
vkCmdCopyImageToBuffer(cmd, srcImage->image, srcImage->layout, readbackBuffer_, 1, &region);

// NOTE: Can't read the buffer using the CPU here - need to sync first.

step.readback.src->Release();
}

void VulkanQueueRunner::CopyReadbackBuffer(int width, int height, Draw::DataFormat destFormat, int pixelStride, uint8_t *pixels) {
Expand Down