#pragma once #include "base_sysfb.h" #include "engineerrors.h" #include #include struct FRenderViewpoint; class VkSamplerManager; class VkBufferManager; class VkTextureManager; class VkShaderManager; class VkCommandBufferManager; class VkDescriptorSetManager; class VkRenderPassManager; class VkFramebufferManager; class VkRaytrace; class VkLightmap; class VkRenderState; class VkStreamBuffer; class VkHardwareDataBuffer; class VkHardwareTexture; class VkRenderBuffers; class VkPostprocess; class VulkanRenderDevice : public SystemBaseFrameBuffer { public: VulkanRenderDevice(void* hMonitor, bool fullscreen, std::shared_ptr surface); ~VulkanRenderDevice(); VulkanDevice* GetDevice() { return mDevice.get(); } VkCommandBufferManager* GetCommands() { return mCommands.get(); } VkShaderManager *GetShaderManager() { return mShaderManager.get(); } VkSamplerManager *GetSamplerManager() { return mSamplerManager.get(); } VkBufferManager* GetBufferManager() { return mBufferManager.get(); } VkTextureManager* GetTextureManager() { return mTextureManager.get(); } VkFramebufferManager* GetFramebufferManager() { return mFramebufferManager.get(); } VkDescriptorSetManager* GetDescriptorSetManager() { return mDescriptorSetManager.get(); } VkRenderPassManager *GetRenderPassManager() { return mRenderPassManager.get(); } VkRaytrace* GetRaytrace() { return mRaytrace.get(); } VkLightmap* GetLightmap() { return mLightmap.get(); } VkRenderState *GetRenderState() { return mRenderState.get(); } VkPostprocess *GetPostprocess() { return mPostprocess.get(); } VkRenderBuffers *GetBuffers() { return mActiveRenderBuffers; } FRenderState* RenderState() override; bool IsVulkan() override { return true; } void Update() override; void InitializeState() override; bool CompileNextShader() override; void PrecacheMaterial(FMaterial *mat, int translation) override; void UpdatePalette() override; const char* DeviceName() const override; int Backend() override { return 1; } void SetTextureFilterMode() override; void StartPrecaching() override; void BeginFrame() override; void BlurScene(float amount) override; void PostProcessScene(bool swscene, int fixedcm, float flash, const std::function &afterBloomDrawEndScene2D) override; void AmbientOccludeScene(float m5) override; void SetSceneRenderTarget(bool useSSAO) override; void SetLevelMesh(LevelMesh* mesh) override; void UpdateLightmaps(const TArray& surfaces) override; void SetShadowMaps(const TArray& lights, hwrenderer::LevelAABBTree* tree, bool newTree) override; void SetSaveBuffers(bool yes) override; void ImageTransitionScene(bool unknown) override; void SetActiveRenderTarget() override; IHardwareTexture *CreateHardwareTexture(int numchannels) override; FMaterial* CreateMaterial(FGameTexture* tex, int scaleflags) override; IBuffer* CreateVertexBuffer(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute* attrs) override; IBuffer* CreateIndexBuffer() override; FTexture *WipeStartScreen() override; FTexture *WipeEndScreen() override; TArray GetScreenshotBuffer(int &pitch, ESSType &color_type, float &gamma) override; bool GetVSync() { return mVSync; } void SetVSync(bool vsync) override; void Draw2D() override; void WaitForCommands(bool finish) override; int GetBindlessTextureIndex(FMaterial* material, int clampmode, int translation) override; void DrawLevelMesh(const HWViewpointUniforms& viewpoint) override; private: void RenderTextureView(FCanvasTexture* tex, std::function renderFunc) override; void PrintStartupLog(); void CopyScreenToBuffer(int w, int h, uint8_t *data) override; std::shared_ptr mDevice; std::unique_ptr mCommands; std::unique_ptr mBufferManager; std::unique_ptr mSamplerManager; std::unique_ptr mTextureManager; std::unique_ptr mFramebufferManager; std::unique_ptr mShaderManager; std::unique_ptr mScreenBuffers; std::unique_ptr mSaveBuffers; std::unique_ptr mPostprocess; std::unique_ptr mDescriptorSetManager; std::unique_ptr mRenderPassManager; std::unique_ptr mRaytrace; std::unique_ptr mLightmap; std::unique_ptr mRenderState; VkRenderBuffers *mActiveRenderBuffers = nullptr; bool mVSync = false; LevelMesh* levelMesh = nullptr; bool levelMeshChanged = true; }; class CVulkanError : public CEngineError { public: CVulkanError() : CEngineError() {} CVulkanError(const char* message) : CEngineError(message) {} };