mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Fixes #17014 Even if our depth-testing-equal heuristic believes that the game needs lower depth resolution. This removes some depth-fighting artifacts (that are present on the real PSP, but nice to avoid) in Outrun, Split/Second and Cars: Race-o-Rama - essentially reverting these to the behavior we had before the heuristic. (The heuristic is good though - it means less compat.ini hacks going in the other direction). In the case of Outrun, this relies on two passes that pass exactly the same vertex coordinates twice resulting in the exact same final geometry. This is actually guaranteed by the spec if the vertex math is exactly the same and "invariant" is set on the position output, though I guess you never know.. Haven't seen any issues at least. Also sneak in disabling some validation messages from using extra Vulkan validation layers other than the default.
268 lines
13 KiB
C++
268 lines
13 KiB
C++
// Copyright (c) 2016- PPSSPP Project.
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, version 2.0 or later versions.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License 2.0 for more details.
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
// Official git repository and contact information can be found at
|
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
|
|
|
#pragma once
|
|
|
|
#ifdef __ANDROID__
|
|
#define VK_USE_PLATFORM_ANDROID_KHR
|
|
#elif defined(_WIN32)
|
|
#define VK_USE_PLATFORM_WIN32_KHR
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#ifndef NOMINMAX
|
|
#define NOMINMAX
|
|
#endif
|
|
#elif defined(__APPLE__)
|
|
#define VK_USE_PLATFORM_METAL_EXT
|
|
#endif
|
|
|
|
#define VK_NO_PROTOTYPES
|
|
|
|
#include "ext/vulkan/vulkan.h"
|
|
|
|
// Hacky X11 header workaround
|
|
#ifdef Opposite
|
|
#undef Opposite
|
|
#endif
|
|
|
|
namespace PPSSPP_VK {
|
|
// Putting our own Vulkan function pointers in a namespace ensures that ppsspp_libretro.so doesn't collide with libvulkan.so.
|
|
extern PFN_vkCreateInstance vkCreateInstance;
|
|
extern PFN_vkDestroyInstance vkDestroyInstance;
|
|
extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
|
|
extern PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;
|
|
extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
|
|
extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;
|
|
extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;
|
|
extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
|
|
extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
|
|
extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
|
|
extern PFN_vkGetPhysicalDeviceMemoryProperties2 vkGetPhysicalDeviceMemoryProperties2;
|
|
extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
|
|
extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
|
|
extern PFN_vkCreateDevice vkCreateDevice;
|
|
extern PFN_vkDestroyDevice vkDestroyDevice;
|
|
extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
|
|
extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
|
|
extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
|
|
extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;
|
|
extern PFN_vkGetDeviceQueue vkGetDeviceQueue;
|
|
extern PFN_vkQueueSubmit vkQueueSubmit;
|
|
extern PFN_vkQueueWaitIdle vkQueueWaitIdle;
|
|
extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
|
|
extern PFN_vkAllocateMemory vkAllocateMemory;
|
|
extern PFN_vkFreeMemory vkFreeMemory;
|
|
extern PFN_vkMapMemory vkMapMemory;
|
|
extern PFN_vkUnmapMemory vkUnmapMemory;
|
|
extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
|
|
extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
|
|
extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;
|
|
extern PFN_vkBindBufferMemory vkBindBufferMemory;
|
|
extern PFN_vkBindBufferMemory2 vkBindBufferMemory2;
|
|
extern PFN_vkBindImageMemory vkBindImageMemory;
|
|
extern PFN_vkBindImageMemory2 vkBindImageMemory2;
|
|
extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
|
|
extern PFN_vkGetBufferMemoryRequirements2 vkGetBufferMemoryRequirements2;
|
|
extern PFN_vkGetDeviceBufferMemoryRequirements vkGetDeviceBufferMemoryRequirements;
|
|
extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
|
|
extern PFN_vkGetImageMemoryRequirements2 vkGetImageMemoryRequirements2;
|
|
extern PFN_vkGetDeviceImageMemoryRequirements vkGetDeviceImageMemoryRequirements;
|
|
extern PFN_vkQueueBindSparse vkQueueBindSparse;
|
|
extern PFN_vkCreateFence vkCreateFence;
|
|
extern PFN_vkDestroyFence vkDestroyFence;
|
|
extern PFN_vkResetFences vkResetFences;
|
|
extern PFN_vkGetFenceStatus vkGetFenceStatus;
|
|
extern PFN_vkWaitForFences vkWaitForFences;
|
|
extern PFN_vkCreateSemaphore vkCreateSemaphore;
|
|
extern PFN_vkDestroySemaphore vkDestroySemaphore;
|
|
extern PFN_vkCreateEvent vkCreateEvent;
|
|
extern PFN_vkDestroyEvent vkDestroyEvent;
|
|
extern PFN_vkGetEventStatus vkGetEventStatus;
|
|
extern PFN_vkSetEvent vkSetEvent;
|
|
extern PFN_vkResetEvent vkResetEvent;
|
|
extern PFN_vkCreateQueryPool vkCreateQueryPool;
|
|
extern PFN_vkDestroyQueryPool vkDestroyQueryPool;
|
|
extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
|
|
extern PFN_vkCreateBuffer vkCreateBuffer;
|
|
extern PFN_vkDestroyBuffer vkDestroyBuffer;
|
|
extern PFN_vkCreateBufferView vkCreateBufferView;
|
|
extern PFN_vkDestroyBufferView vkDestroyBufferView;
|
|
extern PFN_vkCreateImage vkCreateImage;
|
|
extern PFN_vkDestroyImage vkDestroyImage;
|
|
extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
|
|
extern PFN_vkCreateImageView vkCreateImageView;
|
|
extern PFN_vkDestroyImageView vkDestroyImageView;
|
|
extern PFN_vkCreateShaderModule vkCreateShaderModule;
|
|
extern PFN_vkDestroyShaderModule vkDestroyShaderModule;
|
|
extern PFN_vkCreatePipelineCache vkCreatePipelineCache;
|
|
extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
|
|
extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData;
|
|
extern PFN_vkMergePipelineCaches vkMergePipelineCaches;
|
|
extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
|
|
extern PFN_vkCreateComputePipelines vkCreateComputePipelines;
|
|
extern PFN_vkDestroyPipeline vkDestroyPipeline;
|
|
extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
|
|
extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
|
|
extern PFN_vkCreateSampler vkCreateSampler;
|
|
extern PFN_vkDestroySampler vkDestroySampler;
|
|
extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
|
|
extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
|
|
extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
|
|
extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
|
|
extern PFN_vkResetDescriptorPool vkResetDescriptorPool;
|
|
extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
|
|
extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets;
|
|
extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
|
|
extern PFN_vkCreateFramebuffer vkCreateFramebuffer;
|
|
extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
|
|
extern PFN_vkCreateRenderPass vkCreateRenderPass;
|
|
extern PFN_vkDestroyRenderPass vkDestroyRenderPass;
|
|
extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;
|
|
extern PFN_vkCreateCommandPool vkCreateCommandPool;
|
|
extern PFN_vkDestroyCommandPool vkDestroyCommandPool;
|
|
extern PFN_vkResetCommandPool vkResetCommandPool;
|
|
extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
|
|
extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
|
|
extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
|
|
extern PFN_vkEndCommandBuffer vkEndCommandBuffer;
|
|
extern PFN_vkResetCommandBuffer vkResetCommandBuffer;
|
|
extern PFN_vkCmdBindPipeline vkCmdBindPipeline;
|
|
extern PFN_vkCmdSetViewport vkCmdSetViewport;
|
|
extern PFN_vkCmdSetScissor vkCmdSetScissor;
|
|
extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
|
|
extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
|
|
extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;
|
|
extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;
|
|
extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
|
|
extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
|
|
extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
|
|
extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
|
|
extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
|
|
extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
|
|
extern PFN_vkCmdDraw vkCmdDraw;
|
|
extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
|
|
extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
|
|
extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
|
|
extern PFN_vkCmdDispatch vkCmdDispatch;
|
|
extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;
|
|
extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
|
|
extern PFN_vkCmdCopyImage vkCmdCopyImage;
|
|
extern PFN_vkCmdBlitImage vkCmdBlitImage;
|
|
extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
|
|
extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;
|
|
extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;
|
|
extern PFN_vkCmdFillBuffer vkCmdFillBuffer;
|
|
extern PFN_vkCmdClearColorImage vkCmdClearColorImage;
|
|
extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;
|
|
extern PFN_vkCmdClearAttachments vkCmdClearAttachments;
|
|
extern PFN_vkCmdResolveImage vkCmdResolveImage;
|
|
extern PFN_vkCmdSetEvent vkCmdSetEvent;
|
|
extern PFN_vkCmdResetEvent vkCmdResetEvent;
|
|
extern PFN_vkCmdWaitEvents vkCmdWaitEvents;
|
|
extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
|
|
extern PFN_vkCmdBeginQuery vkCmdBeginQuery;
|
|
extern PFN_vkCmdEndQuery vkCmdEndQuery;
|
|
extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
|
|
extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;
|
|
extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
|
|
extern PFN_vkCmdPushConstants vkCmdPushConstants;
|
|
extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
|
|
extern PFN_vkCmdNextSubpass vkCmdNextSubpass;
|
|
extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
|
|
extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
|
|
|
|
#ifdef __ANDROID__
|
|
extern PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;
|
|
#elif defined(_WIN32)
|
|
extern PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
|
|
#elif defined(VK_USE_PLATFORM_METAL_EXT)
|
|
extern PFN_vkCreateMetalSurfaceEXT vkCreateMetalSurfaceEXT;
|
|
#endif
|
|
#if defined(VK_USE_PLATFORM_XLIB_KHR)
|
|
extern PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;
|
|
#endif
|
|
#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
|
|
extern PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;
|
|
#endif
|
|
#if defined(VK_USE_PLATFORM_DISPLAY_KHR)
|
|
extern PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR;
|
|
extern PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR;
|
|
extern PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
|
|
extern PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR;
|
|
extern PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR;
|
|
extern PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR;
|
|
#endif
|
|
|
|
extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
|
|
|
|
// Simple loader for the WSI extension.
|
|
extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
|
|
extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
|
|
extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
|
|
extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
|
|
|
|
extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
|
|
extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
|
|
extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
|
|
extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
|
|
extern PFN_vkQueuePresentKHR vkQueuePresentKHR;
|
|
|
|
extern PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;
|
|
extern PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;
|
|
extern PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT;
|
|
extern PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT;
|
|
extern PFN_vkCmdInsertDebugUtilsLabelEXT vkCmdInsertDebugUtilsLabelEXT;
|
|
extern PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT;
|
|
extern PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT;
|
|
|
|
// Assorted other extensions.
|
|
extern PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;
|
|
extern PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;
|
|
extern PFN_vkGetMemoryHostPointerPropertiesEXT vkGetMemoryHostPointerPropertiesEXT;
|
|
extern PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR;
|
|
extern PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR;
|
|
extern PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR;
|
|
} // namespace PPSSPP_VK
|
|
|
|
// For fast extension-enabled checks.
|
|
struct VulkanExtensions {
|
|
bool EXT_debug_utils;
|
|
bool KHR_maintenance1; // required for KHR_create_renderpass2
|
|
bool KHR_maintenance2;
|
|
bool KHR_maintenance3;
|
|
bool KHR_multiview; // required for KHR_create_renderpass2
|
|
bool KHR_get_memory_requirements2;
|
|
bool KHR_dedicated_allocation;
|
|
bool KHR_create_renderpass2;
|
|
bool KHR_get_physical_device_properties2;
|
|
bool KHR_depth_stencil_resolve;
|
|
bool EXT_shader_stencil_export;
|
|
bool EXT_swapchain_colorspace;
|
|
bool ARM_rasterization_order_attachment_access;
|
|
bool EXT_fragment_shader_interlock;
|
|
// bool EXT_depth_range_unrestricted; // Allows depth outside [0.0, 1.0] in 32-bit float depth buffers.
|
|
};
|
|
|
|
// Way to do a quick check before even attempting to load.
|
|
bool VulkanMayBeAvailable();
|
|
void VulkanSetAvailable(bool available);
|
|
|
|
bool VulkanLoad();
|
|
void VulkanLoadInstanceFunctions(VkInstance instance, const VulkanExtensions &enabledExtensions);
|
|
void VulkanLoadDeviceFunctions(VkDevice device, const VulkanExtensions &enabledExtensions);
|
|
void VulkanFree();
|
|
|
|
const char *VulkanResultToString(VkResult res);
|