44 std::string GetApiDescription()
const override;
46 bool IsReadyForRender()
override;
49 bool IsD3DInternal()
override;
50 intptr_t CreateTexture(
RageSurface* img,
bool RGBA8)
override;
51 void UpdateTexture(intptr_t textureHandle,
57 void DeleteTexture(intptr_t handle)
override;
58 void ClearAllTextures()
override;
61 int& iTextureWidthOut,
62 int& iTextureHeightOut)
override;
64 const std::string& vertexShaderPath,
65 const std::string& fragmentShaderPath)
override;
66 void ReloadPipelines()
override;
68 int GetMaxTextureSize()
override;
70 void RescaleBatchBuffers(
size_t sizeScale)
override;
73 constexpr static size_t FramesInFlight = 3;
75 vk::raii::Context m_Context;
76 vk::raii::Instance m_Instance =
nullptr;
77 vk::raii::DebugUtilsMessengerEXT m_DebugMessenger =
nullptr;
78 vk::raii::PhysicalDevice m_PhysicalDevice =
nullptr;
79 vk::raii::Device m_Device =
nullptr;
80 vk::raii::SurfaceKHR m_Surface =
nullptr;
81 vk::raii::Queue m_GraphicsQueue =
nullptr;
82 uint32_t m_GraphicsQueueFamily = 0;
83 vk::raii::Queue m_PresentQueue =
nullptr;
84 uint32_t m_PresentQueueFamily = 0;
85 VmaAllocator m_Allocator =
nullptr;
86 vk::Format m_DepthFormat = {};
87 vk::SampleCountFlagBits m_MsaaSamples = {};
88 void InitVulkanState();
90 vk::raii::SwapchainKHR m_Swapchain =
nullptr;
91 vk::Extent2D m_SwapchainExtent;
92 std::vector<vk::Image> m_SwapchainImages;
93 vk::Format m_ImageFormat = {};
94 std::array<Texture, FramesInFlight> m_SwapchainDepthTextures;
95 std::array<Texture, FramesInFlight> m_MsaaTextures;
96 bool m_MsaaTexturesAreDirty =
false;
97 bool m_SwapchainVSync =
false;
98 bool m_SwapchainBorderless =
false;
99 bool m_SwapchainIsInvalid =
false;
100 bool m_SmoothLines =
false;
102 void InitSwapchain(uint32_t width,
105 bool borderlessWindow,
107 void RecreateSwapchain();
108 void CleanupSwapchain();
110 std::vector<vk::raii::ImageView> m_SwapchainImageViews;
111 void InitImageViews();
113 vk::raii::DescriptorSetLayout m_DescriptorSetLayout =
nullptr;
114 vk::raii::DescriptorSetLayout m_TextureLayout =
nullptr;
115 void InitGraphicsPipeline();
116 std::vector<vk::DescriptorSetLayoutBinding> GetDescriptorBindings();
117 vk::raii::DescriptorPool m_DescriptorPool =
nullptr;
118 std::vector<vk::raii::DescriptorSet> m_DescriptorSets;
120 std::vector<vk::DescriptorSetLayoutBinding> GetTextureBindings();
121 vk::raii::DescriptorPool m_TextureDescriptorPool =
nullptr;
122 vk::raii::DescriptorSet m_TextureDescriptorSet =
nullptr;
124 vk::raii::CommandPool m_CommandPool =
nullptr;
125 void InitCommandPool();
127 std::vector<vk::raii::CommandBuffer> m_CommandBuffers;
128 void InitCommandBuffers();
130 void TransitionImageLayout(vk::Image& image,
131 vk::ImageLayout oldLayout,
132 vk::ImageLayout newLayout,
133 vk::AccessFlags2 srcAccessMask,
134 vk::AccessFlags2 dstAccessMask,
135 vk::PipelineStageFlags2 srcStageMask,
136 vk::PipelineStageFlags2 dstStageMask,
137 vk::ImageAspectFlags aspectMask,
138 vk::raii::CommandBuffer& commandBuffer);
140 std::vector<vk::raii::Semaphore> m_PresentCompleteSemaphore;
141 std::vector<vk::raii::Semaphore> m_RenderFinishedSemaphore;
142 std::vector<vk::raii::Fence> m_InFlightFence;
143 uint32_t m_CurrentFrame = 0;
144 int m_CurrentImage = 0;
145 void InitSyncStructures();
146 void RecordCommands(uint32_t imageIndex,
148 void SetBlendMode(BlendMode mode, vk::raii::CommandBuffer& buffer);
150 std::array<PersistentBuffer, FramesInFlight> m_VertexBuffer;
151 std::array<PersistentBuffer, FramesInFlight> m_IndexBuffer;
152 std::array<PersistentBuffer, FramesInFlight> m_MatrixStateBuffer;
153 std::array<PersistentBuffer, FramesInFlight> m_ShaderScratchBuffer;
154 std::array<PersistentBuffer, FramesInFlight> m_StagingBuffer;
156 void InitBatchDescriptors();
157 void InitBatchBuffers(
size_t sizeScale);
158 void InitTextureInfo();
161 std::map<intptr_t, Texture> m_Textures;
162 std::map<intptr_t, Texture> m_DepthTextures;
163 std::set<intptr_t> m_EmptyTextureSlots;
165 std::vector<intptr_t> m_DirtyTextures;
166 std::vector<intptr_t> m_DirtyDepthTextures;
167 std::vector<intptr_t> m_DirtyTextureDescriptors;
168 std::vector<vk::ImageMemoryBarrier2> m_DirtyPreBarriers;
169 std::vector<vk::ImageMemoryBarrier2> m_DirtyPostBarriers;
170 std::vector<vk::DescriptorImageInfo> m_DirtyImageInfos;
171 std::vector<vk::WriteDescriptorSet> m_DirtyImageDescWrites;
172 int GetMaxTextureCount();
173 int m_TextureCount = 0;
174 int m_TextureSize = -1;
175 void DestroyTexture(
Texture& texture);
177 std::array<vk::raii::Sampler, Texture::PossibleSamplerCount> m_Samplers;
179 void ResolutionChanged()
override;
180 intptr_t CreateRenderTargetTexture(
int width,
185 std::optional<PipelineCache> m_Cache;