1 #pragma once 2 3 #include "vulkan/VulkanDef.h" 4 #include "vulkan/Instance.h" 5 #include "vulkan/Image.h" 6 #include "GSH_VulkanContext.h" 7 #include "GSH_VulkanFrameCommandBuffer.h" 8 #include "GSH_VulkanClutLoad.h" 9 #include "GSH_VulkanDraw.h" 10 #include "GSH_VulkanPresent.h" 11 #include "GSH_VulkanTransferHost.h" 12 #include "GSH_VulkanTransferLocal.h" 13 #include <vector> 14 #include "../GSHandler.h" 15 #include "../GsCachedArea.h" 16 #include "../GsTextureCache.h" 17 18 class CGSH_Vulkan : public CGSHandler 19 { 20 public: 21 CGSH_Vulkan(); 22 virtual ~CGSH_Vulkan() = default; 23 24 static Framework::Vulkan::CInstance CreateInstance(bool); 25 26 void SetPresentationParams(const CGSHandler::PRESENTATION_PARAMS&) override; 27 28 void ProcessHostToLocalTransfer() override; 29 void ProcessLocalToHostTransfer() override; 30 void ProcessLocalToLocalTransfer() override; 31 void ProcessClutTransfer(uint32, uint32) override; 32 void ReadFramebuffer(uint32, uint32, void*) override; 33 34 uint8* GetRam() const override; 35 36 Framework::CBitmap GetScreenshot() override; 37 38 protected: 39 void WriteRegisterImpl(uint8, uint64) override; 40 void InitializeImpl() override; 41 void ReleaseImpl() override; 42 void ResetImpl() override; 43 void MarkNewFrame() override; 44 void FlipImpl() override; 45 void BeginTransferWrite() override; 46 void TransferWrite(const uint8*, uint32) override; 47 void SyncCLUT(const TEX0&) override; 48 49 Framework::Vulkan::CInstance m_instance; 50 GSH_Vulkan::ContextPtr m_context; 51 52 private: 53 struct VERTEX 54 { 55 uint64 position; 56 uint64 rgbaq; 57 uint64 uv; 58 uint64 st; 59 uint8 fog; 60 }; 61 62 struct CLUTKEY : public convertible<uint64> 63 { 64 uint32 idx4 : 1; 65 uint32 cbp : 14; 66 uint32 cpsm : 4; 67 uint32 csm : 1; 68 uint32 csa : 5; 69 uint32 cbw : 6; 70 uint32 cou : 6; 71 uint32 cov : 10; 72 uint32 reserved : 16; 73 }; 74 static_assert(sizeof(CLUTKEY) == sizeof(uint64), "CLUTKEY too big for an uint64"); 75 76 enum 77 { 78 CLUT_CACHE_SIZE = 32, 79 }; 80 81 virtual void PresentBackbuffer() = 0; 82 83 std::vector<VkPhysicalDevice> GetPhysicalDevices(); 84 uint32 GetPhysicalDeviceIndex(const std::vector<VkPhysicalDevice>&) const; 85 std::vector<uint32_t> GetRenderQueueFamilies(VkPhysicalDevice); 86 std::vector<VkSurfaceFormatKHR> GetDeviceSurfaceFormats(VkPhysicalDevice); 87 88 void CreateDevice(VkPhysicalDevice); 89 void CreateDescriptorPool(); 90 void CreateMemoryBuffer(); 91 void CreateClutBuffer(); 92 93 void VertexKick(uint8, uint64); 94 void SetRenderingContext(uint64); 95 96 void Prim_Line(); 97 void Prim_Triangle(); 98 void Prim_Sprite(); 99 100 int32 FindCachedClut(const CLUTKEY&) const; 101 static CLUTKEY MakeCachedClutKey(const TEX0&, const TEXCLUT&); 102 103 GSH_Vulkan::FrameCommandBufferPtr m_frameCommandBuffer; 104 GSH_Vulkan::ClutLoadPtr m_clutLoad; 105 GSH_Vulkan::DrawPtr m_draw; 106 GSH_Vulkan::PresentPtr m_present; 107 GSH_Vulkan::TransferHostPtr m_transferHost; 108 GSH_Vulkan::TransferLocalPtr m_transferLocal; 109 110 uint8* m_memoryBufferPtr = nullptr; 111 112 //Draw context 113 VERTEX m_vtxBuffer[3]; 114 uint32 m_vtxCount = 0; 115 uint32 m_primitiveType = 0; 116 PRMODE m_primitiveMode; 117 float m_primOfsX = 0; 118 float m_primOfsY = 0; 119 uint32 m_texWidth = 0; 120 uint32 m_texHeight = 0; 121 CLUTKEY m_clutStates[CLUT_CACHE_SIZE]; 122 uint32 m_nextClutCacheIndex = 0; 123 std::vector<uint8> m_xferBuffer; 124 125 Framework::Vulkan::CImage m_swizzleTablePSMCT32; 126 Framework::Vulkan::CImage m_swizzleTablePSMCT16; 127 Framework::Vulkan::CImage m_swizzleTablePSMCT16S; 128 Framework::Vulkan::CImage m_swizzleTablePSMT8; 129 Framework::Vulkan::CImage m_swizzleTablePSMT4; 130 Framework::Vulkan::CImage m_swizzleTablePSMZ32; 131 Framework::Vulkan::CImage m_swizzleTablePSMZ16; 132 }; 133