mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-09 00:12:14 +02:00
de632fc9c8
We now differentiate between a resize event and surface change/destroyed event, reducing the overhead for resizes in the Vulkan backend. It is also now now safe to change the surface multiple times if the video thread is lagging behind.
114 lines
3.6 KiB
C++
114 lines
3.6 KiB
C++
// Copyright 2016 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <array>
|
|
#include <cstddef>
|
|
#include <memory>
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "VideoBackends/Vulkan/Constants.h"
|
|
#include "VideoCommon/RenderBase.h"
|
|
|
|
struct XFBSourceBase;
|
|
|
|
namespace Vulkan
|
|
{
|
|
class BoundingBox;
|
|
class FramebufferManager;
|
|
class SwapChain;
|
|
class StagingTexture2D;
|
|
class Texture2D;
|
|
class RasterFont;
|
|
class VKTexture;
|
|
|
|
class Renderer : public ::Renderer
|
|
{
|
|
public:
|
|
Renderer(std::unique_ptr<SwapChain> swap_chain);
|
|
~Renderer() override;
|
|
|
|
static Renderer* GetInstance();
|
|
|
|
std::unique_ptr<AbstractTexture> CreateTexture(const TextureConfig& config) override;
|
|
std::unique_ptr<AbstractStagingTexture>
|
|
CreateStagingTexture(StagingTextureType type, const TextureConfig& config) override;
|
|
|
|
SwapChain* GetSwapChain() const { return m_swap_chain.get(); }
|
|
BoundingBox* GetBoundingBox() const { return m_bounding_box.get(); }
|
|
bool Initialize();
|
|
|
|
void RenderText(const std::string& pstr, int left, int top, u32 color) override;
|
|
u32 AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data) override;
|
|
void PokeEFB(EFBAccessType type, const EfbPokeData* points, size_t num_points) override;
|
|
u16 BBoxRead(int index) override;
|
|
void BBoxWrite(int index, u16 value) override;
|
|
TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc) override;
|
|
|
|
void SwapImpl(AbstractTexture* texture, const EFBRectangle& rc, u64 ticks, float Gamma) override;
|
|
|
|
void ClearScreen(const EFBRectangle& rc, bool color_enable, bool alpha_enable, bool z_enable,
|
|
u32 color, u32 z) override;
|
|
|
|
void ReinterpretPixelData(unsigned int convtype) override;
|
|
|
|
void ApplyState() override;
|
|
|
|
void ResetAPIState() override;
|
|
void RestoreAPIState() override;
|
|
|
|
void SetBlendingState(const BlendingState& state) override;
|
|
void SetScissorRect(const MathUtil::Rectangle<int>& rc) override;
|
|
void SetRasterizationState(const RasterizationState& state) override;
|
|
void SetDepthState(const DepthState& state) override;
|
|
void SetTexture(u32 index, const AbstractTexture* texture) override;
|
|
void SetSamplerState(u32 index, const SamplerState& state) override;
|
|
void UnbindTexture(const AbstractTexture* texture) override;
|
|
void SetInterlacingMode() override;
|
|
void SetViewport(float x, float y, float width, float height, float near_depth,
|
|
float far_depth) override;
|
|
|
|
private:
|
|
bool CreateSemaphores();
|
|
void DestroySemaphores();
|
|
|
|
void BeginFrame();
|
|
|
|
void CheckForSurfaceChange();
|
|
void CheckForSurfaceResize();
|
|
void CheckForConfigChanges();
|
|
|
|
void ResetSamplerStates();
|
|
|
|
void OnSwapChainResized();
|
|
void BindEFBToStateTracker();
|
|
void RecreateEFBFramebuffer();
|
|
|
|
void RecompileShaders();
|
|
bool CompileShaders();
|
|
void DestroyShaders();
|
|
|
|
// Draw the frame, as well as the OSD to the swap chain.
|
|
void DrawScreen(VKTexture* xfb_texture, const EFBRectangle& xfb_region);
|
|
|
|
// Copies/scales an image to the currently-bound framebuffer.
|
|
void BlitScreen(VkRenderPass render_pass, const TargetRectangle& dst_rect,
|
|
const TargetRectangle& src_rect, const Texture2D* src_tex);
|
|
|
|
VkSemaphore m_image_available_semaphore = VK_NULL_HANDLE;
|
|
VkSemaphore m_rendering_finished_semaphore = VK_NULL_HANDLE;
|
|
|
|
std::unique_ptr<SwapChain> m_swap_chain;
|
|
std::unique_ptr<BoundingBox> m_bounding_box;
|
|
std::unique_ptr<RasterFont> m_raster_font;
|
|
|
|
// Keep a copy of sampler states to avoid cache lookups every draw
|
|
std::array<SamplerState, NUM_PIXEL_SHADER_SAMPLERS> m_sampler_states = {};
|
|
|
|
// Shaders used for clear/blit.
|
|
VkShaderModule m_clear_fragment_shader = VK_NULL_HANDLE;
|
|
};
|
|
}
|