diff --git a/core/deps/glslang/glslang/OSDependent/Windows/main.cpp b/core/deps/glslang/glslang/OSDependent/Windows/main.cpp deleted file mode 100644 index 0bcde7b66..000000000 --- a/core/deps/glslang/glslang/OSDependent/Windows/main.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// -// Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. -// - -#include "InitializeDll.h" - -#define STRICT -#define VC_EXTRALEAN 1 -#include -#include - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - - if (! glslang::InitProcess()) - return FALSE; - break; - case DLL_THREAD_ATTACH: - - if (! glslang::InitThread()) - return FALSE; - break; - - case DLL_THREAD_DETACH: - - if (! glslang::DetachThread()) - return FALSE; - break; - - case DLL_PROCESS_DETACH: - - glslang::DetachProcess(); - break; - - default: - assert(0 && "DllMain(): Reason for calling DLL Main is unknown"); - return FALSE; - } - - return TRUE; -} diff --git a/core/rend/vulkan/pipeline.h b/core/rend/vulkan/pipeline.h index 70b319907..3c32355f0 100644 --- a/core/rend/vulkan/pipeline.h +++ b/core/rend/vulkan/pipeline.h @@ -278,7 +278,6 @@ public: 1, &subpass, settings.rend.RenderToTextureBuffer ? ARRAY_SIZE(vramWriteDeps) : ARRAY_SIZE(dependencies), settings.rend.RenderToTextureBuffer ? vramWriteDeps : dependencies)); renderPass = *rttRenderPass; - printf("RttPipelineManager renderPass %p created\n", (VkRenderPass)renderPass); } private: diff --git a/core/rend/vulkan/vulkan.h b/core/rend/vulkan/vulkan.h index bbc4c23da..47ec536de 100644 --- a/core/rend/vulkan/vulkan.h +++ b/core/rend/vulkan/vulkan.h @@ -35,6 +35,7 @@ class VulkanContext public: VulkanContext() { verify(contextInstance == nullptr); contextInstance = this; } ~VulkanContext(); + bool Init(); bool InitInstance(const char** extensions, uint32_t extensions_count); bool InitDevice(); void CreateSwapChain(); diff --git a/core/rend/vulkan/vulkan_context.cpp b/core/rend/vulkan/vulkan_context.cpp index 918d768a1..ada164dca 100644 --- a/core/rend/vulkan/vulkan_context.cpp +++ b/core/rend/vulkan/vulkan_context.cpp @@ -133,14 +133,7 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co #ifndef __ANDROID__ vext.push_back("VK_EXT_debug_utils"); extensions_count += 1; -// layer_names.push_back("VK_LAYER_GOOGLE_unique_objects"); // layer_names.push_back("VK_LAYER_LUNARG_api_dump"); -// layer_names.push_back("VK_LAYER_LUNARG_core_validation"); -// layer_names.push_back("VK_LAYER_LUNARG_image"); -// layer_names.push_back("VK_LAYER_LUNARG_object_tracker"); -// layer_names.push_back("VK_LAYER_LUNARG_parameter_validation"); -// layer_names.push_back("VK_LAYER_LUNARG_swapchain"); -// layer_names.push_back("VK_LAYER_GOOGLE_threading"); layer_names.push_back("VK_LAYER_LUNARG_standard_validation"); #else vext.push_back("VK_EXT_debug_report"); // NDK <= 19? @@ -571,6 +564,37 @@ void VulkanContext::CreateSwapChain() } } +bool VulkanContext::Init() +{ + std::vector extensions; + extensions.push_back("VK_KHR_surface"); +#if defined(_WIN32) + extensions.push_back("VK_KHR_win32_surface"); +#elif defined(__MACH__) + extensions.push_back("VK_MVK_macos_surface"); +#elif defined(SUPPORT_X11) + extensions.push_back("VK_KHR_xlib_surface"); +#endif + if (!InitInstance(&extensions[0], extensions.size())) + return false; + + VkSurfaceKHR surface = nullptr; +#if defined(_WIN32) + VkWin32SurfaceCreateInfoKHR createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; + createInfo.hinstance = GetModuleHandle(NULL); + createInfo.hwnd = (HWND)libPvr_GetRenderTarget(); + if (vkCreateWin32SurfaceKHR(*instance, &createInfo, nullptr, &surface) != VK_SUCCESS) + { + ERROR_LOG(RENDERER, "Windows surface creation failed"); + return false; + } +#endif + + SetSurface(surface); + return InitDevice(); +} + void VulkanContext::NewFrame() { if (HasSurfaceDimensionChanged()) diff --git a/core/windows/winmain.cpp b/core/windows/winmain.cpp index f6e139cef..ad80154f5 100644 --- a/core/windows/winmain.cpp +++ b/core/windows/winmain.cpp @@ -8,6 +8,9 @@ #include "win_keyboard.h" #include "hw/sh4/dyna/blockmanager.h" #include "log/LogManager.h" +#ifdef USE_VULKAN +#include "rend/vulkan/vulkan.h" +#endif #define _WIN32_WINNT 0x0500 #include @@ -720,10 +723,29 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi #ifdef _WIN64 setup_seh(); #endif +#ifdef USE_VULKAN + VulkanContext *vulkanContext = nullptr; + if (settings.pvr.rend == 4) + { + vulkanContext = new VulkanContext(); + if (!vulkanContext->Init()) + { + settings.pvr.rend = 0; + delete vulkanContext; + vulkanContext = nullptr; + ERROR_LOG(RENDERER, "Vulkan initialization failed. Falling back to Open GL"); + } + } +#endif rend_thread(NULL); dc_term(); + +#ifdef USE_VULKAN + if (vulkanContext != nullptr) + delete vulkanContext; +#endif } #ifndef __GNUC__ __except( ExeptionHandler(GetExceptionInformation()) )