xbmc
RPWinRenderer.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 "RPBaseRenderer.h"
12 #include "cores/RetroPlayer/buffers/BaseRenderBufferPool.h"
13 #include "cores/RetroPlayer/buffers/video/RenderBufferSysMem.h"
14 #include "cores/RetroPlayer/process/RPProcessInfo.h"
15 #include "cores/RetroPlayer/shaders/windows/RPWinOutputShader.h"
16 #include "cores/RetroPlayer/shaders/windows/ShaderTextureDX.h"
17 
18 #include <map>
19 #include <memory>
20 #include <stdint.h>
21 #include <vector>
22 
23 #include <dxgi.h>
24 
25 class CD3DTexture;
26 struct SwsContext;
27 
28 namespace KODI
29 {
30 namespace RETRO
31 {
32 class CRenderContext;
33 class CRPWinOutputShader;
34 
36 {
37 public:
38  virtual ~CWinRendererFactory() = default;
39 
40  // implementation of IRendererFactory
41  std::string RenderSystemName() const override;
43  CRenderContext& context,
44  std::shared_ptr<IRenderBufferPool> bufferPool) override;
45  RenderBufferPoolVector CreateBufferPools(CRenderContext& context) override;
46 };
47 
49 {
50 public:
51  CWinRenderBuffer(AVPixelFormat pixFormat, DXGI_FORMAT dxFormat);
52  ~CWinRenderBuffer() override;
53 
54  // implementation of IRenderBuffer via CRenderBufferSysMem
55  bool UploadTexture() override;
56 
57  SHADER::CShaderTextureCD3D* GetTarget() { return m_intermediateTarget.get(); }
58 
59 private:
60  bool CreateTexture();
61  bool GetTexture(uint8_t*& data, unsigned int& stride);
62  bool ReleaseTexture();
63 
64  bool CreateScalingContext();
65  void ScalePixels(const uint8_t* source,
66  unsigned int sourceStride,
67  uint8_t* target,
68  unsigned int targetStride);
69 
70  static AVPixelFormat GetPixFormat();
71 
72  // Construction parameters
73  const AVPixelFormat m_pixFormat;
74  const DXGI_FORMAT m_targetDxFormat;
75 
76  AVPixelFormat m_targetPixFormat;
77  std::unique_ptr<SHADER::CShaderTextureCD3D> m_intermediateTarget;
78 
79  SwsContext* m_swsContext = nullptr;
80 };
81 
83 {
84 public:
86  ~CWinRenderBufferPool() override = default;
87 
88  // implementation of IRenderBufferPool via CRenderBufferPoolSysMem
89  bool IsCompatible(const CRenderVideoSettings& renderSettings) const override;
90 
91  // implementation of CBaseRenderBufferPool via CRenderBufferPoolSysMem
92  IRenderBuffer* CreateRenderBuffer(void* header = nullptr) override;
93 
94  // DirectX interface
95  bool ConfigureDX();
96  SHADER::CRPWinOutputShader* GetShader(SCALINGMETHOD scalingMethod) const;
97 
98 private:
99  static const std::vector<SCALINGMETHOD>& GetScalingMethods();
100 
101  void CompileOutputShaders();
102 
103  DXGI_FORMAT m_targetDxFormat = DXGI_FORMAT_UNKNOWN;
104  std::map<SCALINGMETHOD, std::unique_ptr<SHADER::CRPWinOutputShader>> m_outputShaders;
105 };
106 
108 {
109 public:
110  CRPWinRenderer(const CRenderSettings& renderSettings,
111  CRenderContext& context,
112  std::shared_ptr<IRenderBufferPool> bufferPool);
113  ~CRPWinRenderer() override = default;
114 
115  // implementation of CRPBaseRenderer
116  bool Supports(RENDERFEATURE feature) const override;
117  SCALINGMETHOD GetDefaultScalingMethod() const override { return DEFAULT_SCALING_METHOD; }
118 
119  static bool SupportsScalingMethod(SCALINGMETHOD method);
120 
124  static const SCALINGMETHOD DEFAULT_SCALING_METHOD = SCALINGMETHOD::NEAREST;
125 
126 protected:
127  // implementation of CRPBaseRenderer
128  bool ConfigureInternal() override;
129  void RenderInternal(bool clear, uint8_t alpha) override;
130 
131 private:
132  void Render(CD3DTexture& target);
133 
134  SHADER::CShaderTextureCD3D m_targetTexture;
135 };
136 } // namespace RETRO
137 } // namespace KODI
Definition: D3DResource.h:92
Definition: BaseRenderBufferPool.h:22
Definition: RPWinRenderer.h:107
Definition: ShaderTextureDX.h:24
Definition: RPWinRenderer.h:35
RenderBufferPoolVector CreateBufferPools(CRenderContext &context) override
Create buffer pools to manager buffers.
Definition: RPWinRenderer.cpp:45
Definition: IRenderBuffer.h:27
std::string RenderSystemName() const override
Get a description name of the rendering system.
Definition: RPWinRenderer.cpp:33
Definition: RenderBufferSysMem.h:25
Definition: AudioDecoder.h:18
Rendering factory.
Definition: RPProcessInfo.h:46
Definition: RenderContext.h:43
Definition: settings.py:1
Definition: RPWinRenderer.h:82
Video settings provided by the rendering system.
Definition: RenderVideoSettings.h:22
Definition: RPWinRenderer.h:48
CRPBaseRenderer * CreateRenderer(const CRenderSettings &settings, CRenderContext &context, std::shared_ptr< IRenderBufferPool > bufferPool) override
Create a renderer.
Definition: RPWinRenderer.cpp:38
Definition: RPBaseRenderer.h:37
Definition: RenderSettings.h:17
Definition: RPWinOutputShader.h:19