#pragma once #include #include #include #include "imconfig.h" namespace Fast { struct ShaderProgram; struct GfxClipParameters { bool z_is_from_0_to_1; bool invertY; }; enum FilteringMode { FILTER_THREE_POINT, FILTER_LINEAR, FILTER_NONE }; // A hash function used to hash a: pair struct hash_pair_ff { size_t operator()(const std::pair& p) const { const auto hash1 = std::hash{}(p.first); const auto hash2 = std::hash{}(p.second); // If hash1 == hash2, their XOR is zero. return (hash1 != hash2) ? hash1 ^ hash2 : hash1; } }; class GfxRenderingAPI { public: virtual ~GfxRenderingAPI() = default; virtual const char* GetName() = 0; virtual int GetMaxTextureSize() = 0; virtual GfxClipParameters GetClipParameters() = 0; virtual void UnloadShader(ShaderProgram* oldPrg) = 0; virtual void LoadShader(ShaderProgram* newPrg) = 0; virtual ShaderProgram* CreateAndLoadNewShader(uint64_t shaderId0, uint32_t shaderId1) = 0; virtual ShaderProgram* LookupShader(uint64_t shaderId0, uint32_t shaderId1) = 0; virtual void ShaderGetInfo(ShaderProgram* prg, uint8_t* numInputs, bool usedTextures[2]) = 0; virtual uint32_t NewTexture() = 0; virtual void SelectTexture(int tile, uint32_t textureId) = 0; virtual void UploadTexture(const uint8_t* rgba32Buf, uint32_t width, uint32_t height) = 0; virtual void SetSamplerParameters(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt) = 0; virtual void SetDepthTestAndMask(bool depth_test, bool z_upd) = 0; virtual void SetZmodeDecal(bool decal) = 0; virtual void SetViewport(int x, int y, int width, int height) = 0; virtual void SetScissor(int x, int y, int width, int height) = 0; virtual void SetUseAlpha(bool useAlpha) = 0; virtual void DrawTriangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) = 0; virtual void Init() = 0; virtual void OnResize() = 0; virtual void StartFrame() = 0; virtual void EndFrame() = 0; virtual void FinishRender() = 0; virtual int CreateFramebuffer() = 0; virtual void UpdateFramebufferParameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invertY, bool render_target, bool has_depth_buffer, bool can_extract_depth) = 0; virtual void StartDrawToFramebuffer(int fbId, float noiseScale) = 0; virtual void CopyFramebuffer(int fbDstId, int fbSrcId, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1) = 0; virtual void ClearFramebuffer(bool color, bool depth) = 0; virtual void ReadFramebufferToCPU(int fbId, uint32_t width, uint32_t height, uint16_t* rgba16Buf) = 0; virtual void ResolveMSAAColorBuffer(int fbIdTarger, int fbIdSrc) = 0; virtual std::unordered_map, uint16_t, hash_pair_ff> GetPixelDepth(int fb_id, const std::set>& coordinates) = 0; virtual void* GetFramebufferTextureId(int fbId) = 0; virtual void SelectTextureFb(int fbId) = 0; virtual void DeleteTexture(uint32_t texId) = 0; virtual void SetTextureFilter(FilteringMode mode) = 0; virtual FilteringMode GetTextureFilter() = 0; virtual void SetSrgbMode() = 0; virtual ImTextureID GetTextureById(int id) = 0; protected: int8_t mCurrentDepthTest = 0; int8_t mCurrentDepthMask = 0; int8_t mCurrentZmodeDecal = 0; int8_t mLastDepthTest = -1; int8_t mLastDepthMask = -1; int8_t mLastZmodeDecal = -1; bool mSrgbMode = false; }; } // namespace Fast