summaryrefslogtreecommitdiffstats
path: root/xbmc/rendering/gl/RenderSystemGL.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
commitc04dcc2e7d834218ef2d4194331e383402495ae1 (patch)
tree7333e38d10d75386e60f336b80c2443c1166031d /xbmc/rendering/gl/RenderSystemGL.h
parentInitial commit. (diff)
downloadkodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz
kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/rendering/gl/RenderSystemGL.h')
-rw-r--r--xbmc/rendering/gl/RenderSystemGL.h139
1 files changed, 139 insertions, 0 deletions
diff --git a/xbmc/rendering/gl/RenderSystemGL.h b/xbmc/rendering/gl/RenderSystemGL.h
new file mode 100644
index 0000000..191c97f
--- /dev/null
+++ b/xbmc/rendering/gl/RenderSystemGL.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "GLShader.h"
+#include "rendering/RenderSystem.h"
+#include "utils/ColorUtils.h"
+#include "utils/Map.h"
+
+#include <map>
+#include <memory>
+
+#include <fmt/format.h>
+
+#include "system_gl.h"
+
+enum class ShaderMethodGL
+{
+ SM_DEFAULT = 0,
+ SM_TEXTURE,
+ SM_TEXTURE_LIM,
+ SM_MULTI,
+ SM_FONTS,
+ SM_TEXTURE_NOBLEND,
+ SM_MULTI_BLENDCOLOR,
+ SM_MAX
+};
+
+template<>
+struct fmt::formatter<ShaderMethodGL> : fmt::formatter<std::string_view>
+{
+ template<typename FormatContext>
+ constexpr auto format(const ShaderMethodGL& shaderMethod, FormatContext& ctx)
+ {
+ const auto it = ShaderMethodGLMap.find(shaderMethod);
+ if (it == ShaderMethodGLMap.cend())
+ throw std::range_error("no string mapping found for shader method");
+
+ return fmt::formatter<string_view>::format(it->second, ctx);
+ }
+
+private:
+ static constexpr auto ShaderMethodGLMap = make_map<ShaderMethodGL, std::string_view>({
+ {ShaderMethodGL::SM_DEFAULT, "default"},
+ {ShaderMethodGL::SM_TEXTURE, "texture"},
+ {ShaderMethodGL::SM_TEXTURE_LIM, "texture limited"},
+ {ShaderMethodGL::SM_MULTI, "multi"},
+ {ShaderMethodGL::SM_FONTS, "fonts"},
+ {ShaderMethodGL::SM_TEXTURE_NOBLEND, "texture no blending"},
+ {ShaderMethodGL::SM_MULTI_BLENDCOLOR, "multi blend colour"},
+ });
+
+ static_assert(static_cast<size_t>(ShaderMethodGL::SM_MAX) == ShaderMethodGLMap.size(),
+ "ShaderMethodGLMap doesn't match the size of ShaderMethodGL, did you forget to "
+ "add/remove a mapping?");
+};
+
+class CRenderSystemGL : public CRenderSystemBase
+{
+public:
+ CRenderSystemGL();
+ ~CRenderSystemGL() override;
+ bool InitRenderSystem() override;
+ bool DestroyRenderSystem() override;
+ bool ResetRenderSystem(int width, int height) override;
+
+ bool BeginRender() override;
+ bool EndRender() override;
+ void PresentRender(bool rendered, bool videoLayer) override;
+ bool ClearBuffers(UTILS::COLOR::Color color) override;
+ bool IsExtSupported(const char* extension) const override;
+
+ void SetVSync(bool vsync);
+ void ResetVSync() { m_bVsyncInit = false; }
+
+ void SetViewPort(const CRect& viewPort) override;
+ void GetViewPort(CRect& viewPort) override;
+
+ bool ScissorsCanEffectClipping() override;
+ CRect ClipRectToScissorRect(const CRect &rect) override;
+ void SetScissors(const CRect &rect) override;
+ void ResetScissors() override;
+
+ void CaptureStateBlock() override;
+ void ApplyStateBlock() override;
+
+ void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor = 0.0f) override;
+
+ void SetStereoMode(RENDER_STEREO_MODE mode, RENDER_STEREO_VIEW view) override;
+ bool SupportsStereo(RENDER_STEREO_MODE mode) const override;
+ bool SupportsNPOT(bool dxt) const override;
+
+ void Project(float &x, float &y, float &z) override;
+
+ std::string GetShaderPath(const std::string &filename) override;
+
+ void GetGLVersion(int& major, int& minor);
+ void GetGLSLVersion(int& major, int& minor);
+
+ void ResetGLErrors();
+
+ // shaders
+ void EnableShader(ShaderMethodGL method);
+ void DisableShader();
+ GLint ShaderGetPos();
+ GLint ShaderGetCol();
+ GLint ShaderGetCoord0();
+ GLint ShaderGetCoord1();
+ GLint ShaderGetUniCol();
+ GLint ShaderGetModel();
+
+protected:
+ virtual void SetVSyncImpl(bool enable) = 0;
+ virtual void PresentRenderImpl(bool rendered) = 0;
+ void CalculateMaxTexturesize();
+ void InitialiseShaders();
+ void ReleaseShaders();
+
+ bool m_bVsyncInit = false;
+ int m_width;
+ int m_height;
+
+ std::string m_RenderExtensions;
+
+ int m_glslMajor = 0;
+ int m_glslMinor = 0;
+
+ GLint m_viewPort[4];
+
+ std::map<ShaderMethodGL, std::unique_ptr<CGLShader>> m_pShader;
+ ShaderMethodGL m_method = ShaderMethodGL::SM_DEFAULT;
+ GLuint m_vertexArray = GL_NONE;
+};