MTLPipeline.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright 2022 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <Metal/Metal.h>
  5. #include "VideoBackends/Metal/MRCHelpers.h"
  6. #include "VideoBackends/Metal/MTLObjectCache.h"
  7. #include "VideoBackends/Metal/MTLShader.h"
  8. #include "VideoCommon/AbstractPipeline.h"
  9. #include "VideoCommon/AbstractShader.h"
  10. namespace Metal
  11. {
  12. struct PipelineReflection
  13. {
  14. u32 textures = 0;
  15. u32 samplers = 0;
  16. u32 vertex_buffers = 0;
  17. u32 fragment_buffers = 0;
  18. PipelineReflection() = default;
  19. explicit PipelineReflection(MTLRenderPipelineReflection* reflection);
  20. };
  21. class Pipeline final : public AbstractPipeline
  22. {
  23. public:
  24. explicit Pipeline(const AbstractPipelineConfig& config,
  25. MRCOwned<id<MTLRenderPipelineState>> pipeline,
  26. const PipelineReflection& reflection, MTLPrimitiveType prim, MTLCullMode cull,
  27. DepthState depth, AbstractPipelineUsage usage);
  28. id<MTLRenderPipelineState> Get() const { return m_pipeline; }
  29. MTLPrimitiveType Prim() const { return m_prim; }
  30. MTLCullMode Cull() const { return m_cull; }
  31. DepthStencilSelector DepthStencil() const { return m_depth_stencil; }
  32. AbstractPipelineUsage Usage() const { return m_usage; }
  33. u32 GetTextures() const { return m_reflection.textures; }
  34. u32 GetSamplers() const { return m_reflection.samplers; }
  35. u32 GetVertexBuffers() const { return m_reflection.vertex_buffers; }
  36. u32 GetFragmentBuffers() const { return m_reflection.fragment_buffers; }
  37. bool UsesVertexBuffer(u32 index) const { return m_reflection.vertex_buffers & (1 << index); }
  38. bool UsesFragmentBuffer(u32 index) const { return m_reflection.fragment_buffers & (1 << index); }
  39. private:
  40. MRCOwned<id<MTLRenderPipelineState>> m_pipeline;
  41. MTLPrimitiveType m_prim;
  42. MTLCullMode m_cull;
  43. DepthStencilSelector m_depth_stencil;
  44. AbstractPipelineUsage m_usage;
  45. PipelineReflection m_reflection;
  46. };
  47. class ComputePipeline : public Shader
  48. {
  49. public:
  50. explicit ComputePipeline(ShaderStage stage, MTLComputePipelineReflection* reflection,
  51. std::string msl, MRCOwned<id<MTLFunction>> shader,
  52. MRCOwned<id<MTLComputePipelineState>> pipeline);
  53. id<MTLComputePipelineState> GetComputePipeline() const { return m_compute_pipeline; }
  54. u32 GetTextures() const { return m_textures; }
  55. u32 GetSamplers() const { return m_samplers; }
  56. bool UsesBuffer(u32 index) const { return m_buffers & (1 << index); }
  57. private:
  58. MRCOwned<id<MTLComputePipelineState>> m_compute_pipeline;
  59. u32 m_textures = 0;
  60. u32 m_samplers = 0;
  61. u32 m_buffers = 0;
  62. };
  63. } // namespace Metal