[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / pictures / SlideShowPictureDX.cpp
blob261cd3105903272c6f864c01f7bb7f6745c0fa89
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "SlideShowPictureDX.h"
11 #include "guilib/TextureDX.h"
12 #include "rendering/dx/DeviceResources.h"
13 #include "rendering/dx/RenderContext.h"
15 #include <DirectXMath.h>
16 using namespace DirectX;
17 using namespace Microsoft::WRL;
19 std::unique_ptr<CSlideShowPic> CSlideShowPic::CreateSlideShowPicture()
21 return std::make_unique<CSlideShowPicDX>();
24 bool CSlideShowPicDX::UpdateVertexBuffer(Vertex* vertices)
26 if (!m_vb) // create new
28 CD3D11_BUFFER_DESC desc(sizeof(Vertex) * 5, D3D11_BIND_VERTEX_BUFFER, D3D11_USAGE_DYNAMIC,
29 D3D11_CPU_ACCESS_WRITE);
30 D3D11_SUBRESOURCE_DATA initData = {};
31 initData.pSysMem = vertices;
32 initData.SysMemPitch = sizeof(Vertex) * 5;
33 if (SUCCEEDED(DX::DeviceResources::Get()->GetD3DDevice()->CreateBuffer(
34 &desc, &initData, m_vb.ReleaseAndGetAddressOf())))
35 return true;
37 else // update
39 ID3D11DeviceContext* pContext = DX::DeviceResources::Get()->GetD3DContext();
40 D3D11_MAPPED_SUBRESOURCE res;
41 if (SUCCEEDED(pContext->Map(m_vb.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &res)))
43 memcpy(res.pData, vertices, sizeof(Vertex) * 5);
44 pContext->Unmap(m_vb.Get(), 0);
45 return true;
49 return false;
52 void CSlideShowPicDX::Render(float* x, float* y, CTexture* pTexture, UTILS::COLOR::Color color)
54 Vertex vertex[5];
55 for (int i = 0; i < 4; i++)
57 vertex[i].pos = XMFLOAT3(x[i], y[i], 0);
58 CD3DHelper::XMStoreColor(&vertex[i].color, color);
59 vertex[i].texCoord = XMFLOAT2(0.0f, 0.0f);
60 vertex[i].texCoord2 = XMFLOAT2(0.0f, 0.0f);
63 if (pTexture)
65 vertex[1].texCoord.x = vertex[2].texCoord.x =
66 (float)pTexture->GetWidth() / pTexture->GetTextureWidth();
67 vertex[2].texCoord.y = vertex[3].texCoord.y =
68 (float)pTexture->GetHeight() / pTexture->GetTextureHeight();
70 else
72 vertex[1].texCoord.x = vertex[2].texCoord.x = 1.0f;
73 vertex[2].texCoord.y = vertex[3].texCoord.y = 1.0f;
75 vertex[4] = vertex[0]; // Not used when pTexture != NULL
77 CGUIShaderDX* pGUIShader = DX::Windowing()->GetGUIShader();
78 pGUIShader->Begin(SHADER_METHOD_RENDER_TEXTURE_BLEND);
80 // Set state to render the image
81 if (pTexture)
83 pTexture->LoadToGPU();
84 CDXTexture* dxTexture = reinterpret_cast<CDXTexture*>(pTexture);
85 ID3D11ShaderResourceView* shaderRes = dxTexture->GetShaderResource();
86 pGUIShader->SetShaderViews(1, &shaderRes);
87 pGUIShader->DrawQuad(vertex[0], vertex[1], vertex[2], vertex[3]);
89 else
91 if (!UpdateVertexBuffer(vertex))
92 return;
94 ComPtr<ID3D11DeviceContext> pContext = DX::DeviceResources::Get()->GetD3DContext();
96 unsigned stride = sizeof(Vertex);
97 unsigned offset = 0;
98 pContext->IASetVertexBuffers(0, 1, m_vb.GetAddressOf(), &stride, &offset);
99 pContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP);
101 pGUIShader->Draw(5, 0);
102 pGUIShader->RestoreBuffers();