summaryrefslogtreecommitdiffstats
path: root/xbmc/rendering/gles/RenderSystemGLES.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/rendering/gles/RenderSystemGLES.h')
-rw-r--r--xbmc/rendering/gles/RenderSystemGLES.h143
1 files changed, 143 insertions, 0 deletions
diff --git a/xbmc/rendering/gles/RenderSystemGLES.h b/xbmc/rendering/gles/RenderSystemGLES.h
new file mode 100644
index 0000000..e0cd72b
--- /dev/null
+++ b/xbmc/rendering/gles/RenderSystemGLES.h
@@ -0,0 +1,143 @@
+/*
+ * 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 "GLESShader.h"
+#include "rendering/RenderSystem.h"
+#include "utils/ColorUtils.h"
+#include "utils/Map.h"
+
+#include <map>
+
+#include <fmt/format.h>
+
+#include "system_gl.h"
+
+enum class ShaderMethodGLES
+{
+ SM_DEFAULT,
+ SM_TEXTURE,
+ SM_MULTI,
+ SM_FONTS,
+ SM_TEXTURE_NOBLEND,
+ SM_MULTI_BLENDCOLOR,
+ SM_TEXTURE_RGBA,
+ SM_TEXTURE_RGBA_OES,
+ SM_TEXTURE_RGBA_BLENDCOLOR,
+ SM_TEXTURE_RGBA_BOB,
+ SM_TEXTURE_RGBA_BOB_OES,
+ SM_TEXTURE_NOALPHA,
+ SM_MAX
+};
+
+template<>
+struct fmt::formatter<ShaderMethodGLES> : fmt::formatter<std::string_view>
+{
+ template<typename FormatContext>
+ constexpr auto format(const ShaderMethodGLES& shaderMethod, FormatContext& ctx)
+ {
+ const auto it = ShaderMethodGLESMap.find(shaderMethod);
+ if (it == ShaderMethodGLESMap.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 ShaderMethodGLESMap = make_map<ShaderMethodGLES, std::string_view>({
+ {ShaderMethodGLES::SM_DEFAULT, "default"},
+ {ShaderMethodGLES::SM_TEXTURE, "texture"},
+ {ShaderMethodGLES::SM_MULTI, "multi"},
+ {ShaderMethodGLES::SM_FONTS, "fonts"},
+ {ShaderMethodGLES::SM_TEXTURE_NOBLEND, "texture no blending"},
+ {ShaderMethodGLES::SM_MULTI_BLENDCOLOR, "multi blend colour"},
+ {ShaderMethodGLES::SM_TEXTURE_RGBA, "texure rgba"},
+ {ShaderMethodGLES::SM_TEXTURE_RGBA_OES, "texture rgba OES"},
+ {ShaderMethodGLES::SM_TEXTURE_RGBA_BLENDCOLOR, "texture rgba blend colour"},
+ {ShaderMethodGLES::SM_TEXTURE_RGBA_BOB, "texture rgba bob"},
+ {ShaderMethodGLES::SM_TEXTURE_RGBA_BOB_OES, "texture rgba bob OES"},
+ {ShaderMethodGLES::SM_TEXTURE_NOALPHA, "texture no alpha"},
+ });
+
+ static_assert(static_cast<size_t>(ShaderMethodGLES::SM_MAX) == ShaderMethodGLESMap.size(),
+ "ShaderMethodGLESMap doesn't match the size of ShaderMethodGLES, did you forget to "
+ "add/remove a mapping?");
+};
+
+class CRenderSystemGLES : public CRenderSystemBase
+{
+public:
+ CRenderSystemGLES();
+ ~CRenderSystemGLES() override = default;
+
+ 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;
+
+ bool SupportsStereo(RENDER_STEREO_MODE mode) const override;
+
+ void Project(float &x, float &y, float &z) override;
+
+ std::string GetShaderPath(const std::string &filename) override { return "GLES/2.0/"; }
+
+ void InitialiseShaders();
+ void ReleaseShaders();
+ void EnableGUIShader(ShaderMethodGLES method);
+ void DisableGUIShader();
+
+ GLint GUIShaderGetPos();
+ GLint GUIShaderGetCol();
+ GLint GUIShaderGetCoord0();
+ GLint GUIShaderGetCoord1();
+ GLint GUIShaderGetUniCol();
+ GLint GUIShaderGetCoord0Matrix();
+ GLint GUIShaderGetField();
+ GLint GUIShaderGetStep();
+ GLint GUIShaderGetContrast();
+ GLint GUIShaderGetBrightness();
+ GLint GUIShaderGetModel();
+
+protected:
+ virtual void SetVSyncImpl(bool enable) = 0;
+ virtual void PresentRenderImpl(bool rendered) = 0;
+ void CalculateMaxTexturesize();
+
+ bool m_bVsyncInit{false};
+ int m_width;
+ int m_height;
+
+ std::string m_RenderExtensions;
+
+ std::map<ShaderMethodGLES, std::unique_ptr<CGLESShader>> m_pShader;
+ ShaderMethodGLES m_method = ShaderMethodGLES::SM_DEFAULT;
+
+ GLint m_viewPort[4];
+};