DXShader.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright 2017 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "VideoBackends/D3D/DXShader.h"
  4. #include "Common/Assert.h"
  5. #include "VideoBackends/D3D/D3DBase.h"
  6. namespace DX11
  7. {
  8. DXShader::DXShader(ShaderStage stage, BinaryData bytecode, ID3D11DeviceChild* shader,
  9. std::string_view name)
  10. : D3DCommon::Shader(stage, std::move(bytecode)), m_shader(shader), m_name(name)
  11. {
  12. if (!m_name.empty())
  13. {
  14. m_shader->SetPrivateData(WKPDID_D3DDebugObjectName, static_cast<UINT>(m_name.size()),
  15. m_name.data());
  16. }
  17. }
  18. DXShader::~DXShader() = default;
  19. ID3D11VertexShader* DXShader::GetD3DVertexShader() const
  20. {
  21. DEBUG_ASSERT(m_stage == ShaderStage::Vertex);
  22. return static_cast<ID3D11VertexShader*>(m_shader.Get());
  23. }
  24. ID3D11GeometryShader* DXShader::GetD3DGeometryShader() const
  25. {
  26. DEBUG_ASSERT(m_stage == ShaderStage::Geometry);
  27. return static_cast<ID3D11GeometryShader*>(m_shader.Get());
  28. }
  29. ID3D11PixelShader* DXShader::GetD3DPixelShader() const
  30. {
  31. DEBUG_ASSERT(m_stage == ShaderStage::Pixel);
  32. return static_cast<ID3D11PixelShader*>(m_shader.Get());
  33. }
  34. ID3D11ComputeShader* DXShader::GetD3DComputeShader() const
  35. {
  36. DEBUG_ASSERT(m_stage == ShaderStage::Compute);
  37. return static_cast<ID3D11ComputeShader*>(m_shader.Get());
  38. }
  39. std::unique_ptr<DXShader> DXShader::CreateFromBytecode(ShaderStage stage, BinaryData bytecode,
  40. std::string_view name)
  41. {
  42. switch (stage)
  43. {
  44. case ShaderStage::Vertex:
  45. {
  46. ComPtr<ID3D11VertexShader> vs;
  47. HRESULT hr = D3D::device->CreateVertexShader(bytecode.data(), bytecode.size(), nullptr, &vs);
  48. ASSERT_MSG(VIDEO, SUCCEEDED(hr), "Failed to create vertex shader: {}", DX11HRWrap(hr));
  49. if (FAILED(hr))
  50. return nullptr;
  51. return std::make_unique<DXShader>(ShaderStage::Vertex, std::move(bytecode), vs.Get(), name);
  52. }
  53. case ShaderStage::Geometry:
  54. {
  55. ComPtr<ID3D11GeometryShader> gs;
  56. HRESULT hr = D3D::device->CreateGeometryShader(bytecode.data(), bytecode.size(), nullptr, &gs);
  57. ASSERT_MSG(VIDEO, SUCCEEDED(hr), "Failed to create geometry shader: {}", DX11HRWrap(hr));
  58. if (FAILED(hr))
  59. return nullptr;
  60. return std::make_unique<DXShader>(ShaderStage::Geometry, std::move(bytecode), gs.Get(), name);
  61. }
  62. break;
  63. case ShaderStage::Pixel:
  64. {
  65. ComPtr<ID3D11PixelShader> ps;
  66. HRESULT hr = D3D::device->CreatePixelShader(bytecode.data(), bytecode.size(), nullptr, &ps);
  67. ASSERT_MSG(VIDEO, SUCCEEDED(hr), "Failed to create pixel shader: {}", DX11HRWrap(hr));
  68. if (FAILED(hr))
  69. return nullptr;
  70. return std::make_unique<DXShader>(ShaderStage::Pixel, std::move(bytecode), ps.Get(), name);
  71. }
  72. break;
  73. case ShaderStage::Compute:
  74. {
  75. ComPtr<ID3D11ComputeShader> cs;
  76. HRESULT hr = D3D::device->CreateComputeShader(bytecode.data(), bytecode.size(), nullptr, &cs);
  77. ASSERT_MSG(VIDEO, SUCCEEDED(hr), "Failed to create compute shader: {}", DX11HRWrap(hr));
  78. if (FAILED(hr))
  79. return nullptr;
  80. return std::make_unique<DXShader>(ShaderStage::Compute, std::move(bytecode), cs.Get(), name);
  81. }
  82. break;
  83. default:
  84. break;
  85. }
  86. return nullptr;
  87. }
  88. } // namespace DX11