CUDA.DataAccess.pas 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. 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. // -----------------------------------------------
  47. implementation
  48. // -----------------------------------------------
  49. threadvar
  50. vElementAccessAddress: PByte;
  51. vElementAccessElementSize: Cardinal;
  52. function GetElementAccessAddress: PByte;
  53. begin
  54. Result := vElementAccessAddress;
  55. end;
  56. function GetElementAccessSize: Cardinal;
  57. begin
  58. Result := vElementAccessElementSize;
  59. end;
  60. procedure SetElementAccessAddress(AValue: PByte; ASize: Cardinal);
  61. begin
  62. vElementAccessAddress := AValue;
  63. vElementAccessElementSize := ASize;
  64. end;
  65. class procedure GCUDAHostElementAccess<TScalar>.CheckElementSize
  66. (ACNum: Cardinal);
  67. begin
  68. if GetElementAccessSize <> ACNum * SizeOf(TScalar) then
  69. begin
  70. /// GLSLogger.LogError(strSizeMismatch);
  71. Abort;
  72. end;
  73. end;
  74. class function GCUDAHostElementAccess<TScalar>.GetScalar: TScalar;
  75. begin
  76. CheckElementSize(1);
  77. Move(GetElementAccessAddress^, Result, SizeOf(TScalar));
  78. end;
  79. class function GCUDAHostElementAccess<TScalar>.GetVector2: TVector2;
  80. begin
  81. CheckElementSize(2);
  82. Move(GetElementAccessAddress^, Result, 2 * SizeOf(TScalar));
  83. end;
  84. class function GCUDAHostElementAccess<TScalar>.GetVector3: TVector3;
  85. begin
  86. CheckElementSize(3);
  87. Move(GetElementAccessAddress^, Result, 3 * SizeOf(TScalar));
  88. end;
  89. class function GCUDAHostElementAccess<TScalar>.GetVector4: TVector4;
  90. begin
  91. CheckElementSize(4);
  92. Move(GetElementAccessAddress^, Result, 4 * SizeOf(TScalar));
  93. end;
  94. class procedure GCUDAHostElementAccess<TScalar>.SetScalar
  95. (const AValue: TScalar);
  96. begin
  97. CheckElementSize(1);
  98. Move(AValue, GetElementAccessAddress^, SizeOf(TScalar));
  99. end;
  100. class procedure GCUDAHostElementAccess<TScalar>.SetVector2
  101. (const AValue: TVector2);
  102. begin
  103. CheckElementSize(2);
  104. Move(AValue, GetElementAccessAddress^, 2 * SizeOf(TScalar));
  105. end;
  106. class procedure GCUDAHostElementAccess<TScalar>.SetVector3
  107. (const AValue: TVector3);
  108. begin
  109. CheckElementSize(3);
  110. Move(AValue, GetElementAccessAddress^, 3 * SizeOf(TScalar));
  111. end;
  112. class procedure GCUDAHostElementAccess<TScalar>.SetVector4
  113. (const AValue: TVector4);
  114. begin
  115. CheckElementSize(4);
  116. Move(AValue, GetElementAccessAddress^, 4 * SizeOf(TScalar));
  117. end;
  118. end.