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