MethodUniformBufferBind.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Ryujinx.Graphics.Gpu.State;
  2. namespace Ryujinx.Graphics.Gpu.Engine
  3. {
  4. partial class Methods
  5. {
  6. /// <summary>
  7. /// Binds a uniform buffer for the vertex shader stage.
  8. /// </summary>
  9. /// <param name="state">Current GPU state</param>
  10. /// <param name="argument">Method call argument</param>
  11. private void UniformBufferBindVertex(GpuState state, int argument)
  12. {
  13. UniformBufferBind(state, argument, ShaderType.Vertex);
  14. }
  15. /// <summary>
  16. /// Binds a uniform buffer for the tessellation control shader stage.
  17. /// </summary>
  18. /// <param name="state">Current GPU state</param>
  19. /// <param name="argument">Method call argument</param>
  20. private void UniformBufferBindTessControl(GpuState state, int argument)
  21. {
  22. UniformBufferBind(state, argument, ShaderType.TessellationControl);
  23. }
  24. /// <summary>
  25. /// Binds a uniform buffer for the tessellation evaluation shader stage.
  26. /// </summary>
  27. /// <param name="state">Current GPU state</param>
  28. /// <param name="argument">Method call argument</param>
  29. private void UniformBufferBindTessEvaluation(GpuState state, int argument)
  30. {
  31. UniformBufferBind(state, argument, ShaderType.TessellationEvaluation);
  32. }
  33. /// <summary>
  34. /// Binds a uniform buffer for the geometry shader stage.
  35. /// </summary>
  36. /// <param name="state">Current GPU state</param>
  37. /// <param name="argument">Method call argument</param>
  38. private void UniformBufferBindGeometry(GpuState state, int argument)
  39. {
  40. UniformBufferBind(state, argument, ShaderType.Geometry);
  41. }
  42. /// <summary>
  43. /// Binds a uniform buffer for the fragment shader stage.
  44. /// </summary>
  45. /// <param name="state">Current GPU state</param>
  46. /// <param name="argument">Method call argument</param>
  47. private void UniformBufferBindFragment(GpuState state, int argument)
  48. {
  49. UniformBufferBind(state, argument, ShaderType.Fragment);
  50. }
  51. /// <summary>
  52. ///Binds a uniform buffer for the specified shader stage.
  53. /// </summary>
  54. /// <param name="state">Current GPU state</param>
  55. /// <param name="argument">Method call argument</param>
  56. /// <param name="type">Shader stage that will access the uniform buffer</param>
  57. private void UniformBufferBind(GpuState state, int argument, ShaderType type)
  58. {
  59. bool enable = (argument & 1) != 0;
  60. int index = (argument >> 4) & 0x1f;
  61. FlushUboDirty(state.Channel.MemoryManager);
  62. if (enable)
  63. {
  64. var uniformBuffer = state.Get<UniformBufferState>(MethodOffset.UniformBufferState);
  65. ulong address = uniformBuffer.Address.Pack();
  66. state.Channel.BufferManager.SetGraphicsUniformBuffer((int)type, index, address, (uint)uniformBuffer.Size);
  67. }
  68. else
  69. {
  70. state.Channel.BufferManager.SetGraphicsUniformBuffer((int)type, index, 0, 0);
  71. }
  72. }
  73. }
  74. }