CUDA.DataAccess.pas 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //
  2. // The graphics platform GLScene https://github.com/glscene
  3. //
  4. unit CUDA.DataAccess;
  5. (* CUDA data access implementation *)
  6. interface
  7. uses
  8. System.SysUtils,
  9. GLS.Logger,
  10. GLS.Strings,
  11. GLS.Utils;
  12. type
  13. GCUDAHostElementAccess<TScalar> = class
  14. public const
  15. ElementSize = SizeOf(TScalar);
  16. type
  17. TVector2 = array [0 .. 1] of TScalar;
  18. TVector3 = array [0 .. 2] of TScalar;
  19. TVector4 = array [0 .. 3] of TScalar;
  20. private
  21. class procedure CheckElementSize(ACNum: Cardinal); inline;
  22. class function GetScalar: TScalar;
  23. class function GetVector2: TVector2;
  24. class function GetVector3: TVector3;
  25. class function GetVector4: TVector4;
  26. class procedure SetScalar(const AValue: TScalar);
  27. class procedure SetVector2(const AValue: TVector2);
  28. class procedure SetVector3(const AValue: TVector3);
  29. class procedure SetVector4(const AValue: TVector4);
  30. public
  31. property Scalar: TScalar read GetScalar write SetScalar;
  32. property Vector2: TVector2 read GetVector2 write SetVector2;
  33. property Vector3: TVector3 read GetVector3 write SetVector3;
  34. property Vector4: TVector4 read GetVector4 write SetVector4;
  35. end;
  36. UByteElement = GCUDAHostElementAccess<Byte>;
  37. ByteElement = GCUDAHostElementAccess<ShortInt>;
  38. UShortElement = GCUDAHostElementAccess<Word>;
  39. ShortElement = GCUDAHostElementAccess<SmallInt>;
  40. UIntElement = GCUDAHostElementAccess<LongWord>;
  41. IntElement = GCUDAHostElementAccess<LongInt>;
  42. HalfElement = GCUDAHostElementAccess<THalfFloat>;
  43. FloatElement = GCUDAHostElementAccess<Single>;
  44. DoubleElement = GCUDAHostElementAccess<Double>;
  45. procedure SetElementAccessAddress(AValue: PByte; ASize: Cardinal);
  46. function GetElementAccessAddress: PByte;
  47. function GetElementAccessSize: Cardinal;
  48. // -----------------------------------------------
  49. implementation
  50. // -----------------------------------------------
  51. threadvar
  52. vElementAccessAddress: PByte;
  53. vElementAccessElementSize: Cardinal;
  54. function GetElementAccessAddress: PByte;
  55. begin
  56. Result := vElementAccessAddress;
  57. end;
  58. function GetElementAccessSize: Cardinal;
  59. begin
  60. Result := vElementAccessElementSize;
  61. end;
  62. procedure SetElementAccessAddress(AValue: PByte; ASize: Cardinal);
  63. begin
  64. vElementAccessAddress := AValue;
  65. vElementAccessElementSize := ASize;
  66. end;
  67. class procedure GCUDAHostElementAccess<TScalar>.CheckElementSize
  68. (ACNum: Cardinal);
  69. begin
  70. if GetElementAccessSize <> ACNum * SizeOf(TScalar) then
  71. begin
  72. GLSLogger.LogError(strSizeMismatch);
  73. Abort;
  74. end;
  75. end;
  76. class function GCUDAHostElementAccess<TScalar>.GetScalar: TScalar;
  77. begin
  78. CheckElementSize(1);
  79. Move(GetElementAccessAddress^, Result, SizeOf(TScalar));
  80. end;
  81. class function GCUDAHostElementAccess<TScalar>.GetVector2: TVector2;
  82. begin
  83. CheckElementSize(2);
  84. Move(GetElementAccessAddress^, Result, 2 * SizeOf(TScalar));
  85. end;
  86. class function GCUDAHostElementAccess<TScalar>.GetVector3: TVector3;
  87. begin
  88. CheckElementSize(3);
  89. Move(GetElementAccessAddress^, Result, 3 * SizeOf(TScalar));
  90. end;
  91. class function GCUDAHostElementAccess<TScalar>.GetVector4: TVector4;
  92. begin
  93. CheckElementSize(4);
  94. Move(GetElementAccessAddress^, Result, 4 * SizeOf(TScalar));
  95. end;
  96. class procedure GCUDAHostElementAccess<TScalar>.SetScalar
  97. (const AValue: TScalar);
  98. begin
  99. CheckElementSize(1);
  100. Move(AValue, GetElementAccessAddress^, SizeOf(TScalar));
  101. end;
  102. class procedure GCUDAHostElementAccess<TScalar>.SetVector2
  103. (const AValue: TVector2);
  104. begin
  105. CheckElementSize(2);
  106. Move(AValue, GetElementAccessAddress^, 2 * SizeOf(TScalar));
  107. end;
  108. class procedure GCUDAHostElementAccess<TScalar>.SetVector3
  109. (const AValue: TVector3);
  110. begin
  111. CheckElementSize(3);
  112. Move(AValue, GetElementAccessAddress^, 3 * SizeOf(TScalar));
  113. end;
  114. class procedure GCUDAHostElementAccess<TScalar>.SetVector4
  115. (const AValue: TVector4);
  116. begin
  117. CheckElementSize(4);
  118. Move(AValue, GetElementAccessAddress^, 4 * SizeOf(TScalar));
  119. end;
  120. end.