diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index bba23a25e4..810588cad4 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -213,7 +213,7 @@ public: } private: - VulkanContext *vulkan_; + VulkanContext *vulkan_ = nullptr; Promise *module_ = nullptr; VkShaderStageFlagBits vkstage_; bool ok_ = false; diff --git a/Common/Net/HTTPHeaders.h b/Common/Net/HTTPHeaders.h index 5900b01874..b91b376411 100644 --- a/Common/Net/HTTPHeaders.h +++ b/Common/Net/HTTPHeaders.h @@ -18,11 +18,12 @@ public: // Public variables since it doesn't make sense // to bother with accessors for all these. int status = 100; - // Intentional misspelling. - char *referer = nullptr; + + char *referer = nullptr; // Intentional misspelling. char *user_agent = nullptr; char *resource = nullptr; char *params = nullptr; + int content_length = -1; std::unordered_map other; enum RequestType { diff --git a/Common/Net/HTTPServer.cpp b/Common/Net/HTTPServer.cpp index e56a5b9a6a..e1fa53bc6e 100644 --- a/Common/Net/HTTPServer.cpp +++ b/Common/Net/HTTPServer.cpp @@ -81,7 +81,7 @@ Request::~Request() { } delete in_; if (!out_->Empty()) { - ERROR_LOG(IO, "Output not empty - connection abort?"); + ERROR_LOG(IO, "Output not empty - connection abort? (%s)", this->header_.resource); } delete out_; } diff --git a/Common/Thread/ThreadManager.cpp b/Common/Thread/ThreadManager.cpp index 8e7669f888..9e87c1cfd6 100644 --- a/Common/Thread/ThreadManager.cpp +++ b/Common/Thread/ThreadManager.cpp @@ -217,6 +217,16 @@ void ThreadManager::Init(int numRealCores, int numLogicalCoresPerCpu) { } void ThreadManager::EnqueueTask(Task *task) { + if (task->Type() == TaskType::DEDICATED_THREAD) { + std::thread th([=](Task *task) { + SetCurrentThreadName("DedicatedThreadTask"); + task->Run(); + task->Release(); + }, task); + th.detach(); + return; + } + _assert_msg_(IsInitialized(), "ThreadManager not initialized"); int minThread; @@ -270,6 +280,8 @@ void ThreadManager::EnqueueTask(Task *task) { } void ThreadManager::EnqueueTaskOnThread(int threadNum, Task *task) { + _assert_msg_(task->Type() != TaskType::DEDICATED_THREAD, "Dedicated thread tasks can't be put on specific threads"); + _assert_msg_(threadNum >= 0 && threadNum < (int)global_->threads_.size(), "Bad threadnum or not initialized"); ThreadContext *thread = global_->threads_[threadNum]; diff --git a/Common/Thread/ThreadManager.h b/Common/Thread/ThreadManager.h index 69716bd94a..45d1974871 100644 --- a/Common/Thread/ThreadManager.h +++ b/Common/Thread/ThreadManager.h @@ -8,6 +8,7 @@ enum class TaskType { CPU_COMPUTE, IO_BLOCKING, + DEDICATED_THREAD, // These can never get stuck in queue behind others, but are more expensive to launch. Cannot use I/O. }; // Implement this to make something that you can run on the thread manager. diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 6b823a2cc0..11514fcff3 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -98,12 +98,17 @@ static Promise *CompileShaderModuleAsync(VulkanContext *vulkan, #if defined(_DEBUG) // Don't parallelize in debug mode, pathological behavior due to mutex locks in allocator which is HEAVILY used by glslang. - return Promise::AlreadyDone(compile()); + bool singleThreaded = true; #else - return Promise::Spawn(&g_threadManager, compile, TaskType::CPU_COMPUTE); + bool singleThreaded = false; #endif -} + if (singleThreaded) { + return Promise::AlreadyDone(compile()); + } else { + return Promise::Spawn(&g_threadManager, compile, TaskType::CPU_COMPUTE); + } +} VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, FShaderID id, FragmentShaderFlags flags, const char *code) : vulkan_(vulkan), id_(id), flags_(flags) {