xbmc
RPBaseRenderer.h
1 /*
2  * Copyright (C) 2017-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 "cores/GameSettings.h"
12 #include "cores/RetroPlayer/rendering/RenderSettings.h"
13 #include "utils/Geometry.h"
14 
15 extern "C"
16 {
17 #include <libavutil/pixfmt.h>
18 }
19 
20 #include <array>
21 #include <memory>
22 #include <stdint.h>
23 
24 namespace KODI
25 {
26 namespace SHADER
27 {
28 class IShaderPreset;
29 }
30 
31 namespace RETRO
32 {
33 class CRenderContext;
34 class IRenderBuffer;
35 class IRenderBufferPool;
36 
38 {
39 public:
40  CRPBaseRenderer(const CRenderSettings& renderSettings,
41  CRenderContext& context,
42  std::shared_ptr<IRenderBufferPool> bufferPool);
43  virtual ~CRPBaseRenderer();
44 
48  IRenderBufferPool* GetBufferPool() { return m_bufferPool.get(); }
49 
50  // Player functions
51  bool Configure(AVPixelFormat format);
52  void FrameMove();
56  void PreRender(bool clear);
57  void SetBuffer(IRenderBuffer* buffer);
58  void RenderFrame(bool clear, uint8_t alpha);
59 
60  // Feature support
61  virtual bool Supports(RENDERFEATURE feature) const = 0;
62  bool IsCompatible(const CRenderVideoSettings& settings) const;
63  virtual SCALINGMETHOD GetDefaultScalingMethod() const = 0;
64 
65  // Public renderer interface
66  virtual void Flush();
67 
68  // Get render settings
69  const CRenderSettings& GetRenderSettings() const { return m_renderSettings; }
70 
71  // Set render settings
72  void SetScalingMethod(SCALINGMETHOD method);
73  void SetStretchMode(STRETCHMODE stretchMode);
74  void SetRenderRotation(unsigned int rotationDegCCW);
75  void SetShaderPreset(const std::string& presetPath);
76  void SetPixels(const std::string& pixelPath);
77 
78  // Rendering properties
79  bool IsVisible() const;
80  IRenderBuffer* GetRenderBuffer() const;
81 
82 protected:
83  // Protected renderer interface
84  virtual bool ConfigureInternal() { return true; }
85  virtual void RenderInternal(bool clear, uint8_t alpha) = 0;
86  virtual void FlushInternal() {}
87 
88  // Construction parameters
89  CRenderContext& m_context;
90  std::shared_ptr<IRenderBufferPool> m_bufferPool;
91 
92  // Stream properties
93  bool m_bConfigured = false;
94  AVPixelFormat m_format = AV_PIX_FMT_NONE;
95 
96  // Rendering properties
97  CRenderSettings m_renderSettings;
98  IRenderBuffer* m_renderBuffer = nullptr;
99 
100  // Geometry properties
101  CRect m_sourceRect;
102  std::array<CPoint, 4> m_rotatedDestCoords{};
103 
104  // Video shaders
105  void Updateshaders();
106  std::unique_ptr<SHADER::IShaderPreset> m_shaderPreset;
107 
108  bool m_shadersNeedUpdate;
109  bool m_bUseShaderPreset;
110 
111 private:
115  virtual void ManageRenderArea(const IRenderBuffer& renderBuffer);
116 
120  void PostRender();
121 
122  void MarkDirty();
123 
124  // Utility functions
125  void GetScreenDimensions(float& screenWidth, float& screenHeight, float& screenPixelRatio);
126 
127  uint64_t m_renderFrameCount = 0;
128  uint64_t m_lastRender = 0;
129 };
130 } // namespace RETRO
131 } // namespace KODI
Definition: IRenderBuffer.h:27
Definition: AudioDecoder.h:18
Definition: IRenderBufferPool.h:30
STRETCHMODE
Methods for stretching the game to the viewing area.
Definition: GameSettings.h:29
Definition: RenderContext.h:43
Definition: settings.py:1
Video settings provided by the rendering system.
Definition: RenderVideoSettings.h:22
IRenderBufferPool * GetBufferPool()
Get the buffer pool used by this renderer.
Definition: RPBaseRenderer.h:48
Definition: RPBaseRenderer.h:37
Definition: RenderSettings.h:17