1 /*
2  *  Copyright (C) 2005-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "GLESShader.h"
12 #include "rendering/RenderSystem.h"
13 #include "utils/Color.h"
14 
15 #include <array>
16 
17 #include "system_gl.h"
18 
19 enum ESHADERMETHOD
20 {
21   SM_DEFAULT,
22   SM_TEXTURE,
23   SM_MULTI,
24   SM_FONTS,
25   SM_TEXTURE_NOBLEND,
26   SM_MULTI_BLENDCOLOR,
27   SM_TEXTURE_RGBA,
28   SM_TEXTURE_RGBA_OES,
29   SM_TEXTURE_RGBA_BLENDCOLOR,
30   SM_TEXTURE_RGBA_BOB,
31   SM_TEXTURE_RGBA_BOB_OES,
32   SM_TEXTURE_NOALPHA,
33   SM_MAX
34 };
35 
36 class CRenderSystemGLES : public CRenderSystemBase
37 {
38 public:
39   CRenderSystemGLES();
40   ~CRenderSystemGLES() override = default;
41 
42   bool InitRenderSystem() override;
43   bool DestroyRenderSystem() override;
44   bool ResetRenderSystem(int width, int height) override;
45 
46   bool BeginRender() override;
47   bool EndRender() override;
48   void PresentRender(bool rendered, bool videoLayer) override;
49   bool ClearBuffers(UTILS::Color color) override;
50   bool IsExtSupported(const char* extension) const override;
51 
52   void SetVSync(bool vsync);
ResetVSync()53   void ResetVSync() { m_bVsyncInit = false; }
54 
55   void SetViewPort(const CRect& viewPort) override;
56   void GetViewPort(CRect& viewPort) override;
57 
58   bool ScissorsCanEffectClipping() override;
59   CRect ClipRectToScissorRect(const CRect &rect) override;
60   void SetScissors(const CRect& rect) override;
61   void ResetScissors() override;
62 
63   void CaptureStateBlock() override;
64   void ApplyStateBlock() override;
65 
66   void SetCameraPosition(const CPoint &camera, int screenWidth, int screenHeight, float stereoFactor = 0.0f) override;
67 
68   bool SupportsStereo(RENDER_STEREO_MODE mode) const override;
69 
70   void Project(float &x, float &y, float &z) override;
71 
GetShaderPath(const std::string & filename)72   std::string GetShaderPath(const std::string &filename) override { return "GLES/2.0/"; }
73 
74   void InitialiseShaders();
75   void ReleaseShaders();
76   void EnableGUIShader(ESHADERMETHOD method);
77   void DisableGUIShader();
78 
79   GLint GUIShaderGetPos();
80   GLint GUIShaderGetCol();
81   GLint GUIShaderGetCoord0();
82   GLint GUIShaderGetCoord1();
83   GLint GUIShaderGetUniCol();
84   GLint GUIShaderGetCoord0Matrix();
85   GLint GUIShaderGetField();
86   GLint GUIShaderGetStep();
87   GLint GUIShaderGetContrast();
88   GLint GUIShaderGetBrightness();
89   GLint GUIShaderGetModel();
90 
91 protected:
92   virtual void SetVSyncImpl(bool enable) = 0;
93   virtual void PresentRenderImpl(bool rendered) = 0;
94   void CalculateMaxTexturesize();
95 
96   bool m_bVsyncInit{false};
97   int m_width;
98   int m_height;
99 
100   std::string m_RenderExtensions;
101 
102   std::array<std::unique_ptr<CGLESShader>, SM_MAX> m_pShader;
103   ESHADERMETHOD m_method = SM_DEFAULT;
104 
105   GLint      m_viewPort[4];
106 };
107 
108