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