2
0

DelphiCL.pas 90 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789
  1. (********************************************)
  2. (* *)
  3. (* DelphiCL *)
  4. (* *)
  5. (* created by : Maksym Tymkovych *)
  6. (* (niello) *)
  7. (* *)
  8. (* headers versions: 0.07 *)
  9. (* file name : DelphiCL.pas *)
  10. (* last modify : 10.12.11 *)
  11. (* license : BSD *)
  12. (* *)
  13. (* Site : www.niello.org.ua *)
  14. (* e-mail : [email protected] *)
  15. (* ICQ : 446-769-253 *)
  16. (* *)
  17. (*********Copyright (c) niello 2008-2011*****)
  18. unit DelphiCL;
  19. interface
  20. {$INCLUDE OpenCL.inc}
  21. {$INCLUDE DelphiCL.inc}
  22. uses
  23. CL,
  24. CL_GL,
  25. Windows,
  26. SysUtils,
  27. dglOpenGL,
  28. CL_Platform;
  29. const
  30. DCL_BUILD_OPTION_SINGLE_PRECISION_CONSTANT = '-cl-single-precision-constant ';
  31. DCL_BUILD_OPTION_DENORMS_ARE_ZERO = '-cl-denorms-are-zero ';
  32. DCL_BUILD_OPTION_OPT_DISABLE = '-cl-opt-disable ';
  33. DCL_BUILD_OPTION_STRICT_ALIASING = '-cl-strict-aliasing ';
  34. DCL_BUILD_OPTION_MAD_ENABLE = '-cl-mad-enable ';
  35. DCL_BUILD_OPTION_NO_SIGNED_ZEROS = '-cl-no-signed-zeros ';
  36. DCL_BUILD_OPTION_UNSAFE_MATH_OPTIMIZATIONS = '-cl-unsafe-math-optimizations ';
  37. DCL_BUILD_OPTION_FINITE_MATH_ONLY = '-cl-finite-math-only ';
  38. DCL_BUILD_OPTION_FAST_RELAXED_MATH = '-cl-fast-relaxed-math ';
  39. DCL_BUILD_OPTION_W = '-w ';
  40. DCL_BUILD_OPTION_WERROR = '-Werror ';
  41. DCL_BUILD_OPTION_STD = '-cl-std=';
  42. {$IFDEF LOGGING}
  43. var
  44. DCLFileLOG: TextFile;
  45. procedure WriteLog(const Str: AnsiString);
  46. {$ENDIF}
  47. type
  48. TDCLMemFlags = (mfReadWrite, mfWriteOnly, mfReadOnly, mfUseHostPtr, mfAllocHostPtr, mfCopyHostPtr);
  49. TDCLMemFlagsSet = set of TDCLMemFlags;
  50. PDCLBuffer = ^TDCLBuffer;
  51. TDCLBuffer = class
  52. private
  53. FMem: PCL_mem;
  54. FStatus: TCL_int;
  55. FSize: TSize_t;
  56. protected
  57. constructor Create(const Context: PCL_context; const Flags: TDCLMemFlagsSet; const Size: TSize_t; const Data: Pointer=nil);
  58. constructor CreateFromGL(const Context: PCL_context; const Flags: TDCLMemFlagsSet; const Data: Pointer=nil);
  59. public
  60. destructor Destroy();override;
  61. property Size: TSize_t read FSize;
  62. property Status: TCL_int read FStatus;
  63. end;
  64. PDCLImage2D = ^TDCLImage2D;
  65. TDCLImage2D = class
  66. private
  67. FMem: PCL_mem;
  68. FStatus: TCL_int;
  69. FFormat: TCL_image_format;
  70. FRowPitch: TSize_t;
  71. FWidth,
  72. FHeight: TSize_t;
  73. protected
  74. constructor Create(const Context: PCL_context; const Flags: TDCLMemFlagsSet; const Format: PCL_image_format; const Width, Height: TSize_t; const RowPitch: TSize_t = 0; const Data: Pointer = nil);
  75. constructor CreateFromGL(const Context: PCL_context; const Flags: TDCLMemFlagsSet; const Texture: TGLuint);
  76. public
  77. destructor Destroy(); override;
  78. property Width: TSize_t read FWidth;
  79. property Height: TSize_t read FHeight;
  80. property RowPitch: TSize_t read FRowPitch;
  81. property Status: TCL_int read FStatus;
  82. end;
  83. TDCLCommandQueueProperties = (cqpOutOfOrderExecModeEnable);
  84. TDCLCommandQueuePropertiesSet = set of TDCLCommandQueueProperties;
  85. PDCLKernel = ^TDCLKernel;
  86. TDCLKernel = class
  87. private
  88. FKernel: PCL_kernel;
  89. FStatus: TCL_int;
  90. protected
  91. constructor Create(const Program_: PCL_program; const KernelName: PAnsiChar);
  92. function GetFunctionName(): AnsiString;
  93. function GetNumArgs(): TCL_uint;
  94. public
  95. property Status: TCL_int read FStatus;
  96. property FunctionName: AnsiString read GetFunctionName;
  97. property NumArgs: TCL_uint read GetNumArgs;
  98. procedure SetArg(const Index: TCL_uint; const Size: TSize_t; const Value: Pointer); overload;
  99. procedure SetArg(const Index: TCL_uint; const Value: TDCLBuffer); overload;
  100. procedure SetArg(const Index: TCL_uint; const Value: TDCLImage2D); overload;
  101. destructor Destroy(); override;
  102. end;
  103. PDCLCommandQueue = ^TDCLCommandQueue;
  104. TDCLCommandQueue = class
  105. private
  106. FCommandQueue: PCL_command_queue;
  107. FStatus: TCL_int;
  108. FProperties: TDCLCommandQueuePropertiesSet;
  109. {$IFDEF PROFILING}
  110. FExecuteTime: TCL_ulong;
  111. {$ENDIF}
  112. constructor Create(const Device_Id: PCL_device_id; const Context: PCL_context; const Properties: TDCLCommandQueuePropertiesSet = []);
  113. public
  114. procedure ReadBuffer(const Buffer: TDCLBuffer; const Size: TSize_t; const Data: Pointer);
  115. procedure WriteBuffer(const Buffer: TDCLBuffer; const Size: TSize_t; const Data: Pointer);
  116. procedure ReadImage2D(const Image: TDCLImage2D; const Data: Pointer);
  117. procedure WriteImage2D(const Image: TDCLImage2D; const Width, Height: TSize_t; const Data: Pointer);
  118. procedure Execute(const Kernel: TDCLKernel; const Size: TSize_t); overload;
  119. procedure Execute(const Kernel: TDCLKernel; //const Device: PCL_device_id;
  120. const Size: array of TSize_t);overload;
  121. procedure AcquireGLObject(const Buffer: TDCLBuffer);overload;
  122. procedure AcquireGLObject(const Image2D: TDCLImage2D);overload;
  123. procedure ReleaseGLObject(const Buffer: TDCLBuffer);overload;
  124. procedure ReleaseGLObject(const Image2D: TDCLImage2D);overload;
  125. property Status: TCL_int read FStatus;
  126. property Properties: TDCLCommandQueuePropertiesSet read FProperties;
  127. {$IFDEF PROFILING}
  128. property ExecuteTime: TCL_ulong read FExecuteTime;
  129. {$ENDIF}
  130. destructor Destroy(); override;
  131. end;
  132. TArraySize_t = array of TSize_t;
  133. PDCLProgram = ^TDCLProgram;
  134. TDCLProgram = class
  135. private
  136. FProgram: PCL_program;
  137. FStatus: TCL_int;
  138. FSource: PAnsiChar;
  139. FLog: AnsiString;
  140. FBinarySizes: TSize_t;
  141. FBinaries: array of array of AnsiChar;
  142. protected
  143. constructor Create(const Device: PCL_device_id; const Context: PCL_context; const Source: PPAnsiChar; const Options: PAnsiChar = nil);
  144. public
  145. property BinarySizes: TSize_t read FBinarySizes;
  146. property Source: PAnsiChar read FSource;
  147. property Status: TCL_int read FStatus;
  148. property Log: AnsiString read FLog;
  149. function CreateKernel(const KernelName: PAnsiChar): TDCLKernel;
  150. procedure SaveToFile(const FileName: AnsiString);
  151. destructor Destroy(); override;
  152. end;
  153. PDCLContext = ^TDCLContext;
  154. TDCLContext = class
  155. private
  156. FContext: PCL_context;
  157. FStatus: TCL_int;
  158. FNumDevices: TCL_uint;
  159. protected
  160. //property Context: PCL_context read FContext;
  161. public
  162. constructor Create(Device_id: PCL_device_id);
  163. constructor CreateGL(Device_id: PCL_device_id);
  164. property Status: TCL_int read FStatus;
  165. property NumDevices: TCL_uint read FNumDevices;
  166. destructor Destroy(); override;
  167. end;
  168. TDCLDeviceFPConfig = ({$IFDEF CL_VERSION_1_0}
  169. dfpcDenorm, dfpcInfNan, dfpcRoundToNearest, dfpcRoundToZero,
  170. dfpcRoundToInf, dfpcFMA
  171. {$ENDIF}
  172. {$IFDEF CL_VERSION_1_1}
  173. , dfpcSoftFloat
  174. {$ENDIF}
  175. {$IFDEF CL_VERSION_1_2}
  176. , dfpcCorrectlyRoundedDivideSqrt
  177. {$ENDIF}
  178. );
  179. TDCLDeviceFPConfigSet = Set of TDCLDeviceFPConfig;
  180. TDCLDeviceExecutionCapabilities = ({$IFDEF CL_VERSION_1_0}decExecKernel, decExecNativeKernel{$ENDIF});
  181. TDCLDeviceExecutionCapabilitiesSet = set of TDCLDeviceExecutionCapabilities;
  182. TDCLDeviceMemCacheType = ({$IFDEF CL_VERSION_1_0}
  183. dmctNone, dmctReadOnlyCache, dmctWriteOnlyCache
  184. {$ENDIF});
  185. TDCLDeviceLocalMemType = ({$IFDEF CL_VERSION_1_0}
  186. dlmtLocal, dlmtGlobal
  187. {$ENDIF});
  188. PDCLDevice = ^TDCLDevice;
  189. TDCLDevice = class
  190. //private
  191. FDevice_id: PCL_device_id;
  192. private
  193. FStatus: TCL_int;
  194. FName: AnsiString;
  195. FVendor: AnsiString;
  196. FVersion: AnsiString;
  197. FProfile: AnsiString;
  198. FIsCPU: Boolean;
  199. FIsGPU: Boolean;
  200. FIsAccelerator: Boolean;
  201. FIsDefault: Boolean;
  202. FMaxWorkGroupSize: TSize_t;
  203. FNativeVectorPreferredChar: TCL_uint;
  204. FNativeVectorPreferredShort: TCL_uint;
  205. FNativeVectorPreferredInt: TCL_uint;
  206. FNativeVectorPreferredLong: TCL_uint;
  207. FNativeVectorPreferredFloat: TCL_uint;
  208. FNativeVectorPreferredDouble: TCL_uint;
  209. FNativeVectorPreferredHalf: TCL_uint;
  210. FNativeVectorWidthChar: TCL_uint;
  211. FNativeVectorWidthShort: TCL_uint;
  212. FNativeVectorWidthInt: TCL_uint;
  213. FNativeVectorWidthLong: TCL_uint;
  214. FNativeVectorWidthFloat: TCL_uint;
  215. FNativeVectorWidthDouble: TCL_uint;
  216. FNativeVectorWidthHalf: TCL_uint;
  217. FMaxClockFrequency: TCL_uint;
  218. FAddressBits: TCL_uint;
  219. FMaxMemAllocSize: TCL_ulong;
  220. FIsImageSupport: Boolean;
  221. FMaxReadImageArgs: TCL_uint;
  222. FMaxWriteImageArgs: TCL_uint;
  223. FImage2DMaxWidth: TSize_t;
  224. FImage2DMaxHeight: TSize_t;
  225. FImage3DMaxWidth: TSize_t;
  226. FImage3DMaxHeight: TSize_t;
  227. FImage3DMaxDepth: TSize_t;
  228. FMaxSamplers: TCL_uint;
  229. FMaxParameterSize: TSize_t;
  230. FMemBaseAddrAlign: TCL_uint;
  231. FMinDataTypeAlignSize: TCL_uint;
  232. FGlobalMemCacheLineSize: TCL_uint;
  233. FGlobalMemCacheSize: TCL_ulong;
  234. FGlobalMemSize: TCL_ulong;
  235. FMaxConstantBufferSize: TCL_ulong;
  236. FMaxConstantArgs: TCL_uint;
  237. FLocalMemSize: TCL_ulong;
  238. FIsErrorCorrectionSupport: Boolean;
  239. FIsHostUnifiedMemory: Boolean;
  240. FProfilingTimerResolution: TSize_t;
  241. FIsEndianLittle: Boolean;
  242. FIsAvailable: Boolean;
  243. FIsCompilerAvailable: Boolean;
  244. FVendorId: TCL_uint;
  245. FMaxComputeUnits: TCL_uint;
  246. FMaxWorkItemDimensions: TCL_uint;
  247. FExtensionsString: AnsiString;
  248. FOpenCLCVersion: AnsiString;
  249. FDriverVersion: AnsiString;
  250. FExtensionsCount: TSize_t;
  251. FExtensions: array of AnsiString;
  252. FContext: TDCLContext;
  253. FFPConfigSet: TDCLDeviceFPConfigSet;
  254. FExecutionCapabilities: TDCLDeviceExecutionCapabilitiesSet;
  255. FGlobalMemCacheType: TDCLDeviceMemCacheType;
  256. FLocalMemType: TDCLDeviceLocalMemType;
  257. function GetExtensions(const Index: TSize_t): AnsiString;
  258. function IsPresentExtension(const ExtensionName: AnsiString): Boolean;
  259. function IsPresentInFPConfig(const FPConfig: TDCLDeviceFPConfig): Boolean;
  260. protected
  261. constructor Create(Device_id: PCL_device_id);
  262. property Device_id: PCL_device_id read FDevice_id;
  263. public
  264. property Status: TCL_int read FStatus;
  265. property Name: AnsiString read FName;
  266. property Vendor: AnsiString read FVendor;
  267. property Version: AnsiString read FVersion;
  268. property Profile: AnsiString read FProfile;
  269. property IsCPU: Boolean read FIsCPU;
  270. property IsGPU: Boolean read FIsGPU;
  271. property IsAccelerator: Boolean read FIsAccelerator;
  272. property IsDefault: Boolean read FIsDefault;
  273. property MaxWorkGroupSize: TSize_t read FMaxWorkGroupSize;
  274. property NativeVectorPreferredChar: TCL_uint read FNativeVectorPreferredChar;
  275. property NativeVectorPreferredShort: TCL_uint read FNativeVectorPreferredShort;
  276. property NativeVectorPreferredInt: TCL_uint read FNativeVectorPreferredInt;
  277. property NativeVectorPreferredLong: TCL_uint read FNativeVectorPreferredLong;
  278. property NativeVectorPreferredFloat: TCL_uint read FNativeVectorPreferredFloat;
  279. property NativeVectorPreferredDouble: TCL_uint read FNativeVectorPreferredDouble;
  280. property NativeVectorPreferredHalf: TCL_uint read FNativeVectorPreferredHalf;
  281. property NativeVectorWidthChar: TCL_uint read FNativeVectorWidthChar;
  282. property NativeVectorWidthShort: TCL_uint read FNativeVectorWidthShort;
  283. property NativeVectorWidthInt: TCL_uint read FNativeVectorWidthInt;
  284. property NativeVectorWidthLong: TCL_uint read FNativeVectorWidthLong;
  285. property NativeVectorWidthFloat: TCL_uint read FNativeVectorWidthFloat;
  286. property NativeVectorWidthDouble: TCL_uint read FNativeVectorWidthDouble;
  287. property NativeVectorWidthHalf: TCL_uint read FNativeVectorWidthHalf;
  288. property MaxClockFrequency: TCL_uint read FMaxClockFrequency;
  289. property AddressBits: TCL_uint read FAddressBits;
  290. property MaxMemAllocSize: TCL_ulong read FMaxMemAllocSize;
  291. property IsImageSupport: Boolean read FIsImageSupport;
  292. property MaxReadImageArgs: TCL_uint read FMaxReadImageArgs;
  293. property MaxWriteImageArgs: TCL_uint read FMaxWriteImageArgs;
  294. property Image2DMaxWidth: TSize_t read FImage2DMaxWidth;
  295. property Image2DMaxHeight: TSize_t read FImage2DMaxHeight;
  296. property Image3DMaxWidth: TSize_t read FImage3DMaxWidth;
  297. property Image3DMaxHeight: TSize_t read FImage3DMaxHeight;
  298. property Image3DMaxDepth: TSize_t read FImage3DMaxDepth;
  299. property MaxSamplers: TCL_uint read FMaxSamplers;
  300. property MaxParameterSize: TSize_t read FMaxParameterSize;
  301. property MemBaseAddrAlign: TCL_uint read FMemBaseAddrAlign;
  302. property MinDataTypeAlignSize: TCL_uint read FMinDataTypeAlignSize;
  303. property GlobalMemCacheLineSize: TCL_uint read FGlobalMemCacheLineSize;
  304. property GlobalMemCacheSize: TCL_ulong read FGlobalMemCacheSize;
  305. property GlobalMemSize: TCL_ulong read FGlobalMemSize;
  306. property MaxConstantBufferSize: TCL_ulong read FMaxConstantBufferSize;
  307. property MaxConstantArgs: TCL_uint read FMaxConstantArgs;
  308. property LocalMemSize: TCL_ulong read FLocalMemSize;
  309. property IsErrorCorrectionSupport: Boolean read FIsErrorCorrectionSupport;
  310. property IsHostUnifiedMemory: Boolean read FIsHostUnifiedMemory;
  311. property ProfilingTimerResolution: TSize_t read FProfilingTimerResolution;
  312. property IsEndianLittle: Boolean read FIsEndianLittle;
  313. property IsAvailable: Boolean read FIsAvailable;
  314. property IsCompilerAvailable: Boolean read FIsCompilerAvailable;
  315. property VendorId: TCL_uint read FVendorId;
  316. property MaxComputeUnits: TCL_uint read FMaxComputeUnits;
  317. property MaxWorkItemDimensions: TCL_uint read FMaxWorkItemDimensions;
  318. property DriverVersion: AnsiString read FDriverVersion;
  319. property OpenCLCVersion: AnsiString read FOpenCLCVersion;
  320. property ExtensionsString: AnsiString read FExtensionsString;
  321. property Context: TDCLContext read FContext;
  322. function CreateContext(): TDCLContext;
  323. function CreateContextGL(): TDCLContext;
  324. function CreateCommandQueue(const properties: TDCLCommandQueuePropertiesSet = []): TDCLCommandQueue;overload;
  325. function CreateCommandQueue(const context: TDCLContext; const properties: TDCLCommandQueuePropertiesSet = []): TDCLCommandQueue;overload;
  326. function CreateBuffer(const Size: TSize_t; const Data: Pointer = nil; const flags: TDCLMemFlagsSet = [mfReadWrite]): TDCLBuffer;
  327. function CreateFromGLBuffer(const Data: Pointer = nil; const flags: TDCLMemFlagsSet = [mfWriteOnly]): TDCLBuffer;
  328. function CreateImage2D(const Format: PCL_image_format; const Width, Height, RowPitch: TSize_t; const Data: Pointer = nil; const flags: TDCLMemFlagsSet = [mfReadWrite]): TDCLImage2D;
  329. function CreateFromGLImage2D(const Texture: TGLuint; const Flags: TDCLMemFlagsSet = [mfWriteOnly]): TDCLImage2D;
  330. function CreateProgram(const Source: PPAnsiChar; const Options: PAnsiChar = nil): TDCLProgram; overload;
  331. function CreateProgram(const FileName: String; const Options: PAnsiChar = nil): TDCLProgram; overload;
  332. property ExtensionsCount: TSize_t read FExtensionsCount;
  333. property Extensions[const Index: TSize_t]: AnsiString read GetExtensions;
  334. property IsSupportedExtension[const Index: AnsiString]: Boolean read IsPresentExtension;
  335. property FPConfig[const Index: TDCLDeviceFPConfig]: Boolean read IsPresentInFPConfig;
  336. property GlobalMemCacheType: TDCLDeviceMemCacheType read FGlobalMemCacheType;
  337. destructor Destroy(); override;
  338. end;
  339. PDCLPlatform = ^TDCLPlatform;
  340. TDCLPlatform = class
  341. private
  342. FPlatform_id: PCL_platform_id;
  343. FProfile: AnsiString;
  344. FVersion: AnsiString;
  345. FName: AnsiString;
  346. FVendor: AnsiString;
  347. FExtensionsString: AnsiString;
  348. FStatus: TCL_int;
  349. FDevices: array of TDCLDevice;
  350. FDeviceCount: TCL_uint;
  351. FCPUs,
  352. FGPUs,
  353. FAccelerators: array of TCL_uint;
  354. FCPUCount,
  355. FGPUCount,
  356. FAcceleratorCount: TCL_uint;
  357. FExtensionsCount: TSize_t;
  358. FExtensions: array of AnsiString;
  359. function GetDevice(Index: TCL_uint): PDCLDevice;
  360. function GetCPU(Index: TCL_uint): PDCLDevice;
  361. function GetGPU(Index: TCL_uint): PDCLDevice;
  362. function GetAccelerator(Index: TCL_uint): PDCLDevice;
  363. function GetExtensions(Index: TSize_t): AnsiString;
  364. function IsPresentExtension(const ExtensionName: AnsiString): Boolean;
  365. function GetDeviceWithMaxClockFrequency(): PDCLDevice;
  366. function GetDeviceWithMaxComputeUnits(): PDCLDevice;
  367. function GetDeviceWithMaxGlobalMemCacheLineSize(): PDCLDevice;
  368. function GetDeviceWithMaxGlobalMemCacheSize(): PDCLDevice;
  369. function GetDeviceWithMaxGlobalMemSize(): PDCLDevice;
  370. function GetDeviceWithMaxImage2DWidth(): PDCLDevice;
  371. function GetDeviceWithMaxImage2DHeight(): PDCLDevice;
  372. function GetDeviceWithMaxImage3DWidth(): PDCLDevice;
  373. function GetDeviceWithMaxImage3DHeight(): PDCLDevice;
  374. function GetDeviceWithMaxImage3DDepth(): PDCLDevice;
  375. function GetDeviceWithMaxLocalMemSize(): PDCLDevice;
  376. function GetDeviceWithMaxConstantArgs(): PDCLDevice;
  377. function GetDeviceWithMaxConstantBufferSize(): PDCLDevice;
  378. function GetDeviceWithMaxMemAllocSize(): PDCLDevice;
  379. function GetDeviceWithMaxParameterSize(): PDCLDevice;
  380. function GetDeviceWithMaxReadImageArgs(): PDCLDevice;
  381. function GetDeviceWithMaxSamplers(): PDCLDevice;
  382. function GetDeviceWithMaxWorkGroupSize(): PDCLDevice;
  383. function GetDeviceWithMaxWorkItemDimensions(): PDCLDevice;
  384. function GetDeviceWithMaxWriteImageArgs(): PDCLDevice;
  385. public
  386. constructor Create(Platform_id: PCL_platform_id);
  387. property Profile: AnsiString read FProfile;
  388. property Version: AnsiString read FVersion;
  389. property Name: AnsiString read FName;
  390. property Vendor: AnsiString read FVendor;
  391. property ExtensionsString: AnsiString read FExtensionsString;
  392. property DeviceCount: TCL_uint read FDeviceCount;
  393. property CPUCount: TCL_uint read FCPUCount;
  394. property GPUCount: TCL_uint read FGPUCount;
  395. property AcceleratorCount: TCL_uint read FAcceleratorCount;
  396. property Status: TCL_int read FStatus;
  397. property Devices[Index: TCL_uint]: PDCLDevice read GetDevice;
  398. property CPUs[Index: TCL_uint]: PDCLDevice read GetCPU;
  399. property GPUs[Index: TCL_uint]: PDCLDevice read GetGPU;
  400. property Accelerators[Index: TCL_uint]: PDCLDevice read GetAccelerator;
  401. property ExtensionsCount: TSize_t read FExtensionsCount;
  402. property Extensions[Index: TSize_t]: AnsiString read GetExtensions;
  403. property IsSupportedExtension[const Index: AnsiString]: Boolean read IsPresentExtension;
  404. property DeviceWithMaxClockFrequency: PDCLDevice read GetDeviceWithMaxClockFrequency;
  405. property DeviceWithMaxComputeUnits: PDCLDevice read GetDeviceWithMaxComputeUnits;
  406. property DeviceWithMaxGlobalMemCacheLineSize: PDCLDevice read GetDeviceWithMaxGlobalMemCacheLineSize;
  407. property DeviceWithMaxGlobalMemCacheSize: PDCLDevice read GetDeviceWithMaxGlobalMemCacheSize;
  408. property DeviceWithMaxGlobalMemSize: PDCLDevice read GetDeviceWithMaxGlobalMemSize;
  409. property DeviceWithMaxImage2DWidth: PDCLDevice read GetDeviceWithMaxImage2DWidth;
  410. property DeviceWithMaxImage2DHeight: PDCLDevice read GetDeviceWithMaxImage2DHeight;
  411. property DeviceWithMaxImage3DWidth: PDCLDevice read GetDeviceWithMaxImage3DWidth;
  412. property DeviceWithMaxImage3DHeight: PDCLDevice read GetDeviceWithMaxImage3DHeight;
  413. property DeviceWithMaxImage3DDepth: PDCLDevice read GetDeviceWithMaxImage3DDepth;
  414. property DeviceWithMaxLocalMemSize: PDCLDevice read GetDeviceWithMaxLocalMemSize;
  415. property DeviceWithMaxConstantArgs: PDCLDevice read GetDeviceWithMaxConstantArgs;
  416. property DeviceWithMaxConstantBufferSize: PDCLDevice read GetDeviceWithMaxConstantBufferSize;
  417. property DeviceWithMaxMemAllocSize: PDCLDevice read GetDeviceWithMaxMemAllocSize;
  418. property DeviceWithMaxParameterSize: PDCLDevice read GetDeviceWithMaxParameterSize;
  419. property DeviceWithMaxReadImageArgs: PDCLDevice read GetDeviceWithMaxReadImageArgs;
  420. property DeviceWithMaxSamplers: PDCLDevice read GetDeviceWithMaxSamplers;
  421. property DeviceWithMaxWorkGroupSize: PDCLDevice read GetDeviceWithMaxWorkGroupSize;
  422. property DeviceWithMaxWorkItemDimensions: PDCLDevice read GetDeviceWithMaxWorkItemDimensions;
  423. property DeviceWithMaxWriteImageArgs: PDCLDevice read GetDeviceWithMaxWriteImageArgs;
  424. destructor Destroy(); override;
  425. end;
  426. PDCLPlatforms = ^TDCLPlatforms;
  427. TDCLPlatforms = class
  428. private
  429. FPlatforms: array of TDCLPlatform;
  430. FPlatformCount: TCL_uint;
  431. FStatus: TCL_int;
  432. function GetPlatform(Index: TCL_uint): PDCLPlatform;
  433. public
  434. constructor Create();
  435. property PlatformCount: TCL_uint read FPlatformCount;
  436. property Status: TCL_int read FStatus;
  437. property Platforms[Index: TCL_uint]: PDCLPlatform read GetPlatform;
  438. destructor Destroy(); override;
  439. end;
  440. implementation
  441. function UpperCase(const S: AnsiString): AnsiString;
  442. var
  443. Ch: AnsiChar;
  444. L: Integer;
  445. Source, Dest: PAnsiChar;
  446. begin
  447. L := Length(S);
  448. SetLength(Result, L);
  449. Source := Pointer(S);
  450. Dest := Pointer(Result);
  451. while L <> 0 do
  452. begin
  453. Ch := Source^;
  454. if (Ch >= 'a') and (Ch <= 'z') then Dec(Ch, 32);
  455. Dest^ := Ch;
  456. Inc(Source);
  457. Inc(Dest);
  458. Dec(L);
  459. end;
  460. end;
  461. {// Osak Alexey for 64 bit value
  462. function IntToStr( Value : Integer ) : AnsiString;
  463. begin
  464. Str( Value, Result );
  465. end;
  466. }
  467. {$IFDEF LOGGING}
  468. procedure WriteLog(const Str: AnsiString);
  469. begin
  470. Writeln(DCLFileLOG, Str);
  471. Flush(DCLFileLOG);
  472. end;
  473. {$ENDIF}
  474. { TDCLPlatforms }
  475. constructor TDCLPlatforms.Create;
  476. var
  477. platforms: array of PCL_platform_id;
  478. i: integer;
  479. begin
  480. FStatus := clGetPlatformIDs(0, nil, @FPlatformCount);
  481. {$IFDEF LOGGING}
  482. WriteLog('clGetPlatformIDs: ' + GetString(FStatus) + ';');
  483. {$ENDIF}
  484. {$IFDEF LOGGING}
  485. WriteLog('PlatformCount: ' + IntToStr(FPlatformCount) + ';');
  486. {$ENDIF}
  487. if FStatus=CL_SUCCESS then
  488. begin
  489. if FPlatformCount>0 then
  490. begin
  491. SetLength(platforms, FPlatformCount);
  492. SetLength(FPlatforms, FPlatformCount);
  493. FStatus := clGetPlatformIDs(FPlatformCount, @platforms[0], nil);
  494. {$IFDEF LOGGING}
  495. WriteLog('clGetPlatformIDs: ' + GetString(FStatus) + ';');
  496. {$ENDIF}
  497. for i := 0 to FPlatformCount-1 do
  498. begin
  499. FPlatforms[i] := TDCLPlatform.Create(platforms[i]);
  500. end;
  501. SetLength(platforms, 0);
  502. end;
  503. end;
  504. end;
  505. destructor TDCLPlatforms.Destroy;
  506. var
  507. i: Integer;
  508. begin
  509. for i := 0 to FPlatformCount-1 do
  510. begin
  511. //FPlatforms[i].Free();
  512. FreeAndNil(FPlatforms[i]);
  513. end;
  514. SetLength(FPlatforms, 0);
  515. inherited;
  516. end;
  517. function TDCLPlatforms.GetPlatform(Index: TCL_uint): PDCLPlatform;
  518. begin
  519. if (Index<FPlatformCount)then Result := @FPlatforms[Index]
  520. else Result := nil;
  521. end;
  522. { TDCLPlatform }
  523. constructor TDCLPlatform.Create(Platform_id: PCL_platform_id);
  524. var
  525. Size: TSize_t;
  526. devices: array of PCL_device_id;
  527. i, current, previous: integer;
  528. begin
  529. inherited Create();
  530. FPlatform_id := Platform_id;
  531. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_PROFILE, 0, nil, @Size);
  532. {$IFDEF LOGGING}
  533. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  534. {$ENDIF}
  535. SetLength(FProfile, Size);
  536. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_PROFILE, Size, @FProfile[1], nil);
  537. {$IFDEF LOGGING}
  538. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  539. {$ENDIF}
  540. {$IFDEF LOGGING}
  541. WriteLog('CL_PLATFORM_PROFILE: ' + FProfile + ';');
  542. {$ENDIF}
  543. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_VERSION, 0, nil, @Size);
  544. {$IFDEF LOGGING}
  545. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  546. {$ENDIF}
  547. SetLength(FVersion, Size);
  548. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_VERSION, Size, @FVersion[1], nil);
  549. {$IFDEF LOGGING}
  550. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  551. {$ENDIF}
  552. {$IFDEF LOGGING}
  553. WriteLog('CL_PLATFORM_VERSION: ' + FVersion + ';');
  554. {$ENDIF}
  555. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_NAME, 0, nil, @Size);
  556. {$IFDEF LOGGING}
  557. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  558. {$ENDIF}
  559. SetLength(FName, Size);
  560. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_NAME, Size, @FName[1], nil);
  561. {$IFDEF LOGGING}
  562. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  563. {$ENDIF}
  564. {$IFDEF LOGGING}
  565. WriteLog('CL_PLATFORM_NAME: ' + FName + ';');
  566. {$ENDIF}
  567. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_VENDOR, 0, nil, @Size);
  568. {$IFDEF LOGGING}
  569. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  570. {$ENDIF}
  571. SetLength(FVendor, Size);
  572. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_VENDOR, Size, @FVendor[1], nil);
  573. {$IFDEF LOGGING}
  574. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  575. {$ENDIF}
  576. {$IFDEF LOGGING}
  577. WriteLog('CCL_PLATFORM_VENDOR: ' + FVendor + ';');
  578. {$ENDIF}
  579. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_EXTENSIONS, 0, nil, @Size);
  580. {$IFDEF LOGGING}
  581. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  582. {$ENDIF}
  583. SetLength(FExtensionsString, Size);
  584. FStatus := clGetPlatformInfo(FPlatform_id, CL_PLATFORM_EXTENSIONS, Size, @FExtensionsString[1], nil);
  585. {$IFDEF LOGGING}
  586. WriteLog('clGetPlatformInfo: ' + GetString(FStatus) + ';');
  587. {$ENDIF}
  588. {$IFDEF LOGGING}
  589. WriteLog('CL_PLATFORM_EXTENSIONS: ' + FExtensionsString + ';');
  590. {$ENDIF}
  591. FExtensionsCount := 0;
  592. i := 1;
  593. while (i<=Length(FExtensionsString)) do
  594. begin
  595. if ((FExtensionsString[i]=' ') or (FExtensionsString[i]=#0)) then Inc(FExtensionsCount);
  596. inc(i);
  597. end;
  598. SetLength(FExtensions, FExtensionsCount);
  599. previous := 1;
  600. current := 1;
  601. i := 0;
  602. while (current<=Length(FExtensionsString)) do
  603. begin
  604. if ((FExtensionsString[current]=' ') or (FExtensionsString[current]=#0)) then
  605. begin
  606. FExtensions[i] := UpperCase( Copy(FExtensionsString, previous, current-previous-1));
  607. previous := current + 1;
  608. inc(i);
  609. end;
  610. inc(current);
  611. end;
  612. FStatus := clGetDeviceIDs(FPlatform_id, CL_DEVICE_TYPE_ALL, 0, nil, @FDeviceCount);
  613. {$IFDEF LOGGING}
  614. WriteLog('clGetDeviceIDs: ' + GetString(FStatus) + ';');
  615. {$ENDIF}
  616. {$IFDEF LOGGING}
  617. WriteLog('FDeviceCount: ' + IntToStr(FDeviceCount) + ';');
  618. {$ENDIF}
  619. FCPUCount := 0;
  620. FGPUCount := 0;
  621. FAcceleratorCount := 0;
  622. if FDeviceCount>0 then
  623. begin
  624. SetLength(devices, FDeviceCount);
  625. FStatus := clGetDeviceIDs(FPlatform_id, CL_DEVICE_TYPE_ALL, FDeviceCount, @devices[0], nil);
  626. {$IFDEF LOGGING}
  627. WriteLog('clGetDeviceIDs: ' + GetString(FStatus) + ';');
  628. {$ENDIF}
  629. SetLength(FDevices, FDeviceCount);
  630. for i := 0 to FDeviceCount-1 do
  631. begin
  632. {$IFDEF LOGGING}
  633. WriteLog('FDevice: ' + IntToStr(i) + ';');
  634. {$ENDIF}
  635. FDevices[i] := TDCLDevice.Create(devices[i]);
  636. if FDevices[i].IsCPU then
  637. begin
  638. Inc(FCPUCount);
  639. SetLength(FCPUs, FCPUCount);
  640. FCPUs[FCPUCount-1] := i;
  641. end;
  642. if FDevices[i].IsGPU then
  643. begin
  644. Inc(FGPUCount);
  645. SetLength(FGPUs, FGPUCount);
  646. FGPUs[FGPUCount-1] := i;
  647. end;
  648. if FDevices[i].IsAccelerator then
  649. begin
  650. Inc(FAcceleratorCount);
  651. SetLength(FAccelerators, FAcceleratorCount);
  652. FAccelerators[FAcceleratorCount-1] := i;
  653. end;
  654. end;
  655. SetLength(devices, 0);
  656. end;
  657. end;
  658. destructor TDCLPlatform.Destroy;
  659. var
  660. i: integer;
  661. begin
  662. SetLength(FExtensions, 0);
  663. FExtensionsString := '';
  664. FProfile := '';
  665. FVersion := '';
  666. FName := '';
  667. FVendor := '';
  668. for i := 0 to FDeviceCount-1 do
  669. begin
  670. FreeAndNil(FDevices[i]);
  671. //FDevices[i].Free();
  672. end;
  673. SetLength(FCPUs, 0);
  674. SetLength(FGPUs, 0);
  675. SetLength(FAccelerators, 0);
  676. SetLength(FDevices, 0);
  677. inherited;
  678. end;
  679. function TDCLPlatform.GetAccelerator(Index: TCL_uint): PDCLDevice;
  680. begin
  681. if Index<FAcceleratorCount then Result := @FDevices[FAccelerators[Index]]
  682. else Result := nil;
  683. end;
  684. function TDCLPlatform.GetCPU(Index: TCL_uint): PDCLDevice;
  685. begin
  686. if Index<FCPUCount then Result := @FDevices[FCPUs[Index]]
  687. else Result := nil;
  688. end;
  689. function TDCLPlatform.GetDevice(Index: TCL_uint): PDCLDevice;
  690. begin
  691. if (Index<FDeviceCount)then Result := @FDevices[Index]
  692. else Result := nil;
  693. end;
  694. function TDCLPlatform.GetDeviceWithMaxClockFrequency: PDCLDevice;
  695. function GetParameterDevice(const Device: TDCLDevice): TCL_uint;
  696. begin
  697. Result := Device.MaxClockFrequency;
  698. end;
  699. var
  700. i: Integer;
  701. MaxValue: TCL_uint;
  702. MaxValuePos: TCL_uint;
  703. begin
  704. if FDeviceCount=0 then
  705. begin
  706. Result := nil;
  707. Exit;
  708. end;
  709. MaxValue := GetParameterDevice(FDevices[0]);
  710. MaxValuePos := 0;
  711. for i := 1 to FDeviceCount-1 do
  712. begin
  713. if GetParameterDevice(FDevices[i])>MaxValue then
  714. begin
  715. MaxValue := GetParameterDevice(FDevices[i]);
  716. MaxValuePos := i;
  717. end;
  718. end;
  719. Result := @FDevices[MaxValuePos];
  720. end;
  721. function TDCLPlatform.GetDeviceWithMaxComputeUnits: PDCLDevice;
  722. function GetParameterDevice(const Device: TDCLDevice): TCL_uint;
  723. begin
  724. Result := Device.MaxComputeUnits;
  725. end;
  726. var
  727. i: Integer;
  728. MaxValue: TCL_uint;
  729. MaxValuePos: TCL_uint;
  730. begin
  731. if FDeviceCount=0 then
  732. begin
  733. Result := nil;
  734. Exit;
  735. end;
  736. MaxValue := GetParameterDevice(FDevices[0]);
  737. MaxValuePos := 0;
  738. for i := 1 to FDeviceCount-1 do
  739. begin
  740. if GetParameterDevice(FDevices[i])>MaxValue then
  741. begin
  742. MaxValue := GetParameterDevice(FDevices[i]);
  743. MaxValuePos := i;
  744. end;
  745. end;
  746. Result := @FDevices[MaxValuePos];
  747. end;
  748. function TDCLPlatform.GetDeviceWithMaxConstantArgs: PDCLDevice;
  749. function GetParameterDevice(const Device: TDCLDevice): TCL_uint;
  750. begin
  751. Result := Device.MaxConstantArgs;
  752. end;
  753. var
  754. i: Integer;
  755. MaxValue: TCL_uint;
  756. MaxValuePos: TCL_uint;
  757. begin
  758. if FDeviceCount=0 then
  759. begin
  760. Result := nil;
  761. Exit;
  762. end;
  763. MaxValue := GetParameterDevice(FDevices[0]);
  764. MaxValuePos := 0;
  765. for i := 1 to FDeviceCount-1 do
  766. begin
  767. if GetParameterDevice(FDevices[i])>MaxValue then
  768. begin
  769. MaxValue := GetParameterDevice(FDevices[i]);
  770. MaxValuePos := i;
  771. end;
  772. end;
  773. Result := @FDevices[MaxValuePos];
  774. end;
  775. function TDCLPlatform.GetDeviceWithMaxConstantBufferSize: PDCLDevice;
  776. function GetParameterDevice(const Device: TDCLDevice): TCL_ulong;
  777. begin
  778. Result := Device.MaxConstantBufferSize;
  779. end;
  780. var
  781. i: Integer;
  782. MaxValue: TCL_ulong;
  783. MaxValuePos: TCL_uint;
  784. begin
  785. if FDeviceCount=0 then
  786. begin
  787. Result := nil;
  788. Exit;
  789. end;
  790. MaxValue := GetParameterDevice(FDevices[0]);
  791. MaxValuePos := 0;
  792. for i := 1 to FDeviceCount-1 do
  793. begin
  794. if GetParameterDevice(FDevices[i])>MaxValue then
  795. begin
  796. MaxValue := GetParameterDevice(FDevices[i]);
  797. MaxValuePos := i;
  798. end;
  799. end;
  800. Result := @FDevices[MaxValuePos];
  801. end;
  802. function TDCLPlatform.GetDeviceWithMaxGlobalMemCacheLineSize: PDCLDevice;
  803. function GetParameterDevice(const Device: TDCLDevice): TCL_uint;
  804. begin
  805. Result := Device.GlobalMemCacheLineSize;
  806. end;
  807. var
  808. i: Integer;
  809. MaxValue: TCL_uint;
  810. MaxValuePos: TCL_uint;
  811. begin
  812. if FDeviceCount=0 then
  813. begin
  814. Result := nil;
  815. Exit;
  816. end;
  817. MaxValue := GetParameterDevice(FDevices[0]);
  818. MaxValuePos := 0;
  819. for i := 1 to FDeviceCount-1 do
  820. begin
  821. if GetParameterDevice(FDevices[i])>MaxValue then
  822. begin
  823. MaxValue := GetParameterDevice(FDevices[i]);
  824. MaxValuePos := i;
  825. end;
  826. end;
  827. Result := @FDevices[MaxValuePos];
  828. end;
  829. function TDCLPlatform.GetDeviceWithMaxGlobalMemCacheSize: PDCLDevice;
  830. function GetParameterDevice(const Device: TDCLDevice): TCL_ulong;
  831. begin
  832. Result := Device.GlobalMemCacheSize;
  833. end;
  834. var
  835. i: Integer;
  836. MaxValue: TCL_ulong;
  837. MaxValuePos: TCL_uint;
  838. begin
  839. if FDeviceCount=0 then
  840. begin
  841. Result := nil;
  842. Exit;
  843. end;
  844. MaxValue := GetParameterDevice(FDevices[0]);
  845. MaxValuePos := 0;
  846. for i := 1 to FDeviceCount-1 do
  847. begin
  848. if GetParameterDevice(FDevices[i])>MaxValue then
  849. begin
  850. MaxValue := GetParameterDevice(FDevices[i]);
  851. MaxValuePos := i;
  852. end;
  853. end;
  854. Result := @FDevices[MaxValuePos];
  855. end;
  856. function TDCLPlatform.GetDeviceWithMaxGlobalMemSize: PDCLDevice;
  857. function GetParameterDevice(const Device: TDCLDevice): TCL_ulong;
  858. begin
  859. Result := Device.GlobalMemSize;
  860. end;
  861. var
  862. i: Integer;
  863. MaxValue: TCL_ulong;
  864. MaxValuePos: TCL_uint;
  865. begin
  866. if FDeviceCount=0 then
  867. begin
  868. Result := nil;
  869. Exit;
  870. end;
  871. MaxValue := GetParameterDevice(FDevices[0]);
  872. MaxValuePos := 0;
  873. for i := 1 to FDeviceCount-1 do
  874. begin
  875. if GetParameterDevice(FDevices[i])>MaxValue then
  876. begin
  877. MaxValue := GetParameterDevice(FDevices[i]);
  878. MaxValuePos := i;
  879. end;
  880. end;
  881. Result := @FDevices[MaxValuePos];
  882. end;
  883. function TDCLPlatform.GetDeviceWithMaxImage2DHeight: PDCLDevice;
  884. function GetParameterDevice(const Device: TDCLDevice): TSize_t;
  885. begin
  886. Result := Device.Image2DMaxHeight;
  887. end;
  888. var
  889. i: Integer;
  890. MaxValue: TSize_t;
  891. MaxValuePos: TCL_uint;
  892. begin
  893. if FDeviceCount=0 then
  894. begin
  895. Result := nil;
  896. Exit;
  897. end;
  898. MaxValue := GetParameterDevice(FDevices[0]);
  899. MaxValuePos := 0;
  900. for i := 1 to FDeviceCount-1 do
  901. begin
  902. if GetParameterDevice(FDevices[i])>MaxValue then
  903. begin
  904. MaxValue := GetParameterDevice(FDevices[i]);
  905. MaxValuePos := i;
  906. end;
  907. end;
  908. Result := @FDevices[MaxValuePos];
  909. end;
  910. function TDCLPlatform.GetDeviceWithMaxImage2DWidth: PDCLDevice;
  911. function GetParameterDevice(const Device: TDCLDevice): TSize_t;
  912. begin
  913. Result := Device.Image2DMaxWidth;
  914. end;
  915. var
  916. i: Integer;
  917. MaxValue: TSize_t;
  918. MaxValuePos: TCL_uint;
  919. begin
  920. if FDeviceCount=0 then
  921. begin
  922. Result := nil;
  923. Exit;
  924. end;
  925. MaxValue := GetParameterDevice(FDevices[0]);
  926. MaxValuePos := 0;
  927. for i := 1 to FDeviceCount-1 do
  928. begin
  929. if GetParameterDevice(FDevices[i])>MaxValue then
  930. begin
  931. MaxValue := GetParameterDevice(FDevices[i]);
  932. MaxValuePos := i;
  933. end;
  934. end;
  935. Result := @FDevices[MaxValuePos];
  936. end;
  937. function TDCLPlatform.GetDeviceWithMaxImage3DDepth: PDCLDevice;
  938. function GetParameterDevice(const Device: TDCLDevice): TSize_t;
  939. begin
  940. Result := Device.Image3DMaxDepth;
  941. end;
  942. var
  943. i: Integer;
  944. MaxValue: TSize_t;
  945. MaxValuePos: TCL_uint;
  946. begin
  947. if FDeviceCount=0 then
  948. begin
  949. Result := nil;
  950. Exit;
  951. end;
  952. MaxValue := GetParameterDevice(FDevices[0]);
  953. MaxValuePos := 0;
  954. for i := 1 to FDeviceCount-1 do
  955. begin
  956. if GetParameterDevice(FDevices[i])>MaxValue then
  957. begin
  958. MaxValue := GetParameterDevice(FDevices[i]);
  959. MaxValuePos := i;
  960. end;
  961. end;
  962. Result := @FDevices[MaxValuePos];
  963. end;
  964. function TDCLPlatform.GetDeviceWithMaxImage3DHeight: PDCLDevice;
  965. function GetParameterDevice(const Device: TDCLDevice): TSize_t;
  966. begin
  967. Result := Device.Image3DMaxHeight;
  968. end;
  969. var
  970. i: Integer;
  971. MaxValue: TSize_t;
  972. MaxValuePos: TCL_uint;
  973. begin
  974. if FDeviceCount=0 then
  975. begin
  976. Result := nil;
  977. Exit;
  978. end;
  979. MaxValue := GetParameterDevice(FDevices[0]);
  980. MaxValuePos := 0;
  981. for i := 1 to FDeviceCount-1 do
  982. begin
  983. if GetParameterDevice(FDevices[i])>MaxValue then
  984. begin
  985. MaxValue := GetParameterDevice(FDevices[i]);
  986. MaxValuePos := i;
  987. end;
  988. end;
  989. Result := @FDevices[MaxValuePos];
  990. end;
  991. function TDCLPlatform.GetDeviceWithMaxImage3DWidth: PDCLDevice;
  992. function GetParameterDevice(const Device: TDCLDevice): TSize_t;
  993. begin
  994. Result := Device.Image3DMaxWidth;
  995. end;
  996. var
  997. i: Integer;
  998. MaxValue: TSize_t;
  999. MaxValuePos: TCL_uint;
  1000. begin
  1001. if FDeviceCount=0 then
  1002. begin
  1003. Result := nil;
  1004. Exit;
  1005. end;
  1006. MaxValue := GetParameterDevice(FDevices[0]);
  1007. MaxValuePos := 0;
  1008. for i := 1 to FDeviceCount-1 do
  1009. begin
  1010. if GetParameterDevice(FDevices[i])>MaxValue then
  1011. begin
  1012. MaxValue := GetParameterDevice(FDevices[i]);
  1013. MaxValuePos := i;
  1014. end;
  1015. end;
  1016. Result := @FDevices[MaxValuePos];
  1017. end;
  1018. function TDCLPlatform.GetDeviceWithMaxLocalMemSize: PDCLDevice;
  1019. function GetParameterDevice(const Device: TDCLDevice): TCL_ulong;
  1020. begin
  1021. Result := Device.LocalMemSize;
  1022. end;
  1023. var
  1024. i: Integer;
  1025. MaxValue: TCL_ulong;
  1026. MaxValuePos: TCL_uint;
  1027. begin
  1028. if FDeviceCount=0 then
  1029. begin
  1030. Result := nil;
  1031. Exit;
  1032. end;
  1033. MaxValue := GetParameterDevice(FDevices[0]);
  1034. MaxValuePos := 0;
  1035. for i := 1 to FDeviceCount-1 do
  1036. begin
  1037. if GetParameterDevice(FDevices[i])>MaxValue then
  1038. begin
  1039. MaxValue := GetParameterDevice(FDevices[i]);
  1040. MaxValuePos := i;
  1041. end;
  1042. end;
  1043. Result := @FDevices[MaxValuePos];
  1044. end;
  1045. function TDCLPlatform.GetDeviceWithMaxMemAllocSize: PDCLDevice;
  1046. function GetParameterDevice(const Device: TDCLDevice): TCL_ulong;
  1047. begin
  1048. Result := Device.MaxMemAllocSize;
  1049. end;
  1050. var
  1051. i: Integer;
  1052. MaxValue: TCL_ulong;
  1053. MaxValuePos: TCL_uint;
  1054. begin
  1055. if FDeviceCount=0 then
  1056. begin
  1057. Result := nil;
  1058. Exit;
  1059. end;
  1060. MaxValue := GetParameterDevice(FDevices[0]);
  1061. MaxValuePos := 0;
  1062. for i := 1 to FDeviceCount-1 do
  1063. begin
  1064. if GetParameterDevice(FDevices[i])>MaxValue then
  1065. begin
  1066. MaxValue := GetParameterDevice(FDevices[i]);
  1067. MaxValuePos := i;
  1068. end;
  1069. end;
  1070. Result := @FDevices[MaxValuePos];
  1071. end;
  1072. function TDCLPlatform.GetDeviceWithMaxParameterSize: PDCLDevice;
  1073. function GetParameterDevice(const Device: TDCLDevice): TSize_t;
  1074. begin
  1075. Result := Device.MaxParameterSize;
  1076. end;
  1077. var
  1078. i: Integer;
  1079. MaxValue: TSize_t;
  1080. MaxValuePos: TCL_uint;
  1081. begin
  1082. if FDeviceCount=0 then
  1083. begin
  1084. Result := nil;
  1085. Exit;
  1086. end;
  1087. MaxValue := GetParameterDevice(FDevices[0]);
  1088. MaxValuePos := 0;
  1089. for i := 1 to FDeviceCount-1 do
  1090. begin
  1091. if GetParameterDevice(FDevices[i])>MaxValue then
  1092. begin
  1093. MaxValue := GetParameterDevice(FDevices[i]);
  1094. MaxValuePos := i;
  1095. end;
  1096. end;
  1097. Result := @FDevices[MaxValuePos];
  1098. end;
  1099. function TDCLPlatform.GetDeviceWithMaxReadImageArgs: PDCLDevice;
  1100. function GetParameterDevice(const Device: TDCLDevice): TCL_uint;
  1101. begin
  1102. Result := Device.MaxReadImageArgs;
  1103. end;
  1104. var
  1105. i: Integer;
  1106. MaxValue: TCL_uint;
  1107. MaxValuePos: TCL_uint;
  1108. begin
  1109. if FDeviceCount=0 then
  1110. begin
  1111. Result := nil;
  1112. Exit;
  1113. end;
  1114. MaxValue := GetParameterDevice(FDevices[0]);
  1115. MaxValuePos := 0;
  1116. for i := 1 to FDeviceCount-1 do
  1117. begin
  1118. if GetParameterDevice(FDevices[i])>MaxValue then
  1119. begin
  1120. MaxValue := GetParameterDevice(FDevices[i]);
  1121. MaxValuePos := i;
  1122. end;
  1123. end;
  1124. Result := @FDevices[MaxValuePos];
  1125. end;
  1126. function TDCLPlatform.GetDeviceWithMaxSamplers: PDCLDevice;
  1127. function GetParameterDevice(const Device: TDCLDevice): TCL_uint;
  1128. begin
  1129. Result := Device.MaxSamplers;
  1130. end;
  1131. var
  1132. i: Integer;
  1133. MaxValue: TCL_uint;
  1134. MaxValuePos: TCL_uint;
  1135. begin
  1136. if FDeviceCount=0 then
  1137. begin
  1138. Result := nil;
  1139. Exit;
  1140. end;
  1141. MaxValue := GetParameterDevice(FDevices[0]);
  1142. MaxValuePos := 0;
  1143. for i := 1 to FDeviceCount-1 do
  1144. begin
  1145. if GetParameterDevice(FDevices[i])>MaxValue then
  1146. begin
  1147. MaxValue := GetParameterDevice(FDevices[i]);
  1148. MaxValuePos := i;
  1149. end;
  1150. end;
  1151. Result := @FDevices[MaxValuePos];
  1152. end;
  1153. function TDCLPlatform.GetDeviceWithMaxWorkGroupSize: PDCLDevice;
  1154. function GetParameterDevice(const Device: TDCLDevice): TSize_t;
  1155. begin
  1156. Result := Device.MaxWorkGroupSize;
  1157. end;
  1158. var
  1159. i: Integer;
  1160. MaxValue: TSize_t;
  1161. MaxValuePos: TCL_uint;
  1162. begin
  1163. if FDeviceCount=0 then
  1164. begin
  1165. Result := nil;
  1166. Exit;
  1167. end;
  1168. MaxValue := GetParameterDevice(FDevices[0]);
  1169. MaxValuePos := 0;
  1170. for i := 1 to FDeviceCount-1 do
  1171. begin
  1172. if GetParameterDevice(FDevices[i])>MaxValue then
  1173. begin
  1174. MaxValue := GetParameterDevice(FDevices[i]);
  1175. MaxValuePos := i;
  1176. end;
  1177. end;
  1178. Result := @FDevices[MaxValuePos];
  1179. end;
  1180. function TDCLPlatform.GetDeviceWithMaxWorkItemDimensions: PDCLDevice;
  1181. function GetParameterDevice(const Device: TDCLDevice): TCL_uint;
  1182. begin
  1183. Result := Device.MaxWorkItemDimensions;
  1184. end;
  1185. var
  1186. i: Integer;
  1187. MaxValue: TCL_uint;
  1188. MaxValuePos: TCL_uint;
  1189. begin
  1190. if FDeviceCount=0 then
  1191. begin
  1192. Result := nil;
  1193. Exit;
  1194. end;
  1195. MaxValue := GetParameterDevice(FDevices[0]);
  1196. MaxValuePos := 0;
  1197. for i := 1 to FDeviceCount-1 do
  1198. begin
  1199. if GetParameterDevice(FDevices[i])>MaxValue then
  1200. begin
  1201. MaxValue := GetParameterDevice(FDevices[i]);
  1202. MaxValuePos := i;
  1203. end;
  1204. end;
  1205. Result := @FDevices[MaxValuePos];
  1206. end;
  1207. function TDCLPlatform.GetDeviceWithMaxWriteImageArgs: PDCLDevice;
  1208. function GetParameterDevice(const Device: TDCLDevice): TCL_uint;
  1209. begin
  1210. Result := Device.MaxWriteImageArgs;
  1211. end;
  1212. var
  1213. i: Integer;
  1214. MaxValue: TCL_uint;
  1215. MaxValuePos: TCL_uint;
  1216. begin
  1217. if FDeviceCount=0 then
  1218. begin
  1219. Result := nil;
  1220. Exit;
  1221. end;
  1222. MaxValue := GetParameterDevice(FDevices[0]);
  1223. MaxValuePos := 0;
  1224. for i := 1 to FDeviceCount-1 do
  1225. begin
  1226. if GetParameterDevice(FDevices[i])>MaxValue then
  1227. begin
  1228. MaxValue := GetParameterDevice(FDevices[i]);
  1229. MaxValuePos := i;
  1230. end;
  1231. end;
  1232. Result := @FDevices[MaxValuePos];
  1233. end;
  1234. function TDCLPlatform.GetExtensions(Index: TSize_t): AnsiString;
  1235. begin
  1236. if Index<FExtensionsCount then Result := FExtensions[Index]
  1237. else Result := '';
  1238. end;
  1239. function TDCLPlatform.GetGPU(Index: TCL_uint): PDCLDevice;
  1240. begin
  1241. if Index<FGPUCount then Result := @FDevices[FGPUs[Index]]
  1242. else Result := nil;
  1243. end;
  1244. function TDCLPlatform.IsPresentExtension(
  1245. const ExtensionName: AnsiString): Boolean;
  1246. var
  1247. i: Integer;
  1248. UppName: AnsiString;
  1249. begin
  1250. Result := False;
  1251. UppName := UpperCase(ExtensionName);
  1252. for i := 0 to High(FExtensions) do
  1253. begin
  1254. if FExtensions[i]=UppName then
  1255. begin
  1256. Result := True;
  1257. Break;
  1258. end;
  1259. end;
  1260. end;
  1261. { TDCLDevice }
  1262. constructor TDCLDevice.Create(Device_id: PCL_device_id);
  1263. (*
  1264. need to add
  1265. CL_DEVICE_MAX_WORK_ITEM_SIZES
  1266. CL_DEVICE_QUEUE_PROPERTIES
  1267. *)
  1268. var
  1269. Size: TSize_t;
  1270. device_type: TCL_device_type;
  1271. b_bool: TCL_bool;
  1272. fp_config: TCL_device_fp_config;
  1273. execution_capabilities: TCL_device_exec_capabilities;
  1274. global_mem_cache_type: TCL_device_mem_cache_type;
  1275. local_mem_type: TCL_device_local_mem_type;
  1276. i, current, previous: Integer;
  1277. begin
  1278. inherited Create();
  1279. FDevice_id := Device_id;
  1280. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NAME, 0, nil, @Size);
  1281. {$IFDEF LOGGING}
  1282. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1283. {$ENDIF}
  1284. SetLength(FName, Size);
  1285. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NAME, Size, @FName[1], nil);
  1286. {$IFDEF LOGGING}
  1287. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1288. {$ENDIF}
  1289. {$IFDEF LOGGING}
  1290. WriteLog('CL_DEVICE_NAME: ' + FName + ';');
  1291. {$ENDIF}
  1292. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_VENDOR, 0, nil, @Size);
  1293. {$IFDEF LOGGING}
  1294. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1295. {$ENDIF}
  1296. SetLength(FVendor, Size);
  1297. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_VENDOR, Size, @FVendor[1], nil);
  1298. {$IFDEF LOGGING}
  1299. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1300. {$ENDIF}
  1301. {$IFDEF LOGGING}
  1302. WriteLog('CL_DEVICE_VENDOR: ' + FVendor + ';');
  1303. {$ENDIF}
  1304. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_VERSION, 0, nil, @Size);
  1305. {$IFDEF LOGGING}
  1306. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1307. {$ENDIF}
  1308. SetLength(FVersion, Size);
  1309. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_VERSION, Size, @FVersion[1], nil);
  1310. {$IFDEF LOGGING}
  1311. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1312. {$ENDIF}
  1313. {$IFDEF LOGGING}
  1314. WriteLog('CL_DEVICE_VERSION: ' + FVersion + ';');
  1315. {$ENDIF}
  1316. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PROFILE, 0, nil, @Size);
  1317. {$IFDEF LOGGING}
  1318. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1319. {$ENDIF}
  1320. SetLength(FProfile, Size);
  1321. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PROFILE, Size, @FProfile[1], nil);
  1322. {$IFDEF LOGGING}
  1323. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1324. {$ENDIF}
  1325. {$IFDEF LOGGING}
  1326. WriteLog('CL_DEVICE_PROFILE: ' + FProfile + ';');
  1327. {$ENDIF}
  1328. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_TYPE, SizeOf(device_type), @device_type, nil);
  1329. {$IFDEF LOGGING}
  1330. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1331. {$ENDIF}
  1332. if (device_type and CL_DEVICE_TYPE_CPU)<>0 then
  1333. begin
  1334. FIsCPU := True;
  1335. {$IFDEF LOGGING}
  1336. WriteLog('CL_DEVICE_TYPE: CL_DEVICE_TYPE_CPU;');
  1337. {$ENDIF}
  1338. end;
  1339. if (device_type and CL_DEVICE_TYPE_GPU)<>0 then
  1340. begin
  1341. FIsGPU := True;
  1342. {$IFDEF LOGGING}
  1343. WriteLog('CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU;');
  1344. {$ENDIF}
  1345. end;
  1346. if (device_type and CL_DEVICE_TYPE_ACCELERATOR)<>0 then
  1347. begin
  1348. FIsAccelerator := True;
  1349. {$IFDEF LOGGING}
  1350. WriteLog('CL_DEVICE_TYPE: CL_DEVICE_TYPE_ACCELERATOR;');
  1351. {$ENDIF}
  1352. end;
  1353. if (device_type and CL_DEVICE_TYPE_DEFAULT)<>0 then
  1354. begin
  1355. FIsDefault := True;
  1356. {$IFDEF LOGGING}
  1357. WriteLog('CL_DEVICE_TYPE: CL_DEVICE_TYPE_DEFAULT;');
  1358. {$ENDIF}
  1359. end;
  1360. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR , SizeOf(FMaxWorkGroupSize), @FMaxWorkGroupSize, nil);
  1361. {$IFDEF LOGGING}
  1362. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1363. {$ENDIF}
  1364. {$IFDEF LOGGING}
  1365. WriteLog('CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR: ' + IntToStr(FMaxWorkGroupSize) + ';');
  1366. {$ENDIF}
  1367. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR , SizeOf(FNativeVectorPreferredChar), @FNativeVectorPreferredChar, nil);
  1368. {$IFDEF LOGGING}
  1369. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1370. {$ENDIF}
  1371. {$IFDEF LOGGING}
  1372. WriteLog('CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR: ' + IntToStr(FNativeVectorPreferredChar) + ';');
  1373. {$ENDIF}
  1374. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT , SizeOf(FNativeVectorPreferredShort), @FNativeVectorPreferredShort, nil);
  1375. {$IFDEF LOGGING}
  1376. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1377. {$ENDIF}
  1378. {$IFDEF LOGGING}
  1379. WriteLog('CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT: ' + IntToStr(FNativeVectorPreferredShort) + ';');
  1380. {$ENDIF}
  1381. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT , SizeOf(FNativeVectorPreferredInt), @FNativeVectorPreferredInt, nil);
  1382. {$IFDEF LOGGING}
  1383. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1384. {$ENDIF}
  1385. {$IFDEF LOGGING}
  1386. WriteLog('CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT: ' + IntToStr(FNativeVectorPreferredInt) + ';');
  1387. {$ENDIF}
  1388. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG , SizeOf(FNativeVectorPreferredLong), @FNativeVectorPreferredLong, nil);
  1389. {$IFDEF LOGGING}
  1390. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1391. {$ENDIF}
  1392. {$IFDEF LOGGING}
  1393. WriteLog(' CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG: ' + IntToStr(FNativeVectorPreferredLong) + ';');
  1394. {$ENDIF}
  1395. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT , SizeOf(FNativeVectorPreferredFloat), @FNativeVectorPreferredFloat, nil);
  1396. {$IFDEF LOGGING}
  1397. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1398. {$ENDIF}
  1399. {$IFDEF LOGGING}
  1400. WriteLog('CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT: ' + IntToStr(FNativeVectorPreferredFloat) + ';');
  1401. {$ENDIF}
  1402. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE , SizeOf(FNativeVectorPreferredDouble), @FNativeVectorPreferredDouble, nil);
  1403. {$IFDEF LOGGING}
  1404. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1405. {$ENDIF}
  1406. {$IFDEF LOGGING}
  1407. WriteLog('CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE: ' + IntToStr(FNativeVectorPreferredDouble) + ';');
  1408. {$ENDIF}
  1409. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF , SizeOf(FNativeVectorPreferredHalf), @FNativeVectorPreferredHalf, nil);
  1410. {$IFDEF LOGGING}
  1411. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1412. {$ENDIF}
  1413. {$IFDEF LOGGING}
  1414. WriteLog('CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF: ' + IntToStr(FNativeVectorPreferredHalf) + ';');
  1415. {$ENDIF}
  1416. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR , SizeOf(FNativeVectorWidthChar), @FNativeVectorWidthChar, nil);
  1417. {$IFDEF LOGGING}
  1418. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1419. {$ENDIF}
  1420. {$IFDEF LOGGING}
  1421. WriteLog('CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR: ' + IntToStr(FNativeVectorWidthChar) + ';');
  1422. {$ENDIF}
  1423. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT , SizeOf(FNativeVectorWidthShort), @FNativeVectorWidthShort, nil);
  1424. {$IFDEF LOGGING}
  1425. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1426. {$ENDIF}
  1427. {$IFDEF LOGGING}
  1428. WriteLog('CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT: ' + IntToStr(FNativeVectorWidthShort) + ';');
  1429. {$ENDIF}
  1430. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT , SizeOf(FNativeVectorWidthInt), @FNativeVectorWidthInt, nil);
  1431. {$IFDEF LOGGING}
  1432. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1433. {$ENDIF}
  1434. {$IFDEF LOGGING}
  1435. WriteLog('CL_DEVICE_NATIVE_VECTOR_WIDTH_INT: ' + IntToStr(FNativeVectorWidthInt) + ';');
  1436. {$ENDIF}
  1437. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG , SizeOf(FNativeVectorWidthLong), @FNativeVectorWidthLong, nil);
  1438. {$IFDEF LOGGING}
  1439. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1440. {$ENDIF}
  1441. {$IFDEF LOGGING}
  1442. WriteLog('CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG: ' + IntToStr(FNativeVectorWidthLong) + ';');
  1443. {$ENDIF}
  1444. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT , SizeOf(FNativeVectorWidthFloat), @FNativeVectorWidthFloat, nil);
  1445. {$IFDEF LOGGING}
  1446. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1447. {$ENDIF}
  1448. {$IFDEF LOGGING}
  1449. WriteLog('CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT: ' + IntToStr(FNativeVectorWidthFloat) + ';');
  1450. {$ENDIF}
  1451. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE , SizeOf(FNativeVectorWidthDouble), @FNativeVectorWidthDouble, nil);
  1452. {$IFDEF LOGGING}
  1453. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1454. {$ENDIF}
  1455. {$IFDEF LOGGING}
  1456. WriteLog('CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE: ' + IntToStr(FNativeVectorWidthDouble) + ';');
  1457. {$ENDIF}
  1458. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF , SizeOf(FNativeVectorWidthHalf), @FNativeVectorWidthHalf, nil);
  1459. {$IFDEF LOGGING}
  1460. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1461. {$ENDIF}
  1462. {$IFDEF LOGGING}
  1463. WriteLog('CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF: ' + IntToStr(FNativeVectorWidthHalf) + ';');
  1464. {$ENDIF}
  1465. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_CLOCK_FREQUENCY , SizeOf(FMaxClockFrequency), @FMaxClockFrequency, nil);
  1466. {$IFDEF LOGGING}
  1467. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1468. {$ENDIF}
  1469. {$IFDEF LOGGING}
  1470. WriteLog('CL_DEVICE_MAX_CLOCK_FREQUENCY: ' + IntToStr(FMaxClockFrequency) + ';');
  1471. {$ENDIF}
  1472. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_ADDRESS_BITS , SizeOf(FAddressBits), @FAddressBits, nil);
  1473. {$IFDEF LOGGING}
  1474. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1475. {$ENDIF}
  1476. {$IFDEF LOGGING}
  1477. WriteLog('CL_DEVICE_ADDRESS_BITS: ' + IntToStr(FAddressBits) + ';');
  1478. {$ENDIF}
  1479. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_MEM_ALLOC_SIZE , SizeOf(FMaxMemAllocSize), @FMaxMemAllocSize, nil);
  1480. {$IFDEF LOGGING}
  1481. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1482. {$ENDIF}
  1483. {$IFDEF LOGGING}
  1484. WriteLog('CL_DEVICE_MAX_MEM_ALLOC_SIZE: ' + IntToStr(FMaxMemAllocSize) + ';');
  1485. {$ENDIF}
  1486. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_IMAGE_SUPPORT , SizeOf(b_bool), @b_bool, nil);
  1487. {$IFDEF LOGGING}
  1488. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1489. {$ENDIF}
  1490. {$IFDEF LOGGING}
  1491. WriteLog('CL_DEVICE_IMAGE_SUPPORT: ' + IntToStr(b_bool) + ';');
  1492. {$ENDIF}
  1493. FIsImageSupport := Boolean(b_bool);
  1494. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_READ_IMAGE_ARGS , SizeOf(FMaxReadImageArgs), @FMaxReadImageArgs, nil);
  1495. {$IFDEF LOGGING}
  1496. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1497. {$ENDIF}
  1498. {$IFDEF LOGGING}
  1499. WriteLog('CL_DEVICE_MAX_READ_IMAGE_ARGS: ' + IntToStr(FMaxReadImageArgs) + ';');
  1500. {$ENDIF}
  1501. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_WRITE_IMAGE_ARGS , SizeOf(FMaxWriteImageArgs), @FMaxWriteImageArgs, nil);
  1502. {$IFDEF LOGGING}
  1503. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1504. {$ENDIF}
  1505. {$IFDEF LOGGING}
  1506. WriteLog('CL_DEVICE_MAX_WRITE_IMAGE_ARGS: ' + IntToStr(FMaxWriteImageArgs) + ';');
  1507. {$ENDIF}
  1508. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_IMAGE2D_MAX_WIDTH , SizeOf(FImage2DMaxWidth), @FImage2DMaxWidth, nil);
  1509. {$IFDEF LOGGING}
  1510. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1511. {$ENDIF}
  1512. {$IFDEF LOGGING}
  1513. WriteLog('CL_DEVICE_IMAGE2D_MAX_WIDTH: ' + IntToStr(FImage2DMaxWidth) + ';');
  1514. {$ENDIF}
  1515. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_IMAGE2D_MAX_HEIGHT , SizeOf(FImage2DMaxHeight), @FImage2DMaxHeight, nil);
  1516. {$IFDEF LOGGING}
  1517. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1518. {$ENDIF}
  1519. {$IFDEF LOGGING}
  1520. WriteLog('CL_DEVICE_IMAGE2D_MAX_HEIGHT: ' + IntToStr(FImage2DMaxHeight) + ';');
  1521. {$ENDIF}
  1522. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_IMAGE3D_MAX_WIDTH , SizeOf(FImage3DMaxWidth), @FImage3DMaxWidth, nil);
  1523. {$IFDEF LOGGING}
  1524. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1525. {$ENDIF}
  1526. {$IFDEF LOGGING}
  1527. WriteLog('CL_DEVICE_IMAGE3D_MAX_WIDTH: ' + IntToStr(FImage3DMaxWidth) + ';');
  1528. {$ENDIF}
  1529. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_IMAGE3D_MAX_HEIGHT , SizeOf(FImage3DMaxHeight), @FImage3DMaxHeight, nil);
  1530. {$IFDEF LOGGING}
  1531. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1532. {$ENDIF}
  1533. {$IFDEF LOGGING}
  1534. WriteLog('CL_DEVICE_IMAGE3D_MAX_HEIGHT: ' + IntToStr(FImage3DMaxHeight) + ';');
  1535. {$ENDIF}
  1536. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_IMAGE3D_MAX_DEPTH , SizeOf(FImage3DMaxDepth), @FImage3DMaxDepth, nil);
  1537. {$IFDEF LOGGING}
  1538. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1539. {$ENDIF}
  1540. {$IFDEF LOGGING}
  1541. WriteLog('CL_DEVICE_IMAGE3D_MAX_DEPTH: ' + IntToStr(FImage3DMaxDepth) + ';');
  1542. {$ENDIF}
  1543. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_SAMPLERS , SizeOf(FMaxSamplers), @FMaxSamplers, nil);
  1544. {$IFDEF LOGGING}
  1545. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1546. {$ENDIF}
  1547. {$IFDEF LOGGING}
  1548. WriteLog('CL_DEVICE_MAX_SAMPLERS: ' + IntToStr(FMaxSamplers) + ';');
  1549. {$ENDIF}
  1550. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_PARAMETER_SIZE , SizeOf(FMaxParameterSize), @FMaxParameterSize, nil);
  1551. {$IFDEF LOGGING}
  1552. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1553. {$ENDIF}
  1554. {$IFDEF LOGGING}
  1555. WriteLog('CL_DEVICE_MAX_PARAMETER_SIZE: ' + IntToStr(FMaxParameterSize) + ';');
  1556. {$ENDIF}
  1557. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MEM_BASE_ADDR_ALIGN , SizeOf(FMemBaseAddrAlign), @FMemBaseAddrAlign, nil);
  1558. {$IFDEF LOGGING}
  1559. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1560. {$ENDIF}
  1561. {$IFDEF LOGGING}
  1562. WriteLog('CL_DEVICE_MEM_BASE_ADDR_ALIGN: ' + IntToStr(FMemBaseAddrAlign) + ';');
  1563. {$ENDIF}
  1564. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE , SizeOf(FMinDataTypeAlignSize), @FMinDataTypeAlignSize, nil);
  1565. {$IFDEF LOGGING}
  1566. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1567. {$ENDIF}
  1568. {$IFDEF LOGGING}
  1569. WriteLog('CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE: ' + IntToStr(FMinDataTypeAlignSize) + ';');
  1570. {$ENDIF}
  1571. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE , SizeOf(FGlobalMemCacheLineSize), @FGlobalMemCacheLineSize, nil);
  1572. {$IFDEF LOGGING}
  1573. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1574. {$ENDIF}
  1575. {$IFDEF LOGGING}
  1576. WriteLog('CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: ' + IntToStr(FGlobalMemCacheLineSize) + ';');
  1577. {$ENDIF}
  1578. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE , SizeOf(FGlobalMemCacheSize), @FGlobalMemCacheSize, nil);
  1579. {$IFDEF LOGGING}
  1580. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1581. {$ENDIF}
  1582. {$IFDEF LOGGING}
  1583. WriteLog('CL_DEVICE_GLOBAL_MEM_CACHE_SIZE: ' + IntToStr(FGlobalMemCacheSize) + ';');
  1584. {$ENDIF}
  1585. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_GLOBAL_MEM_SIZE , SizeOf(FGlobalMemSize), @FGlobalMemSize, nil);
  1586. {$IFDEF LOGGING}
  1587. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1588. {$ENDIF}
  1589. {$IFDEF LOGGING}
  1590. WriteLog('CL_DEVICE_GLOBAL_MEM_SIZE: ' + IntToStr(FGlobalMemSize) + ';');
  1591. {$ENDIF}
  1592. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE , SizeOf(FMaxConstantBufferSize), @FMaxConstantBufferSize, nil);
  1593. {$IFDEF LOGGING}
  1594. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1595. {$ENDIF}
  1596. {$IFDEF LOGGING}
  1597. WriteLog('CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: ' + IntToStr(FMaxConstantBufferSize) + ';');
  1598. {$ENDIF}
  1599. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_CONSTANT_ARGS , SizeOf(FMaxConstantArgs), @FMaxConstantArgs, nil);
  1600. {$IFDEF LOGGING}
  1601. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1602. {$ENDIF}
  1603. {$IFDEF LOGGING}
  1604. WriteLog('CL_DEVICE_MAX_CONSTANT_ARGS: ' + IntToStr(FMaxConstantArgs) + ';');
  1605. {$ENDIF}
  1606. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_LOCAL_MEM_SIZE , SizeOf(FLocalMemSize), @FLocalMemSize, nil);
  1607. {$IFDEF LOGGING}
  1608. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1609. {$ENDIF}
  1610. {$IFDEF LOGGING}
  1611. WriteLog('CL_DEVICE_LOCAL_MEM_SIZE: ' + IntToStr(FLocalMemSize) + ';');
  1612. {$ENDIF}
  1613. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_ERROR_CORRECTION_SUPPORT , SizeOf(b_bool), @b_bool, nil);
  1614. {$IFDEF LOGGING}
  1615. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1616. {$ENDIF}
  1617. {$IFDEF LOGGING}
  1618. WriteLog('CL_DEVICE_ERROR_CORRECTION_SUPPORT: ' + IntToStr(b_bool) + ';');
  1619. {$ENDIF}
  1620. FIsErrorCorrectionSupport := Boolean(b_bool);
  1621. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_HOST_UNIFIED_MEMORY , SizeOf(b_bool), @b_bool, nil);
  1622. {$IFDEF LOGGING}
  1623. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1624. {$ENDIF}
  1625. {$IFDEF LOGGING}
  1626. WriteLog('CL_DEVICE_HOST_UNIFIED_MEMORY: ' + IntToStr(b_bool) + ';');
  1627. {$ENDIF}
  1628. FIsHostUnifiedMemory := Boolean(b_bool);
  1629. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_PROFILING_TIMER_RESOLUTION , SizeOf(FProfilingTimerResolution), @FProfilingTimerResolution, nil);
  1630. {$IFDEF LOGGING}
  1631. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1632. {$ENDIF}
  1633. {$IFDEF LOGGING}
  1634. WriteLog('CL_DEVICE_PROFILING_TIMER_RESOLUTION: ' + IntToStr(FProfilingTimerResolution) + ';');
  1635. {$ENDIF}
  1636. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_ENDIAN_LITTLE , SizeOf(b_bool), @b_bool, nil);
  1637. {$IFDEF LOGGING}
  1638. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1639. {$ENDIF}
  1640. {$IFDEF LOGGING}
  1641. WriteLog('CL_DEVICE_ENDIAN_LITTLE: ' + IntToStr(b_bool) + ';');
  1642. {$ENDIF}
  1643. FIsEndianLittle := Boolean(b_bool);
  1644. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_AVAILABLE , SizeOf(b_bool), @b_bool, nil);
  1645. {$IFDEF LOGGING}
  1646. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1647. {$ENDIF}
  1648. {$IFDEF LOGGING}
  1649. WriteLog('CL_DEVICE_AVAILABLE: ' + IntToStr(b_bool) + ';');
  1650. {$ENDIF}
  1651. FIsAvailable := Boolean(b_bool);
  1652. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_COMPILER_AVAILABLE , SizeOf(b_bool), @b_bool, nil);
  1653. {$IFDEF LOGGING}
  1654. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1655. {$ENDIF}
  1656. {$IFDEF LOGGING}
  1657. WriteLog('CL_DEVICE_COMPILER_AVAILABLE: ' + IntToStr(b_bool) + ';');
  1658. {$ENDIF}
  1659. FIsCompilerAvailable := Boolean(b_bool);
  1660. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_VENDOR_ID , SizeOf(FVendorId), @FVendorId, nil);
  1661. {$IFDEF LOGGING}
  1662. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1663. {$ENDIF}
  1664. {$IFDEF LOGGING}
  1665. WriteLog('CL_DEVICE_VENDOR_ID: ' + IntToStr(FVendorId) + ';');
  1666. {$ENDIF}
  1667. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_COMPUTE_UNITS , SizeOf(FMaxComputeUnits), @FMaxComputeUnits, nil);
  1668. {$IFDEF LOGGING}
  1669. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1670. {$ENDIF}
  1671. {$IFDEF LOGGING}
  1672. WriteLog('CL_DEVICE_MAX_COMPUTE_UNITS: ' + IntToStr(FMaxComputeUnits) + ';');
  1673. {$ENDIF}
  1674. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS , SizeOf(FMaxWorkItemDimensions), @FMaxWorkItemDimensions, nil);
  1675. {$IFDEF LOGGING}
  1676. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1677. {$ENDIF}
  1678. {$IFDEF LOGGING}
  1679. WriteLog('CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: ' + IntToStr(FMaxWorkItemDimensions) + ';');
  1680. {$ENDIF}
  1681. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_EXTENSIONS, 0, nil, @Size);
  1682. {$IFDEF LOGGING}
  1683. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1684. {$ENDIF}
  1685. {$IFDEF LOGGING}
  1686. WriteLog('CL_DEVICE_EXTENSIONS: ' + IntToStr(Size) + ';');
  1687. {$ENDIF}
  1688. SetLength(FExtensionsString, Size);
  1689. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_EXTENSIONS, Size, @FExtensionsString[1], nil);
  1690. {$IFDEF LOGGING}
  1691. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1692. {$ENDIF}
  1693. {$IFDEF LOGGING}
  1694. WriteLog('CL_DEVICE_EXTENSIONS: ' + FExtensionsString + ';');
  1695. {$ENDIF}
  1696. FExtensionsCount := 0;
  1697. i := 1;
  1698. while (i<=Length(FExtensionsString)) do
  1699. begin
  1700. if ((FExtensionsString[i]=' ') or (FExtensionsString[i]=#0)) then
  1701. begin
  1702. if (i>1) then
  1703. begin
  1704. if ((FExtensionsString[i-1]<>' ') and (FExtensionsString[i-1]<>#0))then
  1705. begin
  1706. Inc(FExtensionsCount);
  1707. end;
  1708. end
  1709. else Inc(FExtensionsCount);
  1710. end;
  1711. inc(i);
  1712. end;
  1713. SetLength(FExtensions, FExtensionsCount);
  1714. previous := 1;
  1715. current := 1;
  1716. i := 0;
  1717. while (current<=Length(FExtensionsString)) do
  1718. begin
  1719. if ((FExtensionsString[current]=AnsiString(' ')) or (FExtensionsString[current]=#0)) then
  1720. begin
  1721. if (current>previous) then FExtensions[i] := UpperCase( Copy(FExtensionsString, previous, current-previous-1));
  1722. previous := current + 1;
  1723. inc(i);
  1724. end;
  1725. inc(current);
  1726. end;
  1727. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_OPENCL_C_VERSION, 0, nil, @Size);
  1728. {$IFDEF LOGGING}
  1729. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1730. {$ENDIF}
  1731. SetLength(FOpenCLCVersion, Size);
  1732. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_OPENCL_C_VERSION, Size, @FOpenCLCVersion[1], nil);
  1733. {$IFDEF LOGGING}
  1734. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1735. {$ENDIF}
  1736. {$IFDEF LOGGING}
  1737. WriteLog('CL_DEVICE_OPENCL_C_VERSION: ' + FOpenCLCVersion + ';');
  1738. {$ENDIF}
  1739. FStatus := clGetDeviceInfo(FDevice_id, CL_DRIVER_VERSION, 0, nil, @Size);
  1740. {$IFDEF LOGGING}
  1741. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1742. {$ENDIF}
  1743. SetLength(FDriverVersion, Size);
  1744. FStatus := clGetDeviceInfo(FDevice_id, CL_DRIVER_VERSION, Size, @FDriverVersion[1], nil);
  1745. {$IFDEF LOGGING}
  1746. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1747. {$ENDIF}
  1748. {$IFDEF LOGGING}
  1749. WriteLog('CL_DRIVER_VERSION: ' + FDriverVersion + ';');
  1750. {$ENDIF}
  1751. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_SINGLE_FP_CONFIG, SizeOf(fp_config), @fp_config, nil);
  1752. {$IFDEF LOGGING}
  1753. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1754. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: ' + IntToStr(fp_config) + ';');
  1755. {$ENDIF}
  1756. FFPConfigSet := [];
  1757. {$IFDEF CL_VERSION_1_0}
  1758. if (fp_config and CL_FP_DENORM)<>0 then
  1759. begin
  1760. FFPConfigSet := FFPConfigSet + [dfpcDenorm];
  1761. {$IFDEF LOGGING}
  1762. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_DENORM;');
  1763. {$ENDIF}
  1764. end;
  1765. if (fp_config and CL_FP_INF_NAN)<>0 then
  1766. begin
  1767. FFPConfigSet := FFPConfigSet + [dfpcInfNan];
  1768. {$IFDEF LOGGING}
  1769. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_INF_NAN;');
  1770. {$ENDIF}
  1771. end;
  1772. if (fp_config and CL_FP_ROUND_TO_NEAREST)<>0 then
  1773. begin
  1774. FFPConfigSet := FFPConfigSet + [dfpcRoundToNearest];
  1775. {$IFDEF LOGGING}
  1776. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_ROUND_TO_NEAREST;');
  1777. {$ENDIF}
  1778. end;
  1779. if (fp_config and CL_FP_ROUND_TO_ZERO)<>0 then
  1780. begin
  1781. FFPConfigSet := FFPConfigSet + [dfpcRoundToZero];
  1782. {$IFDEF LOGGING}
  1783. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_ROUND_TO_ZERO;');
  1784. {$ENDIF}
  1785. end;
  1786. if (fp_config and CL_FP_ROUND_TO_INF)<>0 then
  1787. begin
  1788. FFPConfigSet := FFPConfigSet + [dfpcRoundToInf];
  1789. {$IFDEF LOGGING}
  1790. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_ROUND_TO_INF;');
  1791. {$ENDIF}
  1792. end;
  1793. if (fp_config and CL_FP_FMA)<>0 then
  1794. begin
  1795. FFPConfigSet := FFPConfigSet + [dfpcFMA];
  1796. {$IFDEF LOGGING}
  1797. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_FMA;');
  1798. {$ENDIF}
  1799. end;
  1800. {$ENDIF}
  1801. {$IFDEF CL_VERSION_1_1}
  1802. if (fp_config and CL_FP_SOFT_FLOAT)<>0 then
  1803. begin
  1804. FFPConfigSet := FFPConfigSet + [dfpcSoftFloat];
  1805. {$IFDEF LOGGING}
  1806. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_SOFT_FLOAT;');
  1807. {$ENDIF}
  1808. end;
  1809. {$ENDIF}
  1810. {$IFDEF CL_VERSION_1_2}
  1811. if (fp_config and CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT)<>0 then
  1812. begin
  1813. FFPConfigSet := FFPConfigSet + [dfpcCorrectlyRoundedDivideSqrt];
  1814. {$IFDEF LOGGING}
  1815. WriteLog('CL_DEVICE_SINGLE_FP_CONFIG: CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT;');
  1816. {$ENDIF}
  1817. end;
  1818. {$ENDIF}
  1819. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_EXECUTION_CAPABILITIES, SizeOf(execution_capabilities), @execution_capabilities, nil);
  1820. {$IFDEF LOGGING}
  1821. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1822. WriteLog('CL_DEVICE_EXECUTION_CAPABILITIES: ' + IntToStr(execution_capabilities) + ';');
  1823. {$ENDIF}
  1824. FExecutionCapabilities := [];
  1825. {$IFDEF CL_VERSION_1_0}
  1826. if (execution_capabilities and CL_EXEC_KERNEL)<>0 then
  1827. begin
  1828. FExecutionCapabilities := FExecutionCapabilities + [decExecKernel];
  1829. {$IFDEF LOGGING}
  1830. WriteLog('CL_DEVICE_EXECUTION_CAPABILITIES: CL_EXEC_KERNEL;');
  1831. {$ENDIF}
  1832. end;
  1833. if (execution_capabilities and CL_EXEC_NATIVE_KERNEL)<>0 then
  1834. begin
  1835. FExecutionCapabilities := FExecutionCapabilities + [decExecNativeKernel];
  1836. {$IFDEF LOGGING}
  1837. WriteLog('CL_DEVICE_EXECUTION_CAPABILITIES: CL_EXEC_NATIVE_KERNEL;');
  1838. {$ENDIF}
  1839. end;
  1840. {$ENDIF}
  1841. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, SizeOf(global_mem_cache_type), @global_mem_cache_type, nil);
  1842. {$IFDEF LOGGING}
  1843. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1844. WriteLog('CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: ' + IntToStr(global_mem_cache_type) + ';');
  1845. {$ENDIF}
  1846. {$IFDEF CL_VERSION_1_0}
  1847. if (global_mem_cache_type and CL_NONE)<>0 then
  1848. begin
  1849. FGlobalMemCacheType := dmctNone;
  1850. {$IFDEF LOGGING}
  1851. WriteLog('CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_NONE;');
  1852. {$ENDIF}
  1853. end;
  1854. if (global_mem_cache_type and CL_READ_ONLY_CACHE)<>0 then
  1855. begin
  1856. FGlobalMemCacheType := dmctReadOnlyCache;
  1857. {$IFDEF LOGGING}
  1858. WriteLog('CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_READ_ONLY_CACHE;');
  1859. {$ENDIF}
  1860. end;
  1861. if (global_mem_cache_type and CL_READ_WRITE_CACHE)<>0 then
  1862. begin
  1863. FGlobalMemCacheType := dmctWriteOnlyCache;
  1864. {$IFDEF LOGGING}
  1865. WriteLog('CL_DEVICE_GLOBAL_MEM_CACHE_TYPE: CL_READ_WRITE_CACHE;');
  1866. {$ENDIF}
  1867. end;
  1868. {$ENDIF}
  1869. FStatus := clGetDeviceInfo(FDevice_id, CL_DEVICE_LOCAL_MEM_TYPE, SizeOf(local_mem_type), @local_mem_type, nil);
  1870. {$IFDEF LOGGING}
  1871. WriteLog('clGetDeviceInfo: ' + GetString(FStatus) + ';');
  1872. WriteLog('CL_DEVICE_LOCAL_MEM_TYPE: ' + IntToStr(local_mem_type) + ';');
  1873. {$ENDIF}
  1874. {$IFDEF CL_VERSION_1_0}
  1875. if (local_mem_type and CL_LOCAL)<>0 then
  1876. begin
  1877. FLocalMemType := dlmtLocal;
  1878. {$IFDEF LOGGING}
  1879. WriteLog('CL_DEVICE_LOCAL_MEM_TYPE: CL_LOCAL;');
  1880. {$ENDIF}
  1881. end;
  1882. if (local_mem_type and CL_GLOBAL)<>0 then
  1883. begin
  1884. FLocalMemType := dlmtGlobal;
  1885. {$IFDEF LOGGING}
  1886. WriteLog('CL_DEVICE_LOCAL_MEM_TYPE: CL_GLOBAL;');
  1887. {$ENDIF}
  1888. end;
  1889. {$ENDIF}
  1890. FContext := TDCLContext.Create(FDevice_id);
  1891. end;
  1892. function TDCLDevice.CreateBuffer(const Size: TSize_t; const Data: Pointer; const flags: TDCLMemFlagsSet): TDCLBuffer;
  1893. begin
  1894. Result := TDCLBuffer.Create(Context.FContext, flags, Size, Data);
  1895. end;
  1896. function TDCLDevice.CreateCommandQueue(
  1897. const properties: TDCLCommandQueuePropertiesSet): TDCLCommandQueue;
  1898. begin
  1899. Result := TDCLCommandQueue.Create(Device_id, Context.FContext, properties);
  1900. end;
  1901. function TDCLDevice.CreateCommandQueue(const Context: TDCLContext;
  1902. const properties: TDCLCommandQueuePropertiesSet): TDCLCommandQueue;
  1903. begin
  1904. Result := TDCLCommandQueue.Create(Device_id, Context.FContext, properties);
  1905. end;
  1906. function TDCLDevice.CreateContext: TDCLContext;
  1907. begin
  1908. Result := TDCLContext.Create(FDevice_id);
  1909. end;
  1910. function TDCLDevice.CreateContextGL: TDCLContext;
  1911. begin
  1912. Result := TDCLContext.CreateGL(FDevice_id);
  1913. end;
  1914. function TDCLDevice.CreateProgram(const Source: PPAnsiChar;
  1915. const Options: PAnsiChar): TDCLProgram;
  1916. begin
  1917. Result := TDCLProgram.Create(FDevice_id, FContext.FContext, Source, Options);
  1918. end;
  1919. function TDCLDevice.CreateImage2D(const Format: PCL_image_format; const Width, Height, RowPitch: TSize_t;
  1920. const Data: Pointer; const flags: TDCLMemFlagsSet): TDCLImage2D;
  1921. begin
  1922. Result := TDCLImage2D.Create(Context.FContext, flags, Format, Width, Height, RowPitch, Data);
  1923. end;
  1924. function TDCLDevice.CreateFromGLImage2D(const Texture: TGLuint;
  1925. const Flags: TDCLMemFlagsSet): TDCLImage2D;
  1926. begin
  1927. Result := TDCLImage2D.CreateFromGL(Context.FContext, Flags, Texture);
  1928. end;
  1929. function TDCLDevice.CreateProgram(const FileName: String;
  1930. const Options: PAnsiChar): TDCLProgram;
  1931. var
  1932. F: TextFile;
  1933. Source: AnsiString;
  1934. buf: AnsiString;
  1935. begin
  1936. AssignFile(F, FileName);
  1937. Reset(F);
  1938. Source := '';
  1939. while not(EOF(F))do
  1940. begin
  1941. Readln(F, buf);
  1942. Source := Source + buf + #10 + #13;
  1943. end;
  1944. CloseFile(F);
  1945. Result := CreateProgram(@PAnsiString(Source), Options);
  1946. end;
  1947. destructor TDCLDevice.Destroy;
  1948. begin
  1949. FreeAndNil(FContext);
  1950. SetLength(FExtensions, 0);
  1951. FExtensionsString := '';
  1952. FOpenCLCVersion := '';
  1953. FDriverVersion := '';
  1954. FName := '';
  1955. FVendor := '';
  1956. FVersion := '';
  1957. FProfile := '';
  1958. inherited;
  1959. end;
  1960. function TDCLDevice.GetExtensions(const Index: TSize_t): AnsiString;
  1961. begin
  1962. if Index<FExtensionsCount then Result := FExtensions[Index]
  1963. else Result := '';
  1964. end;
  1965. function TDCLDevice.IsPresentExtension(
  1966. const ExtensionName: AnsiString): Boolean;
  1967. var
  1968. i: Integer;
  1969. UppName: AnsiString;
  1970. begin
  1971. Result := False;
  1972. UppName := UpperCase(ExtensionName);
  1973. for i := 0 to High(FExtensions) do
  1974. begin
  1975. if FExtensions[i]=UppName then
  1976. begin
  1977. Result := True;
  1978. Break;
  1979. end;
  1980. end;
  1981. end;
  1982. function TDCLDevice.IsPresentInFPConfig(
  1983. const FPConfig: TDCLDeviceFPConfig): Boolean;
  1984. begin
  1985. Result := FPConfig in FFPConfigSet;
  1986. end;
  1987. function TDCLDevice.CreateFromGLBuffer(const Data: Pointer;
  1988. const flags: TDCLMemFlagsSet): TDCLBuffer;
  1989. begin
  1990. Result := TDCLBuffer.CreateFromGL(Context.FContext, flags, Data);
  1991. end;
  1992. { TDCLContext }
  1993. constructor TDCLContext.Create(Device_id: PCL_device_id);
  1994. (*
  1995. CL_CONTEXT_REFERENCE_COUNT
  1996. CL_CONTEXT_DEVICES
  1997. CL_CONTEXT_PROPERTIES
  1998. *)
  1999. begin
  2000. inherited Create();
  2001. FContext := clCreateContext(nil, 1, @Device_id, nil, nil, @FStatus);
  2002. {$IFDEF LOGGING}
  2003. WriteLog('clCreateContext: ' + GetString(FStatus) + ';');
  2004. {$ENDIF}
  2005. FStatus := clGetContextInfo(FContext, CL_CONTEXT_NUM_DEVICES , SizeOf(FNumDevices), @FNumDevices, nil);
  2006. {$IFDEF LOGGING}
  2007. WriteLog('clGetContextInfo: ' + GetString(FStatus) + ';');
  2008. {$ENDIF}
  2009. {$IFDEF LOGGING}
  2010. WriteLog('CL_CONTEXT_NUM_DEVICES: ' + IntToStr(FNumDevices) + ';');
  2011. {$ENDIF}
  2012. end;
  2013. constructor TDCLContext.CreateGL(Device_id: PCL_device_id);
  2014. var
  2015. props: array [0..4] of TCL_uint;
  2016. begin
  2017. inherited Create();
  2018. props[0] := CL_GL_CONTEXT_KHR;
  2019. //MacOsX not yet (Andoid hm....)
  2020. //MacOSX, Linux, Windows: http://www.dyn-lab.com/articles/cl-gl.html
  2021. {$IFDEF WINDOWS}
  2022. props[1] := wglGetCurrentContext();//glXGetCurrentContext(),
  2023. props[2] := CL_WGL_HDC_KHR;
  2024. props[3] := wglGetCurrentDC();//glXGetCurrentDisplay(),
  2025. {$ENDIF}
  2026. {$IFDEF LINUX}
  2027. props[1] := glXGetCurrentContext();
  2028. props[2] := CL_GLX_DISPLAY_KHR;
  2029. props[3] := glXGetCurrentDisplay();
  2030. {$ENDIF}
  2031. props[4] := 0;
  2032. FContext := clCreateContext(@props[0], 1, @Device_id, nil, nil, @FStatus);
  2033. {$IFDEF LOGGING}
  2034. WriteLog('clCreateContext: ' + GetString(FStatus) + ';');
  2035. {$ENDIF}
  2036. FStatus := clGetContextInfo(FContext, CL_CONTEXT_NUM_DEVICES , SizeOf(FNumDevices), @FNumDevices, nil);
  2037. {$IFDEF LOGGING}
  2038. WriteLog('clGetContextInfo: ' + GetString(FStatus) + ';');
  2039. {$ENDIF}
  2040. {$IFDEF LOGGING}
  2041. WriteLog('CL_CONTEXT_NUM_DEVICES: ' + IntToStr(FNumDevices) + ';');
  2042. {$ENDIF}
  2043. end;
  2044. destructor TDCLContext.Destroy;
  2045. begin
  2046. FStatus := clReleaseContext(FContext);
  2047. {$IFDEF LOGGING}
  2048. WriteLog('clReleaseContext: ' + GetString(FStatus) + ';');
  2049. {$ENDIF}
  2050. inherited;
  2051. end;
  2052. { TDCLQueue }
  2053. constructor TDCLCommandQueue.Create(const Device_Id: PCL_device_id; const Context: PCL_context;
  2054. const properties: TDCLCommandQueuePropertiesSet);
  2055. var
  2056. props: TCL_command_queue_properties;
  2057. begin
  2058. props := 0;
  2059. if cqpOutOfOrderExecModeEnable in properties then
  2060. props := props or CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE;
  2061. {$IFDEF PROFILING}
  2062. props := props or CL_QUEUE_PROFILING_ENABLE;
  2063. {$ENDIF}
  2064. FCommandQueue := clCreateCommandQueue(Context, Device_Id, props, @FStatus);
  2065. {$IFDEF LOGGING}
  2066. WriteLog('clCreateCommandQueue: ' + GetString(FStatus) + ';');
  2067. {$ENDIF}
  2068. FProperties := Properties;
  2069. end;
  2070. { TDCLBuffer }
  2071. constructor TDCLBuffer.Create(const Context: PCL_context;
  2072. const flags: TDCLMemFlagsSet; const Size: TSize_t; const Data: Pointer=nil);
  2073. var
  2074. fgs: TCL_mem_flags;
  2075. begin
  2076. inherited Create();
  2077. fgs := 0;
  2078. if mfReadWrite in flags then fgs := fgs or CL_MEM_READ_WRITE;
  2079. if mfWriteOnly in flags then fgs := fgs or CL_MEM_WRITE_ONLY;
  2080. if mfReadOnly in flags then fgs := fgs or CL_MEM_READ_ONLY;
  2081. if mfUseHostPtr in flags then fgs := fgs or CL_MEM_USE_HOST_PTR;
  2082. if mfAllocHostPtr in flags then fgs := fgs or CL_MEM_ALLOC_HOST_PTR;
  2083. if mfCopyHostPtr in flags then fgs := fgs or CL_MEM_COPY_HOST_PTR;
  2084. FMem := clCreateBuffer(Context, fgs, Size, Data, @FStatus);
  2085. {$IFDEF LOGGING}
  2086. WriteLog('clCreateBuffer: ' + GetString(FStatus) + ';');
  2087. {$ENDIF}
  2088. FSize := Size;
  2089. end;
  2090. constructor TDCLBuffer.CreateFromGL(const Context: PCL_context;
  2091. const Flags: TDCLMemFlagsSet; const Data: Pointer);
  2092. var
  2093. fgs: TCL_mem_flags;
  2094. begin
  2095. inherited Create();
  2096. fgs := 0;
  2097. if mfReadWrite in flags then fgs := fgs or CL_MEM_READ_WRITE;
  2098. if mfWriteOnly in flags then fgs := fgs or CL_MEM_WRITE_ONLY;
  2099. if mfReadOnly in flags then fgs := fgs or CL_MEM_READ_ONLY;
  2100. if mfUseHostPtr in flags then fgs := fgs or CL_MEM_USE_HOST_PTR;
  2101. if mfAllocHostPtr in flags then fgs := fgs or CL_MEM_ALLOC_HOST_PTR;
  2102. if mfCopyHostPtr in flags then fgs := fgs or CL_MEM_COPY_HOST_PTR;
  2103. FMem := clCreateFromGLBuffer(Context, fgs, PGLUint(Data)^, @FStatus);
  2104. {$IFDEF LOGGING}
  2105. WriteLog('clCreateFromGLBuffer: ' + GetString(FStatus) + ';');
  2106. {$ENDIF}
  2107. FSize := Size;
  2108. end;
  2109. destructor TDCLBuffer.Destroy;
  2110. begin
  2111. FStatus := clReleaseMemObject(FMem);
  2112. inherited;
  2113. end;
  2114. procedure TDCLCommandQueue.Execute(const Kernel: TDCLKernel;
  2115. const Size: TSize_t);
  2116. {$IFDEF PROFILING}
  2117. var
  2118. TimingEvent: PCL_event;
  2119. StartTime,
  2120. EndTime: TCL_ulong;
  2121. {$ENDIF}
  2122. begin
  2123. FStatus := clEnqueueNDRangeKernel(FCommandQueue, Kernel.FKernel, 1, nil, @Size, nil, 0, nil, {$IFDEF PROFILING}@TimingEvent{$ELSE}nil{$ENDIF});
  2124. {$IFDEF LOGGING}
  2125. WriteLog('clEnqueueNDRangeKernel: ' + GetString(FStatus) + ';');
  2126. {$ENDIF}
  2127. FStatus := clFinish(FCommandQueue);
  2128. {$IFDEF LOGGING}
  2129. WriteLog('clFinish: ' + GetString(FStatus) + ';');
  2130. {$ENDIF}
  2131. {$IFDEF PROFILING}
  2132. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_START, SizeOf(StartTime), @StartTime, nil);
  2133. {$IFDEF LOGGING}
  2134. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2135. {$ENDIF}
  2136. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_END, SizeOf(EndTime), @EndTime, nil);
  2137. {$IFDEF LOGGING}
  2138. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2139. {$ENDIF}
  2140. FExecuteTime := EndTime-StartTime;
  2141. {$IFDEF LOGGING}
  2142. WriteLog('EnqueueNDRangeKernel time: ' + IntToStr(FExecuteTime) + ' ns;');
  2143. {$ENDIF}
  2144. {$ENDIF}
  2145. end;
  2146. procedure TDCLCommandQueue.Execute(const Kernel: TDCLKernel; //const Device: PCL_device_id;
  2147. const Size: array of TSize_t);
  2148. {$IFDEF PROFILING}
  2149. var
  2150. TimingEvent: PCL_event;
  2151. StartTime,
  2152. EndTime: TCL_ulong;
  2153. {$ENDIF}
  2154. begin
  2155. {$IFDEF LOGGING}
  2156. WriteLog('clGetKernelWorkGroupInfo: ' + GetString(FStatus) + ';');
  2157. {$ENDIF}
  2158. FStatus := clEnqueueNDRangeKernel(FCommandQueue, Kernel.FKernel, Length(Size), nil, @Size[0], nil, 0, nil, {$IFDEF PROFILING}@TimingEvent{$ELSE}nil{$ENDIF});
  2159. {$IFDEF LOGGING}
  2160. WriteLog('clEnqueueNDRangeKernel: ' + GetString(FStatus) + ';');
  2161. {$ENDIF}
  2162. FStatus := clFinish(FCommandQueue);
  2163. {$IFDEF LOGGING}
  2164. WriteLog('clFinish: ' + GetString(FStatus) + ';');
  2165. {$ENDIF}
  2166. {$IFDEF PROFILING}
  2167. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_START, SizeOf(StartTime), @StartTime, nil);
  2168. {$IFDEF LOGGING}
  2169. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2170. {$ENDIF}
  2171. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_END, SizeOf(EndTime), @EndTime, nil);
  2172. {$IFDEF LOGGING}
  2173. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2174. {$ENDIF}
  2175. FExecuteTime := EndTime-StartTime;
  2176. {$IFDEF LOGGING}
  2177. WriteLog('EnqueueNDRangeKernel time: ' + IntToStr(FExecuteTime) + ' ns;');
  2178. {$ENDIF}
  2179. {$ENDIF}
  2180. end;
  2181. destructor TDCLCommandQueue.Destroy;
  2182. begin
  2183. FStatus := clReleaseCommandQueue(FCommandQueue);
  2184. {$IFDEF LOGGING}
  2185. WriteLog('clReleaseCommandQueue: ' + GetString(FStatus) + ';');
  2186. {$ENDIF}
  2187. inherited;
  2188. end;
  2189. { TDCLProgram }
  2190. constructor TDCLProgram.Create(const Device: PCL_device_id;
  2191. const Context: PCL_context;
  2192. const Source: PPAnsiChar; const Options: PAnsiChar);
  2193. var
  2194. Size: TSize_t;
  2195. begin
  2196. FProgram := clCreateProgramWithSource(Context, 1, Source, nil, @FStatus);
  2197. {$IFDEF LOGGING}
  2198. WriteLog('clCreateProgramWithSource: ' + GetString(FStatus) + ';');
  2199. {$ENDIF}
  2200. // exit; //XXXXXXXXXXXXXXX
  2201. FStatus := clBuildProgram(FProgram, 1, @Device, Options, nil, nil);
  2202. //FStatus := clBuildProgram(FProgram, 0, nil, Options, nil, nil);
  2203. {$IFDEF LOGGING}
  2204. WriteLog('clBuildProgram: ' + GetString(FStatus) + ';');
  2205. {$ENDIF}
  2206. FStatus := clGetProgramBuildInfo(FProgram, Device, CL_PROGRAM_BUILD_LOG, 0, nil, @Size);
  2207. {$IFDEF LOGGING}
  2208. WriteLog('clGetProgramBuildInfo: ' + GetString(FStatus) + ';');
  2209. {$ENDIF}
  2210. SetLength(FLog, Size);
  2211. FStatus := clGetProgramBuildInfo(FProgram, Device, CL_PROGRAM_BUILD_LOG, Size, @FLog[1], nil);
  2212. {$IFDEF LOGGING}
  2213. WriteLog('clGetProgramBuildInfo: ' + GetString(FStatus) + ';');
  2214. WriteLog('FLog: ' + FLog + ';');
  2215. {$ENDIF}
  2216. FStatus := clGetProgramInfo(FProgram, CL_PROGRAM_SOURCE, 0, nil, @Size);
  2217. {$IFDEF LOGGING}
  2218. WriteLog('clGetProgramInfo: ' + GetString(FStatus) + ';');
  2219. {$ENDIF}
  2220. FSource := GetMemory(Size);
  2221. FStatus := clGetProgramInfo(FProgram, CL_PROGRAM_SOURCE, Size, FSource, nil);
  2222. {$IFDEF LOGGING}
  2223. WriteLog('clGetProgramInfo: ' + GetString(FStatus) + ';');
  2224. {$ENDIF}
  2225. {$IFDEF LOGGING}
  2226. WriteLog('CL_PROGRAM_SOURCE: ' + AnsiString(FSource) + ';');
  2227. {$ENDIF}
  2228. FStatus := clGetProgramInfo(FProgram, CL_PROGRAM_BINARY_SIZES, SizeOf(FBinarySizes), @FBinarySizes, nil);
  2229. {$IFDEF LOGGING}
  2230. WriteLog('clGetProgramInfo: ' + GetString(FStatus) + ';');
  2231. {$ENDIF}
  2232. {$IFDEF LOGGING}
  2233. WriteLog('CL_PROGRAM_BINARY_SIZES: ' + IntToStr(FBinarySizes) + ';');
  2234. {$ENDIF}
  2235. SetLength(FBinaries, 1, FBinarySizes);
  2236. FStatus := clGetProgramInfo(FProgram, CL_PROGRAM_BINARIES, SizeOf(FBinaries), @FBinaries[0], nil);
  2237. {$IFDEF LOGGING}
  2238. WriteLog('clGetProgramInfo: ' + GetString(FStatus) + ';');
  2239. {$ENDIF}
  2240. {$IFDEF LOGGING}
  2241. WriteLog('CL_PROGRAM_BINARIES: ' + AnsiString(FBinaries[0]) + ';');
  2242. {$ENDIF}
  2243. end;
  2244. function TDCLProgram.CreateKernel(const KernelName: PAnsiChar): TDCLKernel;
  2245. begin
  2246. Result := TDCLKernel.Create(FProgram, KernelName);
  2247. end;
  2248. destructor TDCLProgram.Destroy;
  2249. begin
  2250. FStatus := clReleaseProgram(FProgram);
  2251. {$IFDEF LOGGING}
  2252. WriteLog('clReleaseProgram: ' + GetString(FStatus) + ';');
  2253. {$ENDIF}
  2254. FSource := '';
  2255. FBinarySizes := 0;
  2256. SetLength(FBinaries, 0, 0);
  2257. inherited;
  2258. end;
  2259. procedure TDCLProgram.SaveToFile(const FileName: AnsiString);
  2260. var
  2261. F: file;
  2262. begin
  2263. try
  2264. AssignFile(F, FileName);
  2265. Rewrite(F, 1);
  2266. BlockWrite(F, FBinaries[0], FBinarySizes);
  2267. finally
  2268. CloseFile(F);
  2269. end;
  2270. end;
  2271. { TDCLKernel }
  2272. constructor TDCLKernel.Create(const Program_: PCL_program;
  2273. const KernelName: PAnsiChar);
  2274. begin
  2275. FKernel := clCreateKernel(Program_, KernelName, @FStatus);
  2276. {$IFDEF LOGGING}
  2277. WriteLog('clCreateKernel: ' + GetString(FStatus) + ';');
  2278. {$ENDIF}
  2279. end;
  2280. destructor TDCLKernel.Destroy;
  2281. begin
  2282. FStatus := clReleaseKernel(FKernel);
  2283. {$IFDEF LOGGING}
  2284. WriteLog('clReleaseKernel: ' + GetString(FStatus) + ';');
  2285. {$ENDIF}
  2286. inherited;
  2287. end;
  2288. function TDCLKernel.GetFunctionName: AnsiString;
  2289. var
  2290. Size: TSize_t;
  2291. buffer: array of AnsiChar;
  2292. begin
  2293. FStatus := clGetKernelInfo(FKernel, CL_KERNEL_FUNCTION_NAME, 0, nil, @Size);
  2294. {$IFDEF LOGGING}
  2295. WriteLog('clGetKernelInfo: ' + GetString(FStatus) + ';');
  2296. {$ENDIF}
  2297. SetLength(buffer, Size);
  2298. FStatus := clGetKernelInfo(FKernel, CL_KERNEL_FUNCTION_NAME, Size, @buffer[0], nil);
  2299. {$IFDEF LOGGING}
  2300. WriteLog('clGetKernelInfo: ' + GetString(FStatus) + ';');
  2301. {$ENDIF}
  2302. {$IFDEF LOGGING}
  2303. WriteLog('CL_KERNEL_FUNCTION_NAME: ' + AnsiString(buffer) + ';');
  2304. {$ENDIF}
  2305. Result := AnsiString(buffer);
  2306. SetLength(buffer, 0);
  2307. end;
  2308. function TDCLKernel.GetNumArgs: TCL_uint;
  2309. begin
  2310. FStatus := clGetKernelInfo(FKernel, CL_KERNEL_NUM_ARGS, SizeOf(Result), @Result, nil);
  2311. {$IFDEF LOGGING}
  2312. WriteLog('clGetKernelInfo: ' + GetString(FStatus) + ';');
  2313. {$ENDIF}
  2314. {$IFDEF LOGGING}
  2315. WriteLog('CL_KERNEL_NUM_ARGS: ' + IntToStr(Result) + ';');
  2316. {$ENDIF}
  2317. end;
  2318. procedure TDCLKernel.SetArg(const Index: TCL_uint; const Size: TSize_t;
  2319. const Value: Pointer);
  2320. begin
  2321. FStatus := clSetKernelArg(FKernel, Index, Size, Value);
  2322. {$IFDEF LOGGING}
  2323. WriteLog('clSetKernelArg: ' + GetString(FStatus) + ';');
  2324. {$ENDIF}
  2325. end;
  2326. procedure TDCLKernel.SetArg(const Index: TCL_uint;
  2327. const Value: TDCLBuffer);
  2328. begin
  2329. SetArg(Index, SizeOf(@Value.FMem), @Value.FMem);
  2330. end;
  2331. procedure TDCLKernel.SetArg(const Index: TCL_uint;
  2332. const Value: TDCLImage2D);
  2333. begin
  2334. SetArg(Index, SizeOf(@Value.FMem), @Value.FMem);
  2335. end;
  2336. procedure TDCLCommandQueue.ReadBuffer(const Buffer: TDCLBuffer;
  2337. const Size: TSize_t; const Data: Pointer);
  2338. {$IFDEF PROFILING}
  2339. var
  2340. TimingEvent: PCL_event;
  2341. StartTime,
  2342. EndTime: TCL_ulong;
  2343. {$ENDIF}
  2344. begin
  2345. FStatus := clEnqueueReadBuffer(FCommandQueue, Buffer.FMem, CL_TRUE, 0, Size, Data, 0, nil, {$IFDEF PROFILING}@TimingEvent{$ELSE}nil{$ENDIF});
  2346. {$IFDEF LOGGING}
  2347. WriteLog('clEnqueueReadBuffer: ' + GetString(FStatus) + ';');
  2348. {$ENDIF}
  2349. clFinish(FCommandQueue);
  2350. {$IFDEF LOGGING}
  2351. WriteLog('clFinish: ' + GetString(FStatus) + ';');
  2352. {$ENDIF}
  2353. {$IFDEF PROFILING}
  2354. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_START, SizeOf(StartTime), @StartTime, nil);
  2355. {$IFDEF LOGGING}
  2356. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2357. {$ENDIF}
  2358. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_END, SizeOf(EndTime), @EndTime, nil);
  2359. {$IFDEF LOGGING}
  2360. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2361. {$ENDIF}
  2362. FExecuteTime := EndTime-StartTime;
  2363. {$IFDEF LOGGING}
  2364. WriteLog('EnqueueReadBuffer time : ' + IntToStr(FExecuteTime) + ' ns;');
  2365. {$ENDIF}
  2366. {$ENDIF}
  2367. end;
  2368. procedure TDCLCommandQueue.ReadImage2D(const Image: TDCLImage2D; const Data: Pointer);
  2369. var
  2370. origin, region: array [0..2] of TSize_t;
  2371. {$IFDEF PROFILING}
  2372. TimingEvent: PCL_event;
  2373. StartTime,
  2374. EndTime: TCL_ulong;
  2375. {$ENDIF}
  2376. begin
  2377. ZeroMemory(@origin, SizeOf(origin));
  2378. region[0] := Image.Width;
  2379. region[1] := Image.Height;
  2380. region[2] := 1;// Image 2D
  2381. FStatus := clEnqueueReadImage(FCommandQueue, Image.FMem, CL_TRUE, @origin, @region, 0, 0, Data, 0, nil, {$IFDEF PROFILING}@TimingEvent{$ELSE}nil{$ENDIF});
  2382. {$IFDEF LOGGING}
  2383. WriteLog('clEnqueueReadImage: ' + GetString(FStatus) + ';');
  2384. {$ENDIF}
  2385. FStatus := clFinish(FCommandQueue);
  2386. {$IFDEF LOGGING}
  2387. WriteLog('clFinish: ' + GetString(FStatus) + ';');
  2388. {$ENDIF}
  2389. {$IFDEF PROFILING}
  2390. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_START, SizeOf(StartTime), @StartTime, nil);
  2391. {$IFDEF LOGGING}
  2392. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2393. {$ENDIF}
  2394. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_END, SizeOf(EndTime), @EndTime, nil);
  2395. {$IFDEF LOGGING}
  2396. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2397. {$ENDIF}
  2398. FExecuteTime := EndTime-StartTime;
  2399. {$IFDEF LOGGING}
  2400. WriteLog('clEnqueueReadImage time : ' + IntToStr(FExecuteTime) + ' ns;');
  2401. {$ENDIF}
  2402. {$ENDIF}
  2403. end;
  2404. procedure TDCLCommandQueue.WriteImage2D(const Image: TDCLImage2D;
  2405. const Width, Height: TSize_t; const Data: Pointer);
  2406. var
  2407. origin, region: array [0..2] of TSize_t;
  2408. {$IFDEF PROFILING}
  2409. TimingEvent: PCL_event;
  2410. StartTime,
  2411. EndTime: TCL_ulong;
  2412. {$ENDIF}
  2413. begin
  2414. ZeroMemory(@origin, SizeOf(origin));
  2415. region[0] := Width;
  2416. region[1] := Height;
  2417. region[2] := 1;// Image 2D
  2418. FStatus := clEnqueueWriteImage(FCommandQueue, Image.FMem, CL_TRUE, @origin, @region, 0, 0, Data, 0, nil, {$IFDEF PROFILING}@TimingEvent{$ELSE}nil{$ENDIF});
  2419. {$IFDEF LOGGING}
  2420. WriteLog('clEnqueueWriteImage: ' + GetString(FStatus) + ';');
  2421. {$ENDIF}
  2422. FStatus := clFinish(FCommandQueue);
  2423. {$IFDEF LOGGING}
  2424. WriteLog('clFinish: ' + GetString(FStatus) + ';');
  2425. {$ENDIF}
  2426. {$IFDEF PROFILING}
  2427. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_START, SizeOf(StartTime), @StartTime, nil);
  2428. {$IFDEF LOGGING}
  2429. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2430. {$ENDIF}
  2431. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_END, SizeOf(EndTime), @EndTime, nil);
  2432. {$IFDEF LOGGING}
  2433. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2434. {$ENDIF}
  2435. FExecuteTime := EndTime-StartTime;
  2436. {$IFDEF LOGGING}
  2437. WriteLog('clEnqueueWriteImage time : ' + IntToStr(FExecuteTime) + ' ns;');
  2438. {$ENDIF}
  2439. {$ENDIF}
  2440. end;
  2441. procedure TDCLCommandQueue.WriteBuffer(const Buffer: TDCLBuffer;
  2442. const Size: TSize_t; const Data: Pointer);
  2443. {$IFDEF PROFILING}
  2444. var
  2445. TimingEvent: PCL_event;
  2446. StartTime,
  2447. EndTime: TCL_ulong;
  2448. {$ENDIF}
  2449. begin
  2450. FStatus := clEnqueueWriteBuffer(FCommandQueue, Buffer.FMem, CL_TRUE, 0, Size, Data, 0, nil, {$IFDEF PROFILING}@TimingEvent{$ELSE}nil{$ENDIF});
  2451. {$IFDEF LOGGING}
  2452. WriteLog('clEnqueueWriteBuffer: ' + GetString(FStatus) + ';');
  2453. {$ENDIF}
  2454. FStatus := clFinish(FCommandQueue);
  2455. {$IFDEF LOGGING}
  2456. WriteLog('clFinish: ' + GetString(FStatus) + ';');
  2457. {$ENDIF}
  2458. {$IFDEF PROFILING}
  2459. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_START, SizeOf(StartTime), @StartTime, nil);
  2460. {$IFDEF LOGGING}
  2461. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2462. {$ENDIF}
  2463. FStatus := clGetEventProfilingInfo(TimingEvent, CL_PROFILING_COMMAND_END, SizeOf(EndTime), @EndTime, nil);
  2464. {$IFDEF LOGGING}
  2465. WriteLog('clGetEventProfilingInfo: ' + GetString(FStatus) + ';');
  2466. {$ENDIF}
  2467. FExecuteTime := EndTime - StartTime;
  2468. {$IFDEF LOGGING}
  2469. WriteLog('clEnqueueWriteBuffer time : ' + IntToStr(FExecuteTime) + ' ns;');
  2470. {$ENDIF}
  2471. {$ENDIF}
  2472. end;
  2473. procedure TDCLCommandQueue.AcquireGLObject(const Buffer: TDCLBuffer);
  2474. begin
  2475. FStatus := clEnqueueAcquireGLObjects(FCommandQueue, 1, @Buffer.FMem, 0, nil, nil);
  2476. {$IFDEF LOGGING}
  2477. WriteLog('clEnqueueAcquireGLObjects: ' + GetString(FStatus) + ';');
  2478. {$ENDIF}
  2479. end;
  2480. procedure TDCLCommandQueue.AcquireGLObject(const Image2D: TDCLImage2D);
  2481. begin
  2482. FStatus := clEnqueueAcquireGLObjects(FCommandQueue, 1, @Image2D.FMem, 0, nil, nil);
  2483. {$IFDEF LOGGING}
  2484. WriteLog('clEnqueueAcquireGLObjects: ' + GetString(FStatus) + ';');
  2485. {$ENDIF}
  2486. end;
  2487. procedure TDCLCommandQueue.ReleaseGLObject(const Buffer: TDCLBuffer);
  2488. begin
  2489. FStatus := clEnqueueReleaseGLObjects(FCommandQueue, 1, @Buffer.FMem, 0, nil, nil);
  2490. {$IFDEF LOGGING}
  2491. WriteLog('clEnqueueReleaseGLObjects: ' + GetString(FStatus) + ';');
  2492. {$ENDIF}
  2493. end;
  2494. procedure TDCLCommandQueue.ReleaseGLObject(const Image2D: TDCLImage2D);
  2495. begin
  2496. FStatus := clEnqueueReleaseGLObjects(FCommandQueue, 1, @Image2D.FMem, 0, nil, nil);
  2497. {$IFDEF LOGGING}
  2498. WriteLog('clEnqueueReleaseGLObjects: ' + GetString(FStatus) + ';');
  2499. {$ENDIF}
  2500. end;
  2501. { TDCLImage2D }
  2502. constructor TDCLImage2D.Create(const Context: PCL_context;
  2503. const Flags: TDCLMemFlagsSet; const Format: PCL_image_format; const Width,
  2504. Height, RowPitch: TSize_t; const Data: Pointer);
  2505. var
  2506. Fgs: TCL_mem_flags;
  2507. begin
  2508. inherited Create();
  2509. Fgs := 0;
  2510. if mfReadWrite in Flags then Fgs := Fgs or CL_MEM_READ_WRITE;
  2511. if mfWriteOnly in Flags then Fgs := Fgs or CL_MEM_WRITE_ONLY;
  2512. if mfReadOnly in Flags then Fgs := Fgs or CL_MEM_READ_ONLY;
  2513. if mfUseHostPtr in Flags then Fgs := Fgs or CL_MEM_USE_HOST_PTR;
  2514. if mfAllocHostPtr in Flags then Fgs := Fgs or CL_MEM_ALLOC_HOST_PTR;
  2515. if mfCopyHostPtr in Flags then Fgs := Fgs or CL_MEM_COPY_HOST_PTR;
  2516. FFormat := Format^;
  2517. FWidth := Width;
  2518. FHeight := Height;
  2519. // XXXXXXXXXXXX1.2 FMem := clCreateImage2D(Context, Fgs, @FFormat, Width, Height, RowPitch, Data, @FStatus);
  2520. {$IFDEF LOGGING}
  2521. WriteLog('clCreateImage2D: ' + GetString(FStatus) + ';');
  2522. {$ENDIF}
  2523. end;
  2524. constructor TDCLImage2D.CreateFromGL(const Context: PCL_context;
  2525. const Flags: TDCLMemFlagsSet; const Texture: TGLuint);
  2526. var
  2527. fgs: TCL_mem_flags;
  2528. begin
  2529. inherited Create();
  2530. fgs := 0;
  2531. if mfReadWrite in flags then fgs := fgs or CL_MEM_READ_WRITE;
  2532. if mfWriteOnly in flags then fgs := fgs or CL_MEM_WRITE_ONLY;
  2533. if mfReadOnly in flags then fgs := fgs or CL_MEM_READ_ONLY;
  2534. if mfUseHostPtr in flags then fgs := fgs or CL_MEM_USE_HOST_PTR;
  2535. if mfAllocHostPtr in flags then fgs := fgs or CL_MEM_ALLOC_HOST_PTR;
  2536. if mfCopyHostPtr in flags then fgs := fgs or CL_MEM_COPY_HOST_PTR;
  2537. // XXXXXXXXXXXX1.2 FMem := clCreateFromGLTexture2D(Context, fgs, GL_TEXTURE_2D, 0, Texture, @FStatus);
  2538. {$IFDEF LOGGING}
  2539. WriteLog('clCreateFromGLTexture2D: ' + GetString(FStatus) + ';');
  2540. {$ENDIF}
  2541. FStatus := clGetImageInfo(FMem, CL_IMAGE_WIDTH, SizeOf(FWidth), @FWidth, nil);
  2542. {$IFDEF LOGGING}
  2543. WriteLog('clGetImageInfo: ' + GetString(FStatus) + ';');
  2544. WriteLog('CL_IMAGE_WIDTH: ' + IntToStr(FWidth) + ';');
  2545. {$ENDIF}
  2546. FStatus := clGetImageInfo(FMem, CL_IMAGE_HEIGHT, SizeOf(FHeight), @FHeight, nil);
  2547. {$IFDEF LOGGING}
  2548. WriteLog('clGetImageInfo: ' + GetString(FStatus) + ';');
  2549. WriteLog('CL_IMAGE_HEIGHT: ' + IntToStr(FHeight) + ';');
  2550. {$ENDIF}
  2551. FStatus := clGetImageInfo(FMem, CL_IMAGE_FORMAT, SizeOf(FFormat), @FFormat, nil);
  2552. {$IFDEF LOGGING}
  2553. WriteLog('clGetImageInfo: ' + GetString(FStatus) + ';');
  2554. WriteLog('CL_IMAGE_FORMAT_channel_order: ' + IntToStr(FFormat.Image_channel_order) + ';');
  2555. WriteLog('CL_IMAGE_FORMAT_Image_channel_data_type: ' + IntToStr(FFormat.Image_channel_data_type) + ';');
  2556. {$ENDIF}
  2557. end;
  2558. destructor TDCLImage2D.Destroy;
  2559. begin
  2560. FStatus := clReleaseMemObject(FMem);
  2561. {$IFDEF LOGGING}
  2562. WriteLog('clReleaseMemObject: ' + GetString(FStatus) + ';');
  2563. {$ENDIF}
  2564. inherited;
  2565. end;
  2566. {$IFDEF LOGGING}
  2567. initialization
  2568. AssignFile(DCLFileLOG, ExtractFilePath(ParamStr(0)) + 'DELPHI_LOG.log');
  2569. Rewrite(DCLFileLOG);
  2570. finalization
  2571. CloseFile(DCLFileLOG);
  2572. {$ENDIF}
  2573. end.