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