summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/GUIShaderDX.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/guilib/GUIShaderDX.h')
-rw-r--r--xbmc/guilib/GUIShaderDX.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/xbmc/guilib/GUIShaderDX.h b/xbmc/guilib/GUIShaderDX.h
new file mode 100644
index 0000000..7b6a170
--- /dev/null
+++ b/xbmc/guilib/GUIShaderDX.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "D3DResource.h"
+#include "Texture.h"
+#include "utils/Geometry.h"
+#include "utils/MemUtils.h"
+
+#include <DirectXMath.h>
+#include <wrl/client.h>
+
+struct Vertex {
+ Vertex() {}
+
+ Vertex(DirectX::XMFLOAT3 p, DirectX::XMFLOAT4 c)
+ : pos(p), color(c) {}
+
+ Vertex(DirectX::XMFLOAT3 p, DirectX::XMFLOAT4 c, DirectX::XMFLOAT2 t1, DirectX::XMFLOAT2 t2)
+ : pos(p), color(c), texCoord(t1), texCoord2(t2) {}
+
+ DirectX::XMFLOAT3 pos;
+ DirectX::XMFLOAT4 color;
+ DirectX::XMFLOAT2 texCoord;
+ DirectX::XMFLOAT2 texCoord2;
+};
+
+class ID3DResource;
+
+class CGUIShaderDX
+{
+public:
+ CGUIShaderDX();
+ ~CGUIShaderDX();
+
+ bool Initialize();
+ void Begin(unsigned int flags);
+ void End(void);
+ void ApplyStateBlock(void);
+ void RestoreBuffers(void);
+
+ void SetShaderViews(unsigned int numViews, ID3D11ShaderResourceView** views);
+ void SetViewPort(D3D11_VIEWPORT viewPort);
+
+ void XM_CALLCONV GetWVP(DirectX::XMMATRIX &w, DirectX::XMMATRIX &v, DirectX::XMMATRIX &p)
+ {
+ w = m_cbWorldViewProj.world;
+ v = m_cbWorldViewProj.view;
+ p = m_cbWorldViewProj.projection;
+ }
+ DirectX::XMMATRIX XM_CALLCONV GetWorld() const { return m_cbWorldViewProj.world; }
+ DirectX::XMMATRIX XM_CALLCONV GetView() const { return m_cbWorldViewProj.view; }
+ DirectX::XMMATRIX XM_CALLCONV GetProjection() const { return m_cbWorldViewProj.projection; }
+ void XM_CALLCONV SetWVP(const DirectX::XMMATRIX &w, const DirectX::XMMATRIX &v, const DirectX::XMMATRIX &p);
+ void XM_CALLCONV SetWorld(const DirectX::XMMATRIX &value);
+ void XM_CALLCONV SetView(const DirectX::XMMATRIX &value);
+ void XM_CALLCONV SetProjection(const DirectX::XMMATRIX &value);
+ void Project(float &x, float &y, float &z);
+
+ void DrawQuad(Vertex& v1, Vertex& v2, Vertex& v3, Vertex& v4);
+ void DrawIndexed(unsigned int indexCount, unsigned int startIndex, unsigned int startVertex);
+ void Draw(unsigned int vertexCount, unsigned int startVertex);
+
+ bool HardwareClipIsPossible(void) const { return m_clipPossible; }
+ float GetClipXFactor(void) const { return m_clipXFactor; }
+ float GetClipXOffset(void) const { return m_clipXOffset; }
+ float GetClipYFactor(void) const { return m_clipYFactor; }
+ float GetClipYOffset(void) const { return m_clipYOffset; }
+
+ // need to use aligned allocation because we use XMMATRIX in structures.
+ void* operator new (size_t size)
+ {
+ void* ptr = KODI::MEMORY::AlignedMalloc(size, __alignof(CGUIShaderDX));
+ if (!ptr)
+ throw std::bad_alloc();
+ return ptr;
+ }
+ // free aligned memory.
+ void operator delete (void* ptr)
+ {
+ KODI::MEMORY::AlignedFree(ptr);
+ }
+
+private:
+ struct cbWorldViewProj
+ {
+ DirectX::XMMATRIX world;
+ DirectX::XMMATRIX view;
+ DirectX::XMMATRIX projection;
+ };
+ struct cbViewPort
+ {
+ float TopLeftX;
+ float TopLeftY;
+ float Width;
+ float Height;
+ };
+ struct cbWorld
+ {
+ DirectX::XMMATRIX wvp;
+ float blackLevel;
+ float colorRange;
+ float sdrPeakLum;
+ int PQ;
+ };
+
+ void Release(void);
+ bool CreateBuffers(void);
+ bool CreateSamplers(void);
+ void ApplyChanges(void);
+ void ClipToScissorParams(void);
+
+ // GUI constants
+ cbViewPort m_cbViewPort = {};
+ cbWorldViewProj m_cbWorldViewProj = {};
+
+ bool m_bCreated;
+ size_t m_currentShader;
+ CD3DVertexShader m_vertexShader;
+ CD3DPixelShader m_pixelShader[SHADER_METHOD_RENDER_COUNT];
+ Microsoft::WRL::ComPtr<ID3D11SamplerState> m_pSampLinear;
+
+ // GUI buffers
+ bool m_bIsWVPDirty;
+ bool m_bIsVPDirty;
+ Microsoft::WRL::ComPtr<ID3D11Buffer> m_pWVPBuffer;
+ Microsoft::WRL::ComPtr<ID3D11Buffer> m_pVPBuffer;
+ Microsoft::WRL::ComPtr<ID3D11Buffer> m_pVertexBuffer;
+
+ // clip to scissors params
+ bool m_clipPossible;
+ float m_clipXFactor;
+ float m_clipXOffset;
+ float m_clipYFactor;
+ float m_clipYOffset;
+};