2
0

CUDA.DataAccess.pas 3.8 KB

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