kodi
GUIShaderDX.h
1 /*
2  * Copyright (C) 2005-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 "D3DResource.h"
12 #include "Texture.h"
13 #include "utils/Geometry.h"
14 #include "utils/MemUtils.h"
15 
16 #include <DirectXMath.h>
17 #include <wrl/client.h>
18 
19 struct Vertex {
20  Vertex() {}
21 
22  Vertex(DirectX::XMFLOAT3 p, DirectX::XMFLOAT4 c)
23  : pos(p), color(c) {}
24 
25  Vertex(DirectX::XMFLOAT3 p, DirectX::XMFLOAT4 c, DirectX::XMFLOAT2 t1, DirectX::XMFLOAT2 t2)
26  : pos(p), color(c), texCoord(t1), texCoord2(t2) {}
27 
28  DirectX::XMFLOAT3 pos;
29  DirectX::XMFLOAT4 color;
30  DirectX::XMFLOAT2 texCoord;
31  DirectX::XMFLOAT2 texCoord2;
32 };
33 
34 class ID3DResource;
35 
37 {
38 public:
39  CGUIShaderDX();
40  ~CGUIShaderDX();
41 
42  bool Initialize();
43  void Begin(unsigned int flags);
44  void End(void);
45  void ApplyStateBlock(void);
46  void RestoreBuffers(void);
47 
48  void SetShaderViews(unsigned int numViews, ID3D11ShaderResourceView** views);
49  void SetViewPort(D3D11_VIEWPORT viewPort);
50 
51  void XM_CALLCONV GetWVP(DirectX::XMMATRIX &w, DirectX::XMMATRIX &v, DirectX::XMMATRIX &p)
52  {
53  w = m_cbWorldViewProj.world;
54  v = m_cbWorldViewProj.view;
55  p = m_cbWorldViewProj.projection;
56  }
57  DirectX::XMMATRIX XM_CALLCONV GetWorld() const { return m_cbWorldViewProj.world; }
58  DirectX::XMMATRIX XM_CALLCONV GetView() const { return m_cbWorldViewProj.view; }
59  DirectX::XMMATRIX XM_CALLCONV GetProjection() const { return m_cbWorldViewProj.projection; }
60  void XM_CALLCONV SetWVP(const DirectX::XMMATRIX &w, const DirectX::XMMATRIX &v, const DirectX::XMMATRIX &p);
61  void XM_CALLCONV SetWorld(const DirectX::XMMATRIX &value);
62  void XM_CALLCONV SetView(const DirectX::XMMATRIX &value);
63  void XM_CALLCONV SetProjection(const DirectX::XMMATRIX &value);
64  void Project(float &x, float &y, float &z);
65 
66  void DrawQuad(Vertex& v1, Vertex& v2, Vertex& v3, Vertex& v4);
67  void DrawIndexed(unsigned int indexCount, unsigned int startIndex, unsigned int startVertex);
68  void Draw(unsigned int vertexCount, unsigned int startVertex);
69 
70  bool HardwareClipIsPossible(void) const { return m_clipPossible; }
71  float GetClipXFactor(void) const { return m_clipXFactor; }
72  float GetClipXOffset(void) const { return m_clipXOffset; }
73  float GetClipYFactor(void) const { return m_clipYFactor; }
74  float GetClipYOffset(void) const { return m_clipYOffset; }
75 
76  // need to use aligned allocation because we use XMMATRIX in structures.
77  void* operator new (size_t size)
78  {
79  void* ptr = KODI::MEMORY::AlignedMalloc(size, __alignof(CGUIShaderDX));
80  if (!ptr)
81  throw std::bad_alloc();
82  return ptr;
83  }
84  // free aligned memory.
85  void operator delete (void* ptr)
86  {
87  KODI::MEMORY::AlignedFree(ptr);
88  }
89 
90 private:
91  struct cbWorldViewProj
92  {
93  DirectX::XMMATRIX world;
94  DirectX::XMMATRIX view;
95  DirectX::XMMATRIX projection;
96  };
97  struct cbViewPort
98  {
99  float TopLeftX;
100  float TopLeftY;
101  float Width;
102  float Height;
103  };
104  struct cbWorld
105  {
106  DirectX::XMMATRIX wvp;
107  float blackLevel;
108  float colorRange;
109  float sdrPeakLum;
110  int PQ;
111  };
112 
113  void Release(void);
114  bool CreateBuffers(void);
115  bool CreateSamplers(void);
116  void ApplyChanges(void);
117  void ClipToScissorParams(void);
118 
119  // GUI constants
120  cbViewPort m_cbViewPort = {};
121  cbWorldViewProj m_cbWorldViewProj = {};
122 
123  bool m_bCreated;
124  size_t m_currentShader;
125  CD3DVertexShader m_vertexShader;
126  CD3DPixelShader m_pixelShader[SHADER_METHOD_RENDER_COUNT];
127  Microsoft::WRL::ComPtr<ID3D11SamplerState> m_pSampLinear;
128 
129  // GUI buffers
130  bool m_bIsWVPDirty;
131  bool m_bIsVPDirty;
132  Microsoft::WRL::ComPtr<ID3D11Buffer> m_pWVPBuffer;
133  Microsoft::WRL::ComPtr<ID3D11Buffer> m_pVPBuffer;
134  Microsoft::WRL::ComPtr<ID3D11Buffer> m_pVertexBuffer;
135 
136  // clip to scissors params
137  bool m_clipPossible;
138  float m_clipXFactor;
139  float m_clipXOffset;
140  float m_clipYFactor;
141  float m_clipYOffset;
142 };
Definition: D3DResource.h:270
Definition: LibInputPointer.h:13
Definition: GUIShaderDX.h:19
Definition: GUIShaderDX.h:36
Definition: D3DResource.h:36
Definition: D3DResource.h:242