1 /*
2  *  Copyright (C) 2007-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 <vector>
12 
13 #include "system_gl.h"
14 
15 #include "FrameBufferObject.h"
16 #include "guilib/Shader.h"
17 #include "cores/VideoSettings.h"
18 #include "RenderFlags.h"
19 #include "RenderInfo.h"
20 #include "windowing/GraphicContext.h"
21 #include "BaseRenderer.h"
22 #include "ColorManager.h"
23 #include "threads/Event.h"
24 #include "VideoShaders/ShaderFormats.h"
25 #include "utils/Geometry.h"
26 
27 extern "C" {
28 #include <libavutil/mastering_display_metadata.h>
29 }
30 
31 class CRenderCapture;
32 class CRenderSystemGL;
33 
34 class CTexture;
35 namespace Shaders { class BaseYUV2RGBGLSLShader; }
36 namespace Shaders { class BaseVideoFilterShader; }
37 
38 struct DRAWRECT
39 {
40   float left;
41   float top;
42   float right;
43   float bottom;
44 };
45 
46 enum RenderMethod
47 {
48   RENDER_GLSL=0x01,
49   RENDER_CUSTOM=0x02
50 };
51 
52 enum RenderQuality
53 {
54   RQ_LOW=1,
55   RQ_SINGLEPASS,
56   RQ_MULTIPASS,
57 };
58 
59 #define PLANE_Y 0
60 #define PLANE_U 1
61 #define PLANE_V 2
62 
63 #define FIELD_FULL 0
64 #define FIELD_TOP 1
65 #define FIELD_BOT 2
66 
67 class CLinuxRendererGL : public CBaseRenderer
68 {
69 public:
70   CLinuxRendererGL();
71   ~CLinuxRendererGL() override;
72 
73   static CBaseRenderer* Create(CVideoBuffer *buffer);
74   static bool Register();
75 
76   // Player functions
77   bool Configure(const VideoPicture &picture, float fps, unsigned int orientation) override;
IsConfigured()78   bool IsConfigured() override { return m_bConfigured; }
79   void AddVideoPicture(const VideoPicture &picture, int index) override;
80   void UnInit() override;
81   bool Flush(bool saveBuffers) override;
SetBufferSize(int numBuffers)82   void SetBufferSize(int numBuffers) override { m_NumYV12Buffers = numBuffers; }
83   void ReleaseBuffer(int idx) override;
84   void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override;
85   void Update() override;
86   bool RenderCapture(CRenderCapture* capture) override;
87   CRenderInfo GetRenderInfo() override;
88   bool ConfigChanged(const VideoPicture &picture) override;
89 
90   // Feature support
91   bool SupportsMultiPassRendering() override;
92   bool Supports(ERENDERFEATURE feature) override;
93   bool Supports(ESCALINGMETHOD method) override;
94 
95 protected:
96 
97   bool Render(unsigned int flags, int renderBuffer);
98   void ClearBackBuffer();
99   void DrawBlackBars();
100 
101   bool ValidateRenderer();
102   virtual bool ValidateRenderTarget();
103   virtual void LoadShaders(int field=FIELD_FULL);
104   void SetTextureFilter(GLenum method);
105   void UpdateVideoFilter();
106   void CheckVideoParameters(int index);
107   AVColorPrimaries GetSrcPrimaries(AVColorPrimaries srcPrimaries, unsigned int width, unsigned int height);
108 
109   // textures
110   virtual bool UploadTexture(int index);
111   virtual void DeleteTexture(int index);
112   virtual bool CreateTexture(int index);
113 
114   bool UploadYV12Texture(int index);
115   void DeleteYV12Texture(int index);
116   bool CreateYV12Texture(int index);
117 
118   bool UploadNV12Texture(int index);
119   void DeleteNV12Texture(int index);
120   bool CreateNV12Texture(int index);
121 
122   bool UploadYUV422PackedTexture(int index);
123   void DeleteYUV422PackedTexture(int index);
124   bool CreateYUV422PackedTexture(int index);
125 
126   void CalculateTextureSourceRects(int source, int num_planes);
127 
128   // renderers
129   void RenderToFBO(int renderBuffer, int field, bool weave = false);
130   void RenderFromFBO();
131   void RenderSinglePass(int renderBuffer, int field); // single pass glsl renderer
132   void RenderRGB(int renderBuffer, int field);      // render using vdpau/vaapi hardware
133   void RenderProgressiveWeave(int renderBuffer, int field); // render using vdpau hardware
134 
135   struct CYuvPlane;
136   struct CPictureBuffer;
137 
138   void BindPbo(CPictureBuffer& buff);
139   void UnBindPbo(CPictureBuffer& buff);
140   void LoadPlane(CYuvPlane& plane, int type,
141                  unsigned width,  unsigned height,
142                  int stride, int bpp, void* data);
143   void GetPlaneTextureSize(CYuvPlane& plane);
144   GLint GetInternalFormat(GLint format, int bpp);
145 
146   // hooks for HwDec Renderer
LoadShadersHook()147   virtual bool LoadShadersHook() { return false; };
RenderHook(int idx)148   virtual bool RenderHook(int idx) { return false; };
AfterRenderHook(int idx)149   virtual void AfterRenderHook(int idx) {};
CanSaveBuffers()150   virtual bool CanSaveBuffers() { return true; };
151 
152   struct
153   {
154     CFrameBufferObject fbo;
155     float width, height;
156   } m_fbo;
157 
158   int m_iYV12RenderBuffer = 0;
159   int m_NumYV12Buffers = 0;
160 
161   bool m_bConfigured = false;
162   bool m_bValidated = false;
163   GLenum m_textureTarget;
164   int m_renderMethod = RENDER_GLSL;
165   RenderQuality m_renderQuality = RQ_SINGLEPASS;
166   CRenderSystemGL *m_renderSystem = nullptr;
167 
168   // Raw data used by renderer
169   int m_currentField = FIELD_FULL;
170   int m_reloadShaders = 0;
171 
172   struct CYuvPlane
173   {
174     GLuint id;
175     GLuint pbo;
176     CRect rect;
177     float width;
178     float height;
179     unsigned texwidth;
180     unsigned texheight;
181     //pixels per texel
182     unsigned pixpertex_x;
183     unsigned pixpertex_y;
184   };
185 
186   struct CPictureBuffer
187   {
188     CPictureBuffer();
189     ~CPictureBuffer() = default;
190 
191     CYuvPlane fields[MAX_FIELDS][YuvImage::MAX_PLANES];
192     YuvImage image;
193     GLuint pbo[3]; // one pbo for 3 planes
194 
195     CVideoBuffer *videoBuffer;
196     bool loaded;
197 
198     AVColorPrimaries m_srcPrimaries;
199     AVColorSpace m_srcColSpace;
200     int m_srcBits = 8;
201     int m_srcTextureBits = 8;
202     bool m_srcFullRange;
203 
204     bool hasDisplayMetadata = false;
205     AVMasteringDisplayMetadata displayMetadata;
206     bool hasLightMetadata = false;
207     AVContentLightMetadata lightMetadata;
208   };
209 
210   // YV12 decoder textures
211   // field index 0 is full image, 1 is odd scanlines, 2 is even scanlines
212   CPictureBuffer m_buffers[NUM_BUFFERS];
213 
214   Shaders::BaseYUV2RGBGLSLShader *m_pYUVShader = nullptr;
215   Shaders::BaseVideoFilterShader *m_pVideoFilterShader = nullptr;
216   ESCALINGMETHOD m_scalingMethod = VS_SCALINGMETHOD_LINEAR;
217   ESCALINGMETHOD m_scalingMethodGui = VS_SCALINGMETHOD_MAX;
218   bool m_useDithering;
219   unsigned int m_ditherDepth;
220   bool m_fullRange;
221   AVColorPrimaries m_srcPrimaries;
222   bool m_toneMap = false;
223   int m_toneMapMethod = 0;
224   float m_clearColour = 0.0f;
225   bool m_pboSupported = true;
226   bool m_pboUsed = false;
227   bool m_nonLinStretch = false;
228   bool m_nonLinStretchGui = false;
229   float m_pixelRatio = 0.0f;
230   CRect m_viewRect;
231 
232   // color management
233   std::unique_ptr<CColorManager> m_ColorManager;
234   GLuint m_tCLUTTex;
235   uint16_t *m_CLUT;
236   int m_CLUTsize;
237   int m_cmsToken;
238   bool m_cmsOn;
239 
240   bool LoadCLUT();
241   void DeleteCLUT();
242 };
243