MethodUniformBufferBind.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. if (enable)
  62. {
  63. var uniformBuffer = state.Get<UniformBufferState>(MethodOffset.UniformBufferState);
  64. ulong address = uniformBuffer.Address.Pack();
  65. BufferManager.SetGraphicsUniformBuffer((int)type, index, address, (uint)uniformBuffer.Size);
  66. }
  67. else
  68. {
  69. BufferManager.SetGraphicsUniformBuffer((int)type, index, 0, 0);
  70. }
  71. }
  72. }
  73. }