DelphiCL.pas 90 KB

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