xbmc
RendererBase.h
1 /*
2  * Copyright (C) 2017-2019 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 #pragma once
9 
10 #include "VideoRenderers/ColorManager.h"
11 #include "VideoRenderers/DebugInfo.h"
12 #include "VideoRenderers/RenderInfo.h"
13 #include "VideoRenderers/VideoShaders/WinVideoFilter.h"
14 #include "cores/VideoSettings.h"
15 #include "guilib/D3DResource.h"
16 
17 #include <vector>
18 
19 #include <d3d11_4.h>
20 #include <dxgi1_5.h>
21 extern "C" {
22 #include <libavutil/mastering_display_metadata.h>
23 #include <libavutil/pixdesc.h>
24 }
25 
26 struct VideoPicture;
27 class CVideoBuffer;
28 
29 namespace win
30 {
31  namespace helpers
32  {
33  template<typename T>
34  bool contains(std::vector<T> vector, T item)
35  {
36  return find(vector.begin(), vector.end(), item) != vector.end();
37  }
38  }
39 }
40 
41 enum RenderMethod
42 {
43  RENDER_INVALID = 0,
44  RENDER_DXVA = 1,
45  RENDER_PS = 2,
46  RENDER_SW = 3
47 };
48 
49 enum class HDR_TYPE
50 {
51  HDR_NONE_SDR = 0,
52  HDR_HDR10 = 1,
53  HDR_HLG = 2
54 };
55 
57 {
58 public:
59  virtual ~CRenderBuffer() = default;
60 
61  unsigned GetWidth() const { return m_widthTex; }
62  unsigned GetHeight() const { return m_heightTex; }
63  bool IsLoaded() { return m_bLoaded; }
64 
65  virtual void AppendPicture(const VideoPicture& picture);
66  virtual void ReleasePicture();
67  virtual bool UploadBuffer() { return false; }
68  virtual HRESULT GetResource(ID3D11Resource** ppResource, unsigned* index) const;
69 
70  // implementation specified
71  virtual bool GetDataPlanes(uint8_t*(&planes)[3], int(&strides)[3]) { return false; }
72  virtual unsigned GetViewCount() const { return 0; }
73  virtual ID3D11View* GetView(unsigned viewIdx) { return nullptr; }
74 
75  AVPixelFormat av_format;
76  CVideoBuffer* videoBuffer = nullptr;
77  unsigned int pictureFlags = 0;
78  AVColorPrimaries primaries = AVCOL_PRI_BT709;
79  AVColorSpace color_space = AVCOL_SPC_BT709;
80  AVColorTransferCharacteristic color_transfer = AVCOL_TRC_BT709;
81  bool full_range = false;
82  int bits = 8;
83  uint8_t texBits = 8;
84  AVPixelFormat pixelFormat = AV_PIX_FMT_NONE; // source pixel format
85  bool hasDisplayMetadata = false;
86  bool hasLightMetadata = false;
87  AVMasteringDisplayMetadata displayMetadata = {};
88  AVContentLightMetadata lightMetadata = {};
89  std::string stereoMode;
90  uint64_t frameIdx = 0;
91 
92 protected:
93  CRenderBuffer(AVPixelFormat av_pix_format, unsigned width, unsigned height);
94  void QueueCopyFromGPU();
95 
96  // video buffer size
97  unsigned int m_width;
98  unsigned int m_height;
99  // real texture size
100  unsigned int m_widthTex;
101  unsigned int m_heightTex;
102  // copy from GPU mem
103  Microsoft::WRL::ComPtr<ID3D11Texture2D> m_staging;
104  D3D11_TEXTURE2D_DESC m_sDesc{};
105  bool m_bPending = false;
106  bool m_bLoaded = false;
107 };
108 
110 {
111 public:
112  virtual ~CRendererBase();
113 
114  virtual CRenderInfo GetRenderInfo();
115  virtual bool Configure(const VideoPicture &picture, float fps, unsigned int orientation);
116  virtual bool Supports(ESCALINGMETHOD method) const = 0;
117  virtual bool WantsDoublePass() { return false; }
118  virtual bool NeedBuffer(int idx) { return false; }
119 
120  void AddVideoPicture(const VideoPicture &picture, int index);
121  void Render(int index, int index2, CD3DTexture& target, const CRect& sourceRect,
122  const CRect& destRect, const CRect& viewRect, unsigned flags);
123  void Render(CD3DTexture& target, const CRect& sourceRect, const CRect& destRect,
124  const CRect& viewRect, unsigned flags = 0);
125 
126  void ManageTextures();
127  int NextBuffer() const;
128  void ReleaseBuffer(int idx);
129  bool Flush(bool saveBuffers);
130  void SetBufferSize(int numBuffers) { m_iBuffersRequired = numBuffers; }
131 
132  DEBUG_INFO_VIDEO GetDebugInfo(int idx);
133 
134  static DXGI_FORMAT GetDXGIFormat(const VideoPicture &picture);
135  static DXGI_FORMAT GetDXGIFormat(CVideoBuffer* videoBuffer);
136  static AVPixelFormat GetAVFormat(DXGI_FORMAT dxgi_format);
137  static DXGI_HDR_METADATA_HDR10 GetDXGIHDR10MetaData(CRenderBuffer* rb);
138 
139 protected:
140  explicit CRendererBase(CVideoSettings& videoSettings);
141 
142  bool CreateIntermediateTarget(unsigned int width, unsigned int height, bool dynamic = false);
143  void OnCMSConfigChanged(AVColorPrimaries srcPrimaries);
144  void ReorderDrawPoints(const CRect& destRect, CPoint(&rotatedPoints)[4]) const;
145  bool CreateRenderBuffer(int index);
146  void DeleteRenderBuffer(int index);
147 
148  void ProcessHDR(CRenderBuffer* rb);
149 
150  virtual void RenderImpl(CD3DTexture& target, CRect& sourceRect, CPoint (&destPoints)[4], uint32_t flags) = 0;
151  virtual void FinalOutput(CD3DTexture& source, CD3DTexture& target, const CRect& sourceRect, const CPoint(&destPoints)[4]);
152 
153  virtual CRenderBuffer* CreateBuffer() = 0;
154  virtual void UpdateVideoFilters();
155  virtual void CheckVideoParameters();
156  virtual void OnViewSizeChanged() {}
157  virtual void OnOutputReset() {}
158 
159  bool m_toneMapping = false;
160  bool m_useDithering = false;
161  bool m_cmsOn = false;
162  bool m_lutIsLoading = false;
163  bool m_useHLGtoPQ = false;
164  ETONEMAPMETHOD m_toneMapMethod = VS_TONEMAPMETHOD_OFF;
165 
166  int m_iBufferIndex = 0;
167  int m_iNumBuffers = 0;
168  int m_iBuffersRequired = 0;
169  int m_ditherDepth = 0;
170  int m_cmsToken = -1;
171  int m_lutSize = 0;
172  unsigned m_sourceWidth = 0;
173  unsigned m_sourceHeight = 0;
174  unsigned m_viewWidth = 0;
175  unsigned m_viewHeight = 0;
176  unsigned m_renderOrientation = 0;
177  float m_fps = 0.0f;
178  uint64_t m_frameIdx = 0;
179 
180  AVPixelFormat m_format = AV_PIX_FMT_NONE;
181  CD3DTexture m_IntermediateTarget;
182  std::shared_ptr<COutputShader> m_outputShader;
183  std::unique_ptr<CColorManager> m_colorManager;
184  Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_pLUTView;
185  CVideoSettings& m_videoSettings;
186  std::map<int, CRenderBuffer*> m_renderBuffers;
187 
188  DXGI_HDR_METADATA_HDR10 m_lastHdr10 = {};
189  HDR_TYPE m_HdrType = HDR_TYPE::HDR_NONE_SDR;
190  bool m_AutoSwitchHDR = false;
191 };
Definition: D3DResource.h:90
Definition: VideoBuffer.h:85
Definition: RendererBase.h:56
Definition: RenderInfo.h:19
Definition: DebugInfo.h:21
Definition: CharsetConverter.cpp:16
Definition: DVDVideoCodec.h:36
Definition: VideoSettings.h:194
Definition: RendererBase.h:109