P4 to Git Change 1398097 by lmoriche@lmoriche_opencl_dev2 on 2017/04/13 13:01:56
SWDEV-102733 - [OCL-LC-ROCm] Cmake build Write CMakeLists.txt to enable building with and without the DK environment - Change the coding convention of the runtime files. Use Google's Style (https://google.github.io/styleguide/cppguide.html). Affected files ... ... //depot/stg/opencl/drivers/opencl/.clang-format#1 add ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_agent_amd.h#2 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_command.cpp#13 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_context.cpp#53 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_counter.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d10.cpp#15 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d11.cpp#22 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_d3d9.cpp#32 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_debugger_amd.cpp#8 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_debugger_amd.h#7 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_device.cpp#61 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_event.cpp#10 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_execute.cpp#23 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_gl.cpp#53 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_icd.cpp#27 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_icd_amd.h#18 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_kernel.h#24 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_kernel_info_amd.cpp#3 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_kernel_info_amd.h#4 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_lqdflash_amd.cpp#17 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_lqdflash_amd.h#6 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_memobj.cpp#81 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_object.cpp#3 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_pipe.cpp#6 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_platform_amd.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_platform_amd.h#2 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_profile_amd.cpp#3 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_profile_amd.h#2 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_program.cpp#41 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_sampler.cpp#6 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_sdi_amd.cpp#3 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_sdi_amd.h#2 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_semaphore_amd.h#3 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_svm.cpp#20 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_thread_trace_amd.cpp#8 edit ... //depot/stg/opencl/drivers/opencl/api/opencl/amdocl/cl_thread_trace_amd.h#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/appprofile.cpp#17 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/appprofile.hpp#12 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/blit.cpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/blit.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/blitcl.cpp#11 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubinary.cpp#11 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubinary.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubuiltins.cpp#13 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpubuiltins.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpucommand.cpp#66 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpucommand.hpp#40 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpudevice.cpp#280 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpudevice.hpp#96 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpufeat.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpukernel.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpumapping.cpp#6 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpumapping.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuprogram.cpp#70 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuprogram.hpp#14 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpusettings.cpp#33 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpusettings.hpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cputables.hpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuvirtual.cpp#26 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/cpu/cpuvirtual.hpp#13 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/device.cpp#209 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#284 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuappprofile.cpp#12 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuappprofile.hpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpubinary.cpp#58 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpubinary.hpp#27 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpublit.cpp#126 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpublit.hpp#41 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpucompiler.cpp#156 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuconstbuf.cpp#10 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuconstbuf.hpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpucounters.cpp#12 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpucounters.hpp#9 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudebugger.hpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudebugmanager.cpp#10 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudebugmanager.hpp#6 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudefs.hpp#147 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.cpp#567 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpudevice.hpp#163 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpukernel.cpp#318 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpukernel.hpp#126 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpumemory.cpp#131 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpumemory.hpp#50 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprintf.cpp#44 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprintf.hpp#15 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprogram.cpp#232 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuprogram.hpp#69 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuresource.cpp#238 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuresource.hpp#87 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpusched.hpp#19 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuschedcl.cpp#35 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuscsi.cpp#37 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpusettings.cpp#350 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpusettings.hpp#98 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputhreadtrace.cpp#9 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputhreadtrace.hpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputimestamp.cpp#27 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputimestamp.hpp#16 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gputrap.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.cpp#410 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuvirtual.hpp#140 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuwavelimiter.cpp#13 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/gpu/gpuwavelimiter.hpp#9 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/hwdebug.cpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/hwdebug.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palappprofile.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palappprofile.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbinary.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palbinary.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.cpp#13 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palblit.hpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcompiler.cpp#15 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palconstbuf.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palconstbuf.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcounters.cpp#11 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcounters.hpp#9 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldebugger.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldebugmanager.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldebugmanager.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldefs.hpp#16 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#45 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.hpp#16 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldeviced3d10.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldeviced3d11.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldeviced3d9.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevicegl.cpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palkernel.cpp#34 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palkernel.hpp#11 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palmemory.cpp#13 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palmemory.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprintf.cpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprintf.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.cpp#39 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.hpp#17 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.cpp#28 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palresource.hpp#12 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsched.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palschedcl.cpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.cpp#24 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palsettings.hpp#10 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palthreadtrace.cpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palthreadtrace.hpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paltimestamp.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paltimestamp.hpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paltrap.hpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.cpp#48 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palvirtual.hpp#21 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palwavelimiter.cpp#3 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palwavelimiter.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/mesa_glinterop.h#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocappprofile.cpp#6 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocappprofile.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocbinary.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocblit.cpp#17 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocblit.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompiler.cpp#32 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompilerlib.cpp#6 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompilerlib.hpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdefs.hpp#10 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#48 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.hpp#20 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocglinterop.cpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocglinterop.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.cpp#22 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rockernel.hpp#16 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.cpp#15 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocmemory.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprintf.cpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprintf.hpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.cpp#64 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.hpp#23 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocregisters.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocsettings.cpp#17 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocsettings.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocvirtual.cpp#34 edit ... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocvirtual.hpp#10 edit ... //depot/stg/opencl/drivers/opencl/runtime/os/alloc.cpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/os/alloc.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/os/os.cpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/os/os.hpp#30 edit ... //depot/stg/opencl/drivers/opencl/runtime/os/os_posix.cpp#42 edit ... //depot/stg/opencl/drivers/opencl/runtime/os/os_win32.cpp#47 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/agent.cpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/agent.hpp#6 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/command.cpp#78 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/command.hpp#83 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/commandqueue.cpp#23 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/commandqueue.hpp#18 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/context.cpp#42 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/context.hpp#26 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/counter.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/interop.hpp#12 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/kernel.cpp#23 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/kernel.hpp#18 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.cpp#127 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.hpp#100 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/ndrange.cpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/ndrange.hpp#9 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/object.cpp#2 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/object.hpp#17 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/perfctr.hpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/program.cpp#86 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/program.hpp#41 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/runtime.cpp#35 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/runtime.hpp#4 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/sampler.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/platform/threadtrace.hpp#6 edit ... //depot/stg/opencl/drivers/opencl/runtime/thread/atomic.hpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/thread/monitor.cpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/thread/monitor.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/thread/semaphore.cpp#10 edit ... //depot/stg/opencl/drivers/opencl/runtime/thread/semaphore.hpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/thread/thread.cpp#14 edit ... //depot/stg/opencl/drivers/opencl/runtime/thread/thread.hpp#15 edit ... //depot/stg/opencl/drivers/opencl/runtime/top.hpp#26 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/concurrent.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/debug.cpp#5 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/debug.hpp#7 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/flags.cpp#16 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/flags.hpp#271 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/macros.hpp#8 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/util.hpp#12 edit ... //depot/stg/opencl/drivers/opencl/runtime/utils/versions.hpp#2150 edit
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
Language: Cpp
|
||||
BasedOnStyle: Google
|
||||
AlignEscapedNewlinesLeft: false
|
||||
AlignOperands: false
|
||||
ColumnLimit: 100
|
||||
AlwaysBreakTemplateDeclarations: false
|
||||
DerivePointerAlignment: false
|
||||
IndentFunctionDeclarationAfterType: false
|
||||
MaxEmptyLinesToKeep: 2
|
||||
SortIncludes: false
|
||||
@@ -107,203 +107,149 @@ typedef const struct _cl_agent cl_agent;
|
||||
|
||||
/* Context Callbacks */
|
||||
|
||||
typedef void (CL_CALLBACK * acContextCreate_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_context /* context */);
|
||||
typedef void(CL_CALLBACK* acContextCreate_fn)(cl_agent* /* agent */, cl_context /* context */);
|
||||
|
||||
typedef void (CL_CALLBACK * acContextFree_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_context /* context */);
|
||||
typedef void(CL_CALLBACK* acContextFree_fn)(cl_agent* /* agent */, cl_context /* context */);
|
||||
|
||||
/* Command Queue Callbacks */
|
||||
|
||||
typedef void (CL_CALLBACK * acCommandQueueCreate_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_command_queue /* queue */);
|
||||
typedef void(CL_CALLBACK* acCommandQueueCreate_fn)(cl_agent* /* agent */,
|
||||
cl_command_queue /* queue */);
|
||||
|
||||
typedef void (CL_CALLBACK * acCommandQueueFree_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_command_queue /* queue */);
|
||||
typedef void(CL_CALLBACK* acCommandQueueFree_fn)(cl_agent* /* agent */,
|
||||
cl_command_queue /* queue */);
|
||||
|
||||
/* Event Callbacks */
|
||||
|
||||
typedef void (CL_CALLBACK * acEventCreate_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_event /* event */,
|
||||
cl_command_type /* type */);
|
||||
typedef void(CL_CALLBACK* acEventCreate_fn)(cl_agent* /* agent */, cl_event /* event */,
|
||||
cl_command_type /* type */);
|
||||
|
||||
typedef void (CL_CALLBACK * acEventFree_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_event /* event */);
|
||||
typedef void(CL_CALLBACK* acEventFree_fn)(cl_agent* /* agent */, cl_event /* event */);
|
||||
|
||||
typedef void (CL_CALLBACK * acEventStatusChanged_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_event /* event */,
|
||||
cl_int /* execution_status */,
|
||||
cl_long /* epoch_time_stamp */);
|
||||
typedef void(CL_CALLBACK* acEventStatusChanged_fn)(cl_agent* /* agent */, cl_event /* event */,
|
||||
cl_int /* execution_status */,
|
||||
cl_long /* epoch_time_stamp */);
|
||||
|
||||
/* Memory Object Callbacks */
|
||||
|
||||
typedef void (CL_CALLBACK * acMemObjectCreate_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_mem /* memobj */);
|
||||
typedef void(CL_CALLBACK* acMemObjectCreate_fn)(cl_agent* /* agent */, cl_mem /* memobj */);
|
||||
|
||||
typedef void (CL_CALLBACK * acMemObjectFree_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_mem /* memobj */);
|
||||
typedef void(CL_CALLBACK* acMemObjectFree_fn)(cl_agent* /* agent */, cl_mem /* memobj */);
|
||||
|
||||
typedef void (CL_CALLBACK * acMemObjectAcquired_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_mem /* memobj */,
|
||||
cl_device_id /* device */,
|
||||
cl_long /* elapsed_time */);
|
||||
typedef void(CL_CALLBACK* acMemObjectAcquired_fn)(cl_agent* /* agent */, cl_mem /* memobj */,
|
||||
cl_device_id /* device */,
|
||||
cl_long /* elapsed_time */);
|
||||
|
||||
/* Sampler Callbacks */
|
||||
|
||||
typedef void (CL_CALLBACK * acSamplerCreate_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_sampler /* sampler */);
|
||||
typedef void(CL_CALLBACK* acSamplerCreate_fn)(cl_agent* /* agent */, cl_sampler /* sampler */);
|
||||
|
||||
typedef void (CL_CALLBACK * acSamplerFree_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_sampler /* sampler */);
|
||||
typedef void(CL_CALLBACK* acSamplerFree_fn)(cl_agent* /* agent */, cl_sampler /* sampler */);
|
||||
|
||||
/* Program Callbacks */
|
||||
|
||||
typedef void (CL_CALLBACK * acProgramCreate_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_program /* program */);
|
||||
typedef void(CL_CALLBACK* acProgramCreate_fn)(cl_agent* /* agent */, cl_program /* program */);
|
||||
|
||||
typedef void (CL_CALLBACK * acProgramFree_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_program /* program */);
|
||||
typedef void(CL_CALLBACK* acProgramFree_fn)(cl_agent* /* agent */, cl_program /* program */);
|
||||
|
||||
typedef void (CL_CALLBACK * acProgramBuild_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_program /* program */);
|
||||
typedef void(CL_CALLBACK* acProgramBuild_fn)(cl_agent* /* agent */, cl_program /* program */);
|
||||
|
||||
/* Kernel Callbacks */
|
||||
|
||||
typedef void (CL_CALLBACK * acKernelCreate_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_kernel /* kernel */);
|
||||
typedef void(CL_CALLBACK* acKernelCreate_fn)(cl_agent* /* agent */, cl_kernel /* kernel */);
|
||||
|
||||
typedef void (CL_CALLBACK * acKernelFree_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_kernel /* kernel */);
|
||||
typedef void(CL_CALLBACK* acKernelFree_fn)(cl_agent* /* agent */, cl_kernel /* kernel */);
|
||||
|
||||
typedef void (CL_CALLBACK * acKernelSetArg_fn)(
|
||||
cl_agent * /* agent */,
|
||||
cl_kernel /* kernel */,
|
||||
cl_int /* arg_index */,
|
||||
size_t /* size */,
|
||||
const void * /* value_ptr */);
|
||||
typedef void(CL_CALLBACK* acKernelSetArg_fn)(cl_agent* /* agent */, cl_kernel /* kernel */,
|
||||
cl_int /* arg_index */, size_t /* size */,
|
||||
const void* /* value_ptr */);
|
||||
|
||||
typedef struct _cl_agent_callbacks
|
||||
{
|
||||
/* Context Callbacks */
|
||||
acContextCreate_fn ContextCreate;
|
||||
acContextFree_fn ContextFree;
|
||||
typedef struct _cl_agent_callbacks {
|
||||
/* Context Callbacks */
|
||||
acContextCreate_fn ContextCreate;
|
||||
acContextFree_fn ContextFree;
|
||||
|
||||
/* Command Queue Callbacks */
|
||||
acCommandQueueCreate_fn CommandQueueCreate;
|
||||
acCommandQueueFree_fn CommandQueueFree;
|
||||
/* Command Queue Callbacks */
|
||||
acCommandQueueCreate_fn CommandQueueCreate;
|
||||
acCommandQueueFree_fn CommandQueueFree;
|
||||
|
||||
/* Event Callbacks */
|
||||
acEventCreate_fn EventCreate;
|
||||
acEventFree_fn EventFree;
|
||||
acEventStatusChanged_fn EventStatusChanged;
|
||||
/* Event Callbacks */
|
||||
acEventCreate_fn EventCreate;
|
||||
acEventFree_fn EventFree;
|
||||
acEventStatusChanged_fn EventStatusChanged;
|
||||
|
||||
/* Memory Object Callbacks */
|
||||
acMemObjectCreate_fn MemObjectCreate;
|
||||
acMemObjectFree_fn MemObjectFree;
|
||||
acMemObjectAcquired_fn MemObjectAcquired;
|
||||
/* Memory Object Callbacks */
|
||||
acMemObjectCreate_fn MemObjectCreate;
|
||||
acMemObjectFree_fn MemObjectFree;
|
||||
acMemObjectAcquired_fn MemObjectAcquired;
|
||||
|
||||
/* Sampler Callbacks */
|
||||
acSamplerCreate_fn SamplerCreate;
|
||||
acSamplerFree_fn SamplerFree;
|
||||
/* Sampler Callbacks */
|
||||
acSamplerCreate_fn SamplerCreate;
|
||||
acSamplerFree_fn SamplerFree;
|
||||
|
||||
/* Program Callbacks */
|
||||
acProgramCreate_fn ProgramCreate;
|
||||
acProgramFree_fn ProgramFree;
|
||||
acProgramBuild_fn ProgramBuild;
|
||||
/* Program Callbacks */
|
||||
acProgramCreate_fn ProgramCreate;
|
||||
acProgramFree_fn ProgramFree;
|
||||
acProgramBuild_fn ProgramBuild;
|
||||
|
||||
/* Kernel Callbacks */
|
||||
acKernelCreate_fn KernelCreate;
|
||||
acKernelFree_fn KernelFree;
|
||||
acKernelSetArg_fn KernelSetArg;
|
||||
/* Kernel Callbacks */
|
||||
acKernelCreate_fn KernelCreate;
|
||||
acKernelFree_fn KernelFree;
|
||||
acKernelSetArg_fn KernelSetArg;
|
||||
|
||||
} cl_agent_callbacks;
|
||||
|
||||
typedef cl_uint cl_agent_capability_action;
|
||||
|
||||
#define CL_AGENT_ADD_CAPABILITIES 0x0
|
||||
#define CL_AGENT_ADD_CAPABILITIES 0x0
|
||||
#define CL_AGENT_RELINQUISH_CAPABILITIES 0x1
|
||||
|
||||
typedef struct _cl_agent_capabilities
|
||||
{
|
||||
cl_bitfield canGenerateContextEvents : 1;
|
||||
cl_bitfield canGenerateCommandQueueEvents : 1;
|
||||
cl_bitfield canGenerateEventEvents : 1;
|
||||
cl_bitfield canGenerateMemObjectEvents : 1;
|
||||
cl_bitfield canGenerateSamplerEvents : 1;
|
||||
cl_bitfield canGenerateProgramEvents : 1;
|
||||
cl_bitfield canGenerateKernelEvents : 1;
|
||||
typedef struct _cl_agent_capabilities {
|
||||
cl_bitfield canGenerateContextEvents : 1;
|
||||
cl_bitfield canGenerateCommandQueueEvents : 1;
|
||||
cl_bitfield canGenerateEventEvents : 1;
|
||||
cl_bitfield canGenerateMemObjectEvents : 1;
|
||||
cl_bitfield canGenerateSamplerEvents : 1;
|
||||
cl_bitfield canGenerateProgramEvents : 1;
|
||||
cl_bitfield canGenerateKernelEvents : 1;
|
||||
|
||||
} cl_agent_capabilities;
|
||||
|
||||
struct _cl_agent
|
||||
{
|
||||
cl_int (CL_API_CALL * GetVersionNumber)(
|
||||
cl_agent * /* agent */,
|
||||
cl_int * /* version_ret */);
|
||||
struct _cl_agent {
|
||||
cl_int(CL_API_CALL* GetVersionNumber)(cl_agent* /* agent */, cl_int* /* version_ret */);
|
||||
|
||||
cl_int (CL_API_CALL * GetPlatform)(
|
||||
cl_agent * /* agent */,
|
||||
cl_platform_id * /* platform_id_ret */);
|
||||
cl_int(CL_API_CALL* GetPlatform)(cl_agent* /* agent */, cl_platform_id* /* platform_id_ret */);
|
||||
|
||||
cl_int (CL_API_CALL * GetTime) (
|
||||
cl_agent * /* agent */,
|
||||
cl_long * /* time_nanos */);
|
||||
cl_int(CL_API_CALL* GetTime)(cl_agent* /* agent */, cl_long* /* time_nanos */);
|
||||
|
||||
cl_int (CL_API_CALL * SetCallbacks)(
|
||||
cl_agent * /* agent */,
|
||||
const cl_agent_callbacks * /* callbacks */,
|
||||
size_t /* size */);
|
||||
cl_int(CL_API_CALL* SetCallbacks)(cl_agent* /* agent */,
|
||||
const cl_agent_callbacks* /* callbacks */, size_t /* size */);
|
||||
|
||||
|
||||
cl_int (CL_API_CALL * GetPotentialCapabilities)(
|
||||
cl_agent * /* agent */,
|
||||
cl_agent_capabilities * /* capabilities */);
|
||||
cl_int(CL_API_CALL* GetPotentialCapabilities)(cl_agent* /* agent */,
|
||||
cl_agent_capabilities* /* capabilities */);
|
||||
|
||||
cl_int (CL_API_CALL * GetCapabilities)(
|
||||
cl_agent * /* agent */,
|
||||
cl_agent_capabilities * /* capabilities */);
|
||||
cl_int(CL_API_CALL* GetCapabilities)(cl_agent* /* agent */,
|
||||
cl_agent_capabilities* /* capabilities */);
|
||||
|
||||
cl_int (CL_API_CALL * SetCapabilities)(
|
||||
cl_agent * /* agent */,
|
||||
const cl_agent_capabilities * /* capabilities */,
|
||||
cl_agent_capability_action /* action */);
|
||||
cl_int(CL_API_CALL* SetCapabilities)(cl_agent* /* agent */,
|
||||
const cl_agent_capabilities* /* capabilities */,
|
||||
cl_agent_capability_action /* action */);
|
||||
|
||||
|
||||
cl_int (CL_API_CALL * GetICDDispatchTable)(
|
||||
cl_agent * /* agent */,
|
||||
cl_icd_dispatch_table * /* table */,
|
||||
size_t /* size */);
|
||||
cl_int(CL_API_CALL* GetICDDispatchTable)(cl_agent* /* agent */,
|
||||
cl_icd_dispatch_table* /* table */, size_t /* size */);
|
||||
|
||||
cl_int (CL_API_CALL * SetICDDispatchTable)(
|
||||
cl_agent * /* agent */,
|
||||
const cl_icd_dispatch_table * /* table */,
|
||||
size_t /* size */);
|
||||
cl_int(CL_API_CALL* SetICDDispatchTable)(cl_agent* /* agent */,
|
||||
const cl_icd_dispatch_table* /* table */,
|
||||
size_t /* size */);
|
||||
|
||||
/* add Kernel/Program helper functions, etc... */
|
||||
/* add Kernel/Program helper functions, etc... */
|
||||
};
|
||||
|
||||
extern cl_int CL_CALLBACK
|
||||
clAgent_OnLoad(cl_agent * /* agent */);
|
||||
extern cl_int CL_CALLBACK clAgent_OnLoad(cl_agent* /* agent */);
|
||||
|
||||
extern void CL_CALLBACK
|
||||
clAgent_OnUnload(cl_agent * /* agent */);
|
||||
extern void CL_CALLBACK clAgent_OnUnload(cl_agent* /* agent */);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -54,132 +54,122 @@
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_command_queue, clCreateCommandQueueWithProperties, (
|
||||
cl_context context,
|
||||
cl_device_id device,
|
||||
const cl_queue_properties *queue_properties,
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
return (cl_command_queue) 0;
|
||||
}
|
||||
RUNTIME_ENTRY_RET(cl_command_queue, clCreateCommandQueueWithProperties,
|
||||
(cl_context context, cl_device_id device,
|
||||
const cl_queue_properties* queue_properties, cl_int* errcode_ret)) {
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
return (cl_command_queue)0;
|
||||
}
|
||||
|
||||
amd::Context& amdContext = *as_amd(context);
|
||||
amd::Device& amdDevice = *as_amd(device);
|
||||
amd::Context& amdContext = *as_amd(context);
|
||||
amd::Device& amdDevice = *as_amd(device);
|
||||
|
||||
if (!is_valid(device) ||
|
||||
!amdContext.containsDevice(&amdDevice)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
return (cl_command_queue) 0;
|
||||
}
|
||||
if (!is_valid(device) || !amdContext.containsDevice(&amdDevice)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
return (cl_command_queue)0;
|
||||
}
|
||||
|
||||
cl_command_queue_properties properties = 0;
|
||||
const struct QueueProperty {
|
||||
cl_queue_properties name;
|
||||
union {
|
||||
cl_queue_properties raw;
|
||||
//FIXME_lmoriche: Check with Khronos. cl_queue_properties is an intptr,
|
||||
//but cl_command_queue_properties is a bitfield (truncate?).
|
||||
//cl_command_queue_properties properties;
|
||||
cl_uint size;
|
||||
} value;
|
||||
} *p = reinterpret_cast<const QueueProperty*>(queue_properties);
|
||||
cl_command_queue_properties properties = 0;
|
||||
const struct QueueProperty {
|
||||
cl_queue_properties name;
|
||||
union {
|
||||
cl_queue_properties raw;
|
||||
// FIXME_lmoriche: Check with Khronos. cl_queue_properties is an intptr,
|
||||
// but cl_command_queue_properties is a bitfield (truncate?).
|
||||
// cl_command_queue_properties properties;
|
||||
cl_uint size;
|
||||
} value;
|
||||
}* p = reinterpret_cast<const QueueProperty*>(queue_properties);
|
||||
|
||||
uint queueSize = amdDevice.info().queueOnDevicePreferredSize_;
|
||||
uint queueRTCUs = amd::CommandQueue::RealTimeDisabled;
|
||||
amd::CommandQueue::Priority priority = amd::CommandQueue::Priority::Normal;
|
||||
if (p != NULL) while(p->name != 0) {
|
||||
switch(p->name) {
|
||||
uint queueSize = amdDevice.info().queueOnDevicePreferredSize_;
|
||||
uint queueRTCUs = amd::CommandQueue::RealTimeDisabled;
|
||||
amd::CommandQueue::Priority priority = amd::CommandQueue::Priority::Normal;
|
||||
if (p != NULL)
|
||||
while (p->name != 0) {
|
||||
switch (p->name) {
|
||||
case CL_QUEUE_PROPERTIES:
|
||||
//FIXME_lmoriche: See comment above.
|
||||
//properties = p->value.properties;
|
||||
properties = static_cast<cl_command_queue_properties>(p->value.raw);
|
||||
break;
|
||||
// FIXME_lmoriche: See comment above.
|
||||
// properties = p->value.properties;
|
||||
properties = static_cast<cl_command_queue_properties>(p->value.raw);
|
||||
break;
|
||||
case CL_QUEUE_SIZE:
|
||||
queueSize = p->value.size;
|
||||
break;
|
||||
#define CL_QUEUE_REAL_TIME_COMPUTE_UNITS_AMD 0x404f
|
||||
queueSize = p->value.size;
|
||||
break;
|
||||
#define CL_QUEUE_REAL_TIME_COMPUTE_UNITS_AMD 0x404f
|
||||
case CL_QUEUE_REAL_TIME_COMPUTE_UNITS_AMD:
|
||||
queueRTCUs = p->value.size;
|
||||
break;
|
||||
#define CL_QUEUE_MEDIUM_PRIORITY_AMD 0x4050
|
||||
queueRTCUs = p->value.size;
|
||||
break;
|
||||
#define CL_QUEUE_MEDIUM_PRIORITY_AMD 0x4050
|
||||
case CL_QUEUE_MEDIUM_PRIORITY_AMD:
|
||||
priority = amd::CommandQueue::Priority::Medium;
|
||||
break;
|
||||
priority = amd::CommandQueue::Priority::Medium;
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_QUEUE_PROPERTIES;
|
||||
LogWarning("invalid property name");
|
||||
return (cl_command_queue) 0;
|
||||
*not_null(errcode_ret) = CL_INVALID_QUEUE_PROPERTIES;
|
||||
LogWarning("invalid property name");
|
||||
return (cl_command_queue)0;
|
||||
}
|
||||
++p;
|
||||
}
|
||||
|
||||
if (queueSize > amdDevice.info().queueOnDeviceMaxSize_) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
return (cl_command_queue)0;
|
||||
}
|
||||
|
||||
if ((queueRTCUs != amd::CommandQueue::RealTimeDisabled) &&
|
||||
((queueRTCUs > amdDevice.info().numRTCUs_) || (queueRTCUs == 0))) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
return (cl_command_queue)0;
|
||||
}
|
||||
|
||||
amd::CommandQueue* queue = NULL;
|
||||
{
|
||||
amd::ScopedLock lock(amdContext.lock());
|
||||
|
||||
// Check if the app creates a host queue
|
||||
if (!(properties & CL_QUEUE_ON_DEVICE)) {
|
||||
queue = new amd::HostQueue(amdContext, amdDevice, properties, queueRTCUs, priority);
|
||||
} else {
|
||||
// Is it a device default queue
|
||||
if (properties & CL_QUEUE_ON_DEVICE_DEFAULT) {
|
||||
queue = amdContext.defDeviceQueue(amdDevice);
|
||||
// If current context has one already then return it
|
||||
if (NULL != queue) {
|
||||
queue->retain();
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(queue);
|
||||
}
|
||||
++p;
|
||||
}
|
||||
// Check if runtime can allocate a new device queue on this context
|
||||
if (amdContext.isDevQueuePossible(amdDevice)) {
|
||||
queue = new amd::DeviceQueue(amdContext, amdDevice, properties, queueSize);
|
||||
}
|
||||
}
|
||||
|
||||
if (queueSize > amdDevice.info().queueOnDeviceMaxSize_) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
return (cl_command_queue) 0;
|
||||
if (queue == NULL || !queue->create()) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
delete queue;
|
||||
return (cl_command_queue)0;
|
||||
}
|
||||
}
|
||||
|
||||
if ((queueRTCUs != amd::CommandQueue::RealTimeDisabled) &&
|
||||
((queueRTCUs > amdDevice.info().numRTCUs_) || (queueRTCUs == 0))) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
return (cl_command_queue) 0;
|
||||
}
|
||||
if (amd::Agent::shouldPostCommandQueueEvents()) {
|
||||
amd::Agent::postCommandQueueCreate(as_cl(queue->asCommandQueue()));
|
||||
}
|
||||
|
||||
amd::CommandQueue* queue = NULL;
|
||||
{
|
||||
amd::ScopedLock lock(amdContext.lock());
|
||||
|
||||
// Check if the app creates a host queue
|
||||
if (!(properties & CL_QUEUE_ON_DEVICE)) {
|
||||
queue = new amd::HostQueue(amdContext, amdDevice, properties, queueRTCUs, priority);
|
||||
}
|
||||
else {
|
||||
// Is it a device default queue
|
||||
if (properties & CL_QUEUE_ON_DEVICE_DEFAULT) {
|
||||
queue = amdContext.defDeviceQueue(amdDevice);
|
||||
// If current context has one already then return it
|
||||
if (NULL != queue) {
|
||||
queue->retain();
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(queue);
|
||||
}
|
||||
}
|
||||
// Check if runtime can allocate a new device queue on this context
|
||||
if (amdContext.isDevQueuePossible(amdDevice)) {
|
||||
queue = new amd::DeviceQueue(
|
||||
amdContext, amdDevice, properties, queueSize);
|
||||
}
|
||||
}
|
||||
|
||||
if (queue == NULL || !queue->create()) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
delete queue;
|
||||
return (cl_command_queue) 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (amd::Agent::shouldPostCommandQueueEvents()) {
|
||||
amd::Agent::postCommandQueueCreate(as_cl(queue->asCommandQueue()));
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(queue);
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(queue);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY_RET(cl_command_queue, clCreateCommandQueue, (
|
||||
cl_context context,
|
||||
cl_device_id device,
|
||||
cl_command_queue_properties properties,
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
const cl_queue_properties cprops[] = {
|
||||
CL_QUEUE_PROPERTIES,
|
||||
static_cast<cl_queue_properties>(properties),
|
||||
0 };
|
||||
return clCreateCommandQueueWithProperties(
|
||||
context, device, properties ? cprops : NULL, errcode_ret);
|
||||
RUNTIME_ENTRY_RET(cl_command_queue, clCreateCommandQueue,
|
||||
(cl_context context, cl_device_id device, cl_command_queue_properties properties,
|
||||
cl_int* errcode_ret)) {
|
||||
const cl_queue_properties cprops[] = {CL_QUEUE_PROPERTIES,
|
||||
static_cast<cl_queue_properties>(properties), 0};
|
||||
return clCreateCommandQueueWithProperties(context, device, properties ? cprops : NULL,
|
||||
errcode_ret);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -199,13 +189,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clRetainCommandQueue, (cl_command_queue command_queue))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
as_amd(command_queue)->retain();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clRetainCommandQueue, (cl_command_queue command_queue)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
as_amd(command_queue)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -222,13 +211,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clReleaseCommandQueue, (cl_command_queue command_queue))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
as_amd(command_queue)->release();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clReleaseCommandQueue, (cl_command_queue command_queue)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
as_amd(command_queue)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -259,64 +247,51 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetCommandQueueInfo, (
|
||||
cl_command_queue command_queue,
|
||||
cl_command_queue_info param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetCommandQueueInfo,
|
||||
(cl_command_queue command_queue, cl_command_queue_info param_name,
|
||||
size_t param_value_size, void* param_value, size_t* param_value_size_ret)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
switch (param_name) {
|
||||
switch (param_name) {
|
||||
case CL_QUEUE_CONTEXT: {
|
||||
cl_context context = const_cast<cl_context>(
|
||||
as_cl(&as_amd(command_queue)->context()));
|
||||
return amd::clGetInfo(
|
||||
context, param_value_size, param_value, param_value_size_ret);
|
||||
cl_context context = const_cast<cl_context>(as_cl(&as_amd(command_queue)->context()));
|
||||
return amd::clGetInfo(context, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_QUEUE_DEVICE: {
|
||||
cl_device_id device = const_cast<cl_device_id>(
|
||||
as_cl(&as_amd(command_queue)->device()));
|
||||
return amd::clGetInfo(
|
||||
device, param_value_size, param_value, param_value_size_ret);
|
||||
cl_device_id device = const_cast<cl_device_id>(as_cl(&as_amd(command_queue)->device()));
|
||||
return amd::clGetInfo(device, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_QUEUE_PROPERTIES: {
|
||||
cl_command_queue_properties properties
|
||||
= as_amd(command_queue)->properties().value_;
|
||||
return amd::clGetInfo(
|
||||
properties, param_value_size, param_value, param_value_size_ret);
|
||||
cl_command_queue_properties properties = as_amd(command_queue)->properties().value_;
|
||||
return amd::clGetInfo(properties, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_QUEUE_REFERENCE_COUNT: {
|
||||
cl_uint count = as_amd(command_queue)->referenceCount();
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint count = as_amd(command_queue)->referenceCount();
|
||||
return amd::clGetInfo(count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_QUEUE_SIZE: {
|
||||
const amd::DeviceQueue* deviceQueue = as_amd(command_queue)->asDeviceQueue();
|
||||
if (NULL == deviceQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
cl_uint size = deviceQueue->size();
|
||||
return amd::clGetInfo(
|
||||
size, param_value_size, param_value, param_value_size_ret);
|
||||
const amd::DeviceQueue* deviceQueue = as_amd(command_queue)->asDeviceQueue();
|
||||
if (NULL == deviceQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
cl_uint size = deviceQueue->size();
|
||||
return amd::clGetInfo(size, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_QUEUE_THREAD_HANDLE_AMD: {
|
||||
const amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
const void* handle = hostQueue->thread().handle();
|
||||
return amd::clGetInfo(
|
||||
handle, param_value_size, param_value, param_value_size_ret);
|
||||
const amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
const void* handle = hostQueue->thread().handle();
|
||||
return amd::clGetInfo(handle, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -344,32 +319,27 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clSetCommandQueueProperty, (
|
||||
cl_command_queue command_queue,
|
||||
cl_command_queue_properties properties,
|
||||
cl_bool enable,
|
||||
cl_command_queue_properties *old_properties))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clSetCommandQueueProperty,
|
||||
(cl_command_queue command_queue, cl_command_queue_properties properties,
|
||||
cl_bool enable, cl_command_queue_properties* old_properties)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
*not_null(old_properties)
|
||||
= as_amd(command_queue)->properties().value_;
|
||||
*not_null(old_properties) = as_amd(command_queue)->properties().value_;
|
||||
|
||||
if (properties & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE) {
|
||||
clFinish(command_queue);
|
||||
}
|
||||
if (properties & CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE) {
|
||||
clFinish(command_queue);
|
||||
}
|
||||
|
||||
bool success;
|
||||
if (enable == CL_TRUE) {
|
||||
success = as_amd(command_queue)->properties().set(properties);
|
||||
}
|
||||
else {
|
||||
success = as_amd(command_queue)->properties().clear(properties);
|
||||
}
|
||||
bool success;
|
||||
if (enable == CL_TRUE) {
|
||||
success = as_amd(command_queue)->properties().set(properties);
|
||||
} else {
|
||||
success = as_amd(command_queue)->properties().clear(properties);
|
||||
}
|
||||
|
||||
return success ? CL_SUCCESS : CL_INVALID_QUEUE_PROPERTIES;
|
||||
return success ? CL_SUCCESS : CL_INVALID_QUEUE_PROPERTIES;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "cl_d3d9_amd.hpp"
|
||||
#include "cl_d3d10_amd.hpp"
|
||||
#include "cl_d3d11_amd.hpp"
|
||||
#endif // _WIN32
|
||||
#endif // _WIN32
|
||||
#include "cl_kernel_info_amd.h"
|
||||
#include "cl_profile_amd.h"
|
||||
#include "cl_platform_amd.h"
|
||||
@@ -81,63 +81,56 @@
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_context, clCreateContext, (
|
||||
const cl_context_properties *properties,
|
||||
cl_uint num_devices,
|
||||
const cl_device_id *devices,
|
||||
void (CL_CALLBACK * pfn_notify)(
|
||||
const char *,
|
||||
const void *,
|
||||
size_t,
|
||||
void *),
|
||||
void *user_data,
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
cl_int errcode;
|
||||
amd::Context::Info info;
|
||||
RUNTIME_ENTRY_RET(cl_context, clCreateContext,
|
||||
(const cl_context_properties* properties, cl_uint num_devices,
|
||||
const cl_device_id* devices,
|
||||
void(CL_CALLBACK* pfn_notify)(const char*, const void*, size_t, void*),
|
||||
void* user_data, cl_int* errcode_ret)) {
|
||||
cl_int errcode;
|
||||
amd::Context::Info info;
|
||||
|
||||
errcode = amd::Context::checkProperties(properties, &info);
|
||||
if (CL_SUCCESS != errcode) {
|
||||
*not_null(errcode_ret) = errcode;
|
||||
return (cl_context) 0;
|
||||
errcode = amd::Context::checkProperties(properties, &info);
|
||||
if (CL_SUCCESS != errcode) {
|
||||
*not_null(errcode_ret) = errcode;
|
||||
return (cl_context)0;
|
||||
}
|
||||
|
||||
if (num_devices == 0 || devices == NULL) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
return (cl_context)0;
|
||||
}
|
||||
|
||||
std::vector<amd::Device*> devices_;
|
||||
for (cl_uint i = 0; i < num_devices; ++i) {
|
||||
// FIXME_lmoriche: Set errcode_ret to CL_DEVICE_NOT_AVAILABLE if a
|
||||
// device in devices is no longer available.
|
||||
cl_device_id device = devices[i];
|
||||
|
||||
if (!is_valid(device)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
return (cl_context)0;
|
||||
}
|
||||
devices_.push_back(as_amd(device));
|
||||
}
|
||||
|
||||
if (num_devices == 0 || devices == NULL) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
return (cl_context) 0;
|
||||
}
|
||||
amd::Context* context = new amd::Context(devices_, info);
|
||||
if (context == NULL) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_context)0;
|
||||
}
|
||||
|
||||
std::vector<amd::Device*> devices_;
|
||||
for (cl_uint i = 0; i < num_devices; ++i) {
|
||||
// FIXME_lmoriche: Set errcode_ret to CL_DEVICE_NOT_AVAILABLE if a
|
||||
// device in devices is no longer available.
|
||||
cl_device_id device = devices[i];
|
||||
if (CL_SUCCESS != (errcode = context->create(properties))) {
|
||||
context->release();
|
||||
*not_null(errcode_ret) = errcode;
|
||||
return (cl_context)0;
|
||||
}
|
||||
|
||||
if (!is_valid(device)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
return (cl_context) 0;
|
||||
}
|
||||
devices_.push_back(as_amd(device));
|
||||
}
|
||||
if (amd::Agent::shouldPostContextEvents()) {
|
||||
amd::Agent::postContextCreate(as_cl(context));
|
||||
}
|
||||
|
||||
amd::Context* context = new amd::Context(devices_, info);
|
||||
if (context == NULL) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_context) 0;
|
||||
}
|
||||
|
||||
if (CL_SUCCESS != (errcode = context->create(properties))) {
|
||||
context->release();
|
||||
*not_null(errcode_ret) = errcode;
|
||||
return (cl_context) 0;
|
||||
}
|
||||
|
||||
if (amd::Agent::shouldPostContextEvents()) {
|
||||
amd::Agent::postContextCreate(as_cl(context));
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(context);
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(context);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -168,49 +161,38 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_context, clCreateContextFromType, (
|
||||
const cl_context_properties *properties,
|
||||
cl_device_type device_type,
|
||||
void (CL_CALLBACK * pfn_notify)(
|
||||
const char *,
|
||||
const void *,
|
||||
size_t,
|
||||
void *),
|
||||
void *user_data,
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
amd::Context::Info info;
|
||||
cl_int errcode = amd::Context::checkProperties(properties, &info);
|
||||
if (errcode != CL_SUCCESS) {
|
||||
*not_null(errcode_ret) = errcode;
|
||||
return (cl_context) 0;
|
||||
}
|
||||
RUNTIME_ENTRY_RET(cl_context, clCreateContextFromType,
|
||||
(const cl_context_properties* properties, cl_device_type device_type,
|
||||
void(CL_CALLBACK* pfn_notify)(const char*, const void*, size_t, void*),
|
||||
void* user_data, cl_int* errcode_ret)) {
|
||||
amd::Context::Info info;
|
||||
cl_int errcode = amd::Context::checkProperties(properties, &info);
|
||||
if (errcode != CL_SUCCESS) {
|
||||
*not_null(errcode_ret) = errcode;
|
||||
return (cl_context)0;
|
||||
}
|
||||
|
||||
// Get the devices of the given type.
|
||||
cl_uint num_devices;
|
||||
bool offlineDevices =
|
||||
(info.flags_ & amd::Context::OfflineDevices) ? true : false;
|
||||
if (!amd::Device::getDeviceIDs(device_type, 0, NULL,
|
||||
&num_devices, offlineDevices)) {
|
||||
*not_null(errcode_ret) = CL_DEVICE_NOT_FOUND;
|
||||
return (cl_context) 0;
|
||||
}
|
||||
// Get the devices of the given type.
|
||||
cl_uint num_devices;
|
||||
bool offlineDevices = (info.flags_ & amd::Context::OfflineDevices) ? true : false;
|
||||
if (!amd::Device::getDeviceIDs(device_type, 0, NULL, &num_devices, offlineDevices)) {
|
||||
*not_null(errcode_ret) = CL_DEVICE_NOT_FOUND;
|
||||
return (cl_context)0;
|
||||
}
|
||||
|
||||
assert(num_devices > 0 && "Should have returned an error!");
|
||||
cl_device_id* devices = (cl_device_id *)
|
||||
alloca(num_devices * sizeof(cl_device_id));
|
||||
assert(num_devices > 0 && "Should have returned an error!");
|
||||
cl_device_id* devices = (cl_device_id*)alloca(num_devices * sizeof(cl_device_id));
|
||||
|
||||
if (!amd::Device::getDeviceIDs(device_type, num_devices,
|
||||
devices, NULL, offlineDevices)) {
|
||||
*not_null(errcode_ret) = CL_DEVICE_NOT_FOUND;
|
||||
return (cl_context) 0;
|
||||
}
|
||||
if (!amd::Device::getDeviceIDs(device_type, num_devices, devices, NULL, offlineDevices)) {
|
||||
*not_null(errcode_ret) = CL_DEVICE_NOT_FOUND;
|
||||
return (cl_context)0;
|
||||
}
|
||||
|
||||
// Create a new context with the devices
|
||||
cl_context context = clCreateContext(
|
||||
properties, num_devices, devices, pfn_notify, user_data, errcode_ret);
|
||||
// Create a new context with the devices
|
||||
cl_context context =
|
||||
clCreateContext(properties, num_devices, devices, pfn_notify, user_data, errcode_ret);
|
||||
|
||||
return context;
|
||||
return context;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -230,13 +212,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clRetainContext, (cl_context context))
|
||||
{
|
||||
if (!is_valid(context)) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
as_amd(context)->retain();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clRetainContext, (cl_context context)) {
|
||||
if (!is_valid(context)) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
as_amd(context)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -252,13 +233,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clReleaseContext, (cl_context context))
|
||||
{
|
||||
if (!is_valid(context)) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
as_amd(context)->release();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clReleaseContext, (cl_context context)) {
|
||||
if (!is_valid(context)) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
as_amd(context)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -288,165 +268,159 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetContextInfo, (
|
||||
cl_context context,
|
||||
cl_context_info param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(context)) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetContextInfo,
|
||||
(cl_context context, cl_context_info param_name, size_t param_value_size,
|
||||
void* param_value, size_t* param_value_size_ret)) {
|
||||
if (!is_valid(context)) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
switch (param_name) {
|
||||
switch (param_name) {
|
||||
case CL_CONTEXT_REFERENCE_COUNT: {
|
||||
cl_uint count = as_amd(context)->referenceCount();
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint count = as_amd(context)->referenceCount();
|
||||
return amd::clGetInfo(count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_CONTEXT_NUM_DEVICES: {
|
||||
cl_uint numDevices = (cl_uint)as_amd(context)->devices().size();
|
||||
return amd::clGetInfo(
|
||||
numDevices, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint numDevices = (cl_uint)as_amd(context)->devices().size();
|
||||
return amd::clGetInfo(numDevices, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_CONTEXT_DEVICES: {
|
||||
const std::vector<amd::Device*>& devices = as_amd(context)->devices();
|
||||
size_t numDevices = devices.size();
|
||||
size_t valueSize = numDevices * sizeof(cl_device_id*);
|
||||
const std::vector<amd::Device*>& devices = as_amd(context)->devices();
|
||||
size_t numDevices = devices.size();
|
||||
size_t valueSize = numDevices * sizeof(cl_device_id*);
|
||||
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if (param_value != NULL) {
|
||||
cl_device_id* device_list = (cl_device_id*)param_value;
|
||||
std::vector<amd::Device*>::const_iterator it;
|
||||
for (it = devices.begin(); it != devices.end(); ++it) {
|
||||
*device_list++ = const_cast<cl_device_id>(as_cl(*it));
|
||||
}
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if (param_value != NULL) {
|
||||
cl_device_id* device_list = (cl_device_id*) param_value;
|
||||
std::vector<amd::Device*>::const_iterator it;
|
||||
for (it = devices.begin(); it != devices.end(); ++it) {
|
||||
*device_list++ = const_cast<cl_device_id>(as_cl(*it));
|
||||
}
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_CONTEXT_PROPERTIES: {
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
size_t valueSize = amdContext->info().propertiesSize_;
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
size_t valueSize = amdContext->info().propertiesSize_;
|
||||
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if ((param_value != NULL) && (valueSize != 0)) {
|
||||
::memcpy(param_value, amdContext->properties(), valueSize);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if ((param_value != NULL) && (valueSize != 0)) {
|
||||
::memcpy(param_value, amdContext->properties(), valueSize);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
#ifdef _WIN32
|
||||
case CL_CONTEXT_D3D10_DEVICE_KHR: {
|
||||
// Not defined in the ext.spec, but tested in the conf.test
|
||||
// Guessing functionality from the test...
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D10DeviceKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*) param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D10DeviceKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
// Not defined in the ext.spec, but tested in the conf.test
|
||||
// Guessing functionality from the test...
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D10DeviceKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*)param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D10DeviceKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR: {
|
||||
if (param_value != NULL && param_value_size < sizeof(cl_bool)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(cl_bool);
|
||||
if (param_value != NULL) {
|
||||
*(cl_bool*) param_value = CL_TRUE;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
if (param_value != NULL && param_value_size < sizeof(cl_bool)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(cl_bool);
|
||||
if (param_value != NULL) {
|
||||
*(cl_bool*)param_value = CL_TRUE;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_CONTEXT_D3D11_DEVICE_KHR: {
|
||||
// Not defined in the ext.spec, but tested in the conf.test
|
||||
// Guessing functionality from the test...
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D11DeviceKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*) param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D11DeviceKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
// Not defined in the ext.spec, but tested in the conf.test
|
||||
// Guessing functionality from the test...
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D11DeviceKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*)param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D11DeviceKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_CONTEXT_D3D11_PREFER_SHARED_RESOURCES_KHR: {
|
||||
if (param_value != NULL && param_value_size < sizeof(cl_bool)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(cl_bool);
|
||||
if (param_value != NULL) {
|
||||
*(cl_bool*) param_value = CL_TRUE;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
if (param_value != NULL && param_value_size < sizeof(cl_bool)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(cl_bool);
|
||||
if (param_value != NULL) {
|
||||
*(cl_bool*)param_value = CL_TRUE;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_CONTEXT_ADAPTER_D3D9_KHR: {
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D9DeviceKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*) param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D9DeviceKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D9DeviceKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*)param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D9DeviceKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_CONTEXT_ADAPTER_D3D9EX_KHR: {
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D9DeviceEXKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*) param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D9DeviceEXKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D9DeviceEXKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*)param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D9DeviceEXKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_CONTEXT_ADAPTER_DXVA_KHR: {
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D9DeviceVAKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*) param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D9DeviceVAKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
if (param_value != NULL && param_value_size < sizeof(void*)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
const amd::Context* amdContext = as_amd(context);
|
||||
if (!(amdContext->info().flags_ & amd::Context::D3D9DeviceVAKhr)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = sizeof(intptr_t);
|
||||
if (param_value != NULL) {
|
||||
*(intptr_t*)param_value =
|
||||
reinterpret_cast<intptr_t>(amdContext->info().hDev_[amd::Context::D3D9DeviceVAKhrIdx]);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
#endif //_WIN32
|
||||
#endif //_WIN32
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -465,158 +439,151 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.2r07
|
||||
*/
|
||||
CL_API_ENTRY void* CL_API_CALL clGetExtensionFunctionAddressForPlatform(
|
||||
cl_platform_id platform,
|
||||
const char *funcname)
|
||||
{
|
||||
if (platform != NULL && platform != AMD_PLATFORM) {
|
||||
return NULL;
|
||||
}
|
||||
CL_API_ENTRY void* CL_API_CALL clGetExtensionFunctionAddressForPlatform(cl_platform_id platform,
|
||||
const char* funcname) {
|
||||
if (platform != NULL && platform != AMD_PLATFORM) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return clGetExtensionFunctionAddress(funcname);
|
||||
return clGetExtensionFunctionAddress(funcname);
|
||||
}
|
||||
|
||||
CL_API_ENTRY void* CL_API_CALL
|
||||
clGetExtensionFunctionAddress(const char* func_name)
|
||||
{
|
||||
#define CL_EXTENSION_ENTRYPOINT_CHECK(name) \
|
||||
if (!strcmp(func_name, #name)) return reinterpret_cast<void*>(name);
|
||||
#define CL_EXTENSION_ENTRYPOINT_CHECK2(name1,name2) \
|
||||
if (!strcmp(func_name, #name1)) return reinterpret_cast<void*>(name2);
|
||||
CL_API_ENTRY void* CL_API_CALL clGetExtensionFunctionAddress(const char* func_name) {
|
||||
#define CL_EXTENSION_ENTRYPOINT_CHECK(name) \
|
||||
if (!strcmp(func_name, #name)) return reinterpret_cast<void*>(name);
|
||||
#define CL_EXTENSION_ENTRYPOINT_CHECK2(name1, name2) \
|
||||
if (!strcmp(func_name, #name1)) return reinterpret_cast<void*>(name2);
|
||||
|
||||
switch (func_name[2]) {
|
||||
switch (func_name[2]) {
|
||||
case 'C':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateEventFromGLsyncKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreatePerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateThreadTraceAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromGLBuffer);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromGLTexture2D);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromGLTexture3D);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromGLRenderbuffer);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateEventFromGLsyncKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreatePerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateThreadTraceAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromGLBuffer);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromGLTexture2D);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromGLTexture3D);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromGLRenderbuffer);
|
||||
#ifdef _WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromD3D10BufferKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromD3D10Texture2DKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromD3D10Texture3DKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromDX9MediaSurfaceKHR);
|
||||
#endif //_WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromD3D10BufferKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromD3D10Texture2DKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromD3D10Texture3DKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateFromDX9MediaSurfaceKHR);
|
||||
#endif //_WIN32
|
||||
#ifdef cl_ext_device_fission
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateSubDevicesEXT);
|
||||
#endif // cl_ext_device_fission
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateKeyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clConvertImageAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateBufferFromImageAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateSubDevicesEXT);
|
||||
#endif // cl_ext_device_fission
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateKeyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clConvertImageAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateBufferFromImageAMD);
|
||||
#if cl_khr_il_program
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateProgramWithILKHR);
|
||||
#endif // cl_khr_il_program
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateProgramWithILKHR);
|
||||
#endif // cl_khr_il_program
|
||||
#if cl_amd_liquid_flash
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateSsgFileObjectAMD);
|
||||
#endif // cl_amd_liquid_flash
|
||||
break;
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateSsgFileObjectAMD);
|
||||
#endif // cl_amd_liquid_flash
|
||||
break;
|
||||
case 'D':
|
||||
break;
|
||||
break;
|
||||
case 'E':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueBeginPerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueEndPerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueAcquireGLObjects);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReleaseGLObjects);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueBindThreadTraceBufferAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueThreadTraceCommandAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueBeginPerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueEndPerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueAcquireGLObjects);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReleaseGLObjects);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueBindThreadTraceBufferAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueThreadTraceCommandAMD);
|
||||
#ifdef _WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueAcquireD3D10ObjectsKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReleaseD3D10ObjectsKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueAcquireDX9MediaSurfacesKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReleaseDX9MediaSurfacesKHR);
|
||||
#endif //_WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueWaitSignalAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueWriteSignalAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueMakeBuffersResidentAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueAcquireD3D10ObjectsKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReleaseD3D10ObjectsKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueAcquireDX9MediaSurfacesKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReleaseDX9MediaSurfacesKHR);
|
||||
#endif //_WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueWaitSignalAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueWriteSignalAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueMakeBuffersResidentAMD);
|
||||
#if cl_amd_liquid_flash
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReadSsgFileAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueWriteSsgFileAMD);
|
||||
#endif // cl_amd_liquid_flash
|
||||
break;
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReadSsgFileAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueWriteSsgFileAMD);
|
||||
#endif // cl_amd_liquid_flash
|
||||
break;
|
||||
case 'G':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetKernelInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetPerfCounterInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetGLObjectInfo);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetGLTextureInfo);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetGLContextInfoKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetThreadTraceInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetKernelInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetPerfCounterInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetGLObjectInfo);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetGLTextureInfo);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetGLContextInfoKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetThreadTraceInfoAMD);
|
||||
#ifdef _WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetDeviceIDsFromD3D10KHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetDeviceIDsFromDX9MediaAdapterKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetPlaneFromImageAMD);
|
||||
#endif //_WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetKernelSubGroupInfoKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetDeviceIDsFromD3D10KHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetDeviceIDsFromDX9MediaAdapterKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetPlaneFromImageAMD);
|
||||
#endif //_WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetKernelSubGroupInfoKHR);
|
||||
#if cl_amd_liquid_flash
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetSsgFileObjectInfoAMD);
|
||||
#endif // cl_amd_liquid_flash
|
||||
break;
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetSsgFileObjectInfoAMD);
|
||||
#endif // cl_amd_liquid_flash
|
||||
break;
|
||||
case 'H':
|
||||
#ifdef _WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetCallBackFunctionsAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetCallBackArgumentsAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgFlushCacheAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetExceptionPolicyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetExceptionPolicyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetKernelExecutionModeAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetKernelExecutionModeAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgCreateEventAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgWaitEventAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgDestroyEventAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgRegisterDebuggerAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgUnregisterDebuggerAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetAclBinaryAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgWaveControlAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgAddressWatchAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetAqlPacketInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetDispatchDebugInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgMapKernelCodeAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgUnmapKernelCodeAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgMapScratchRingAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgUnmapScratchRingAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetKernelParamMemAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetGlobalMemoryAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgInstallTrapAMD);
|
||||
#endif //_WIN32
|
||||
break;
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetCallBackFunctionsAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetCallBackArgumentsAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgFlushCacheAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetExceptionPolicyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetExceptionPolicyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetKernelExecutionModeAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetKernelExecutionModeAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgCreateEventAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgWaitEventAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgDestroyEventAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgRegisterDebuggerAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgUnregisterDebuggerAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetAclBinaryAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgWaveControlAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgAddressWatchAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetAqlPacketInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetDispatchDebugInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgMapKernelCodeAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgUnmapKernelCodeAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgMapScratchRingAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgUnmapScratchRingAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgGetKernelParamMemAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgSetGlobalMemoryAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clHwDbgInstallTrapAMD);
|
||||
#endif //_WIN32
|
||||
break;
|
||||
case 'I':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clIcdGetPlatformIDsKHR);
|
||||
break;
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clIcdGetPlatformIDsKHR);
|
||||
break;
|
||||
case 'O':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clObjectGetValueForKeyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clObjectSetValueForKeyAMD);
|
||||
break;
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clObjectGetValueForKeyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clObjectSetValueForKeyAMD);
|
||||
break;
|
||||
case 'R':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleasePerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainPerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleaseThreadTraceAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainThreadTraceAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleasePerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainPerfCounterAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleaseThreadTraceAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainThreadTraceAMD);
|
||||
#ifdef cl_ext_device_fission
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainDeviceEXT);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleaseDeviceEXT);
|
||||
#endif // cl_ext_device_fission
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainDeviceEXT);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleaseDeviceEXT);
|
||||
#endif // cl_ext_device_fission
|
||||
#if cl_amd_liquid_flash
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainSsgFileObjectAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleaseSsgFileObjectAMD);
|
||||
#endif // cl_amd_liquid_flash
|
||||
break;
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainSsgFileObjectAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleaseSsgFileObjectAMD);
|
||||
#endif // cl_amd_liquid_flash
|
||||
break;
|
||||
case 'S':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clSetThreadTraceParamAMD);
|
||||
break;
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clSetThreadTraceParamAMD);
|
||||
break;
|
||||
case 'U':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clUnloadPlatformAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clUnloadPlatformAMD);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clTerminateContextKHR, (cl_context context))
|
||||
{
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clTerminateContextKHR, (cl_context context)) { return CL_INVALID_CONTEXT; }
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
|
||||
@@ -25,14 +25,11 @@
|
||||
*
|
||||
* \version 1.1r18
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_counter_amd, clCreateCounterAMD, (
|
||||
cl_context context,
|
||||
cl_counter_flags_amd flags,
|
||||
cl_uint value,
|
||||
cl_int * errcode_ret))
|
||||
{
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
return (cl_counter_amd)0;
|
||||
RUNTIME_ENTRY_RET(cl_counter_amd, clCreateCounterAMD,
|
||||
(cl_context context, cl_counter_flags_amd flags, cl_uint value,
|
||||
cl_int* errcode_ret)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
return (cl_counter_amd)0;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -40,14 +37,10 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.1r18
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetCounterInfoAMD, (
|
||||
cl_counter_amd counter,
|
||||
cl_counter_info_amd param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret))
|
||||
{
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
RUNTIME_ENTRY(cl_int, clGetCounterInfoAMD,
|
||||
(cl_counter_amd counter, cl_counter_info_amd param_name, size_t param_value_size,
|
||||
void* param_value, size_t* param_value_size_ret)) {
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -60,13 +53,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.1r18
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clRetainCounterAMD, (cl_counter_amd counter))
|
||||
{
|
||||
if (!is_valid(counter)) {
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
}
|
||||
as_amd(counter)->retain();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clRetainCounterAMD, (cl_counter_amd counter)) {
|
||||
if (!is_valid(counter)) {
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
}
|
||||
as_amd(counter)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -79,13 +71,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.1r18
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clReleaseCounterAMD, (cl_counter_amd counter))
|
||||
{
|
||||
if (!is_valid(counter)) {
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
}
|
||||
as_amd(counter)->release();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clReleaseCounterAMD, (cl_counter_amd counter)) {
|
||||
if (!is_valid(counter)) {
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
}
|
||||
as_amd(counter)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -93,16 +84,11 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.1r18
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueReadCounterAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_counter_amd counter,
|
||||
cl_bool blocking_read,
|
||||
cl_uint * value,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event))
|
||||
{
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueReadCounterAMD,
|
||||
(cl_command_queue command_queue, cl_counter_amd counter, cl_bool blocking_read,
|
||||
cl_uint* value, cl_uint num_events_in_wait_list, const cl_event* event_wait_list,
|
||||
cl_event* event)) {
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -110,16 +96,11 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.1r18
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWriteCounterAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_counter_amd counter,
|
||||
cl_bool blocking_write,
|
||||
cl_uint value,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event))
|
||||
{
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWriteCounterAMD,
|
||||
(cl_command_queue command_queue, cl_counter_amd counter, cl_bool blocking_write,
|
||||
cl_uint value, cl_uint num_events_in_wait_list, const cl_event* event_wait_list,
|
||||
cl_event* event)) {
|
||||
return CL_INVALID_COUNTER_AMD;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -127,4 +108,4 @@ RUNTIME_EXIT
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif // cl_amd_atomic_counters
|
||||
#endif // cl_amd_atomic_counters
|
||||
|
||||
+1112
-1275
Plik diff jest za duży
Load Diff
+1299
-1466
Plik diff jest za duży
Load Diff
Plik diff jest za duży
Load Diff
Plik diff jest za duży
Load Diff
@@ -106,22 +106,21 @@ jurisdiction and venue of these courts.
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#define CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD -80
|
||||
#define CL_DEBUGGER_REGISTER_FAILURE_AMD -81
|
||||
#define CL_TRAP_HANDLER_NOT_DEFINED_AMD -82
|
||||
#define CL_EVENT_TIMEOUT_AMD -83
|
||||
#define CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD -80
|
||||
#define CL_DEBUGGER_REGISTER_FAILURE_AMD -81
|
||||
#define CL_TRAP_HANDLER_NOT_DEFINED_AMD -82
|
||||
#define CL_EVENT_TIMEOUT_AMD -83
|
||||
|
||||
|
||||
typedef uintptr_t cl_dbg_event_amd; //! debug event
|
||||
typedef uintptr_t cl_dbg_event_amd; //! debug event
|
||||
|
||||
/*! \brief Trap Handler Type
|
||||
*
|
||||
* The trap handler for each support type.
|
||||
*/
|
||||
enum cl_dbg_trap_type_amd
|
||||
{
|
||||
CL_DBG_DEBUG_TRAP = 0, //! HW debug
|
||||
CL_DBG_MAX_TRAP
|
||||
enum cl_dbg_trap_type_amd {
|
||||
CL_DBG_DEBUG_TRAP = 0, //! HW debug
|
||||
CL_DBG_MAX_TRAP
|
||||
};
|
||||
|
||||
/*! \brief Wave actions used to control the wave execution on the hardware
|
||||
@@ -130,15 +129,14 @@ enum cl_dbg_trap_type_amd
|
||||
* behavior when calling the wave control function. Overall, there are
|
||||
* five types of operations that can be specified.
|
||||
*/
|
||||
enum cl_dbg_waves_action_amd
|
||||
{
|
||||
CL_DBG_WAVES_DONT_USE_ZERO = 0, //! NOT USED
|
||||
CL_DBG_WAVES_HALT = 1, //! halt wave
|
||||
CL_DBG_WAVES_RESUME = 2, //! resume wave
|
||||
CL_DBG_WAVES_KILL = 3, //! kill wave
|
||||
CL_DBG_WAVES_DEBUG = 4, //! debug wave
|
||||
CL_DBG_WAVES_TRAP = 5, //! trap
|
||||
CL_DBG_WAVES_MAX
|
||||
enum cl_dbg_waves_action_amd {
|
||||
CL_DBG_WAVES_DONT_USE_ZERO = 0, //! NOT USED
|
||||
CL_DBG_WAVES_HALT = 1, //! halt wave
|
||||
CL_DBG_WAVES_RESUME = 2, //! resume wave
|
||||
CL_DBG_WAVES_KILL = 3, //! kill wave
|
||||
CL_DBG_WAVES_DEBUG = 4, //! debug wave
|
||||
CL_DBG_WAVES_TRAP = 5, //! trap
|
||||
CL_DBG_WAVES_MAX
|
||||
};
|
||||
|
||||
/*! \brief Host actions when encountering an exception in the kernel.
|
||||
@@ -146,11 +144,10 @@ enum cl_dbg_waves_action_amd
|
||||
* The host action enumeration is used to specify the desired host
|
||||
* response in the event thatn a device kernel exception is encountered.
|
||||
*/
|
||||
enum cl_dbg_host_action_amd
|
||||
{
|
||||
CL_DBG_HOST_IGNORE = 1, //! ignore the kernel exception
|
||||
CL_DBG_HOST_EXIT = 2, //! exit the host application on a kernel exception
|
||||
CL_DBG_HOST_NOTIFY = 4 //! report the kernel exception
|
||||
enum cl_dbg_host_action_amd {
|
||||
CL_DBG_HOST_IGNORE = 1, //! ignore the kernel exception
|
||||
CL_DBG_HOST_EXIT = 2, //! exit the host application on a kernel exception
|
||||
CL_DBG_HOST_NOTIFY = 4 //! report the kernel exception
|
||||
};
|
||||
|
||||
/*! \brief Mode of the wave action when calling the wave control function
|
||||
@@ -158,25 +155,23 @@ enum cl_dbg_host_action_amd
|
||||
* The wave mode enumerations are used to specify the desired
|
||||
* broadcast level when calling the wave control function.
|
||||
*/
|
||||
enum cl_dbg_wave_mode_amd
|
||||
{
|
||||
CL_DBG_WAVEMODE_SINGLE = 0, //! send command to single wave
|
||||
CL_DBG_WAVEMODE_BROADCAST = 2, //! send command to wave with match VMID
|
||||
CL_DBG_WAVEMODE_BROADCAST_CU = 3, //! send command to wave with match VMID with specific CU
|
||||
CL_DBG_WAVEMODE_MAX
|
||||
enum cl_dbg_wave_mode_amd {
|
||||
CL_DBG_WAVEMODE_SINGLE = 0, //! send command to single wave
|
||||
CL_DBG_WAVEMODE_BROADCAST = 2, //! send command to wave with match VMID
|
||||
CL_DBG_WAVEMODE_BROADCAST_CU = 3, //! send command to wave with match VMID with specific CU
|
||||
CL_DBG_WAVEMODE_MAX
|
||||
};
|
||||
|
||||
/*! \brief Enumeration of address watch mode
|
||||
*
|
||||
* This enumeration indicates the different modes of address watch.
|
||||
*/
|
||||
enum cl_dbg_address_watch_mode_amd
|
||||
{
|
||||
CL_DBG_ADDR_WATCH_MODE_READ = 0, //! Read operations only
|
||||
CL_DBG_ADDR_WATCH_MODE_NONREAD = 1, //! Write or Atomic operations only
|
||||
CL_DBG_ADDR_WATCH_MODE_ATOMIC = 2, //! Atomic Operations only
|
||||
CL_DBG_ADDR_WATCH_MODE_ALL = 3, //! Read, Write or Atomic operations
|
||||
CL_DBG_ADDR_WATCH_MODE_MAX //! Number of address watch modes
|
||||
enum cl_dbg_address_watch_mode_amd {
|
||||
CL_DBG_ADDR_WATCH_MODE_READ = 0, //! Read operations only
|
||||
CL_DBG_ADDR_WATCH_MODE_NONREAD = 1, //! Write or Atomic operations only
|
||||
CL_DBG_ADDR_WATCH_MODE_ATOMIC = 2, //! Atomic Operations only
|
||||
CL_DBG_ADDR_WATCH_MODE_ALL = 3, //! Read, Write or Atomic operations
|
||||
CL_DBG_ADDR_WATCH_MODE_MAX //! Number of address watch modes
|
||||
};
|
||||
|
||||
/*! \brief Dispatch exception policy descriptor
|
||||
@@ -185,12 +180,11 @@ enum cl_dbg_address_watch_mode_amd
|
||||
* expected exception policy in the event an exception is encountered
|
||||
* on the associated dispatch.
|
||||
*/
|
||||
typedef struct _cl_dbg_exception_policy_amd
|
||||
{
|
||||
cl_uint exceptionMask; //! exception mask
|
||||
cl_dbg_waves_action_amd waveAction; //! wave action
|
||||
cl_dbg_host_action_amd hostAction; //! host action
|
||||
cl_dbg_wave_mode_amd waveMode; //! wave mode
|
||||
typedef struct _cl_dbg_exception_policy_amd {
|
||||
cl_uint exceptionMask; //! exception mask
|
||||
cl_dbg_waves_action_amd waveAction; //! wave action
|
||||
cl_dbg_host_action_amd hostAction; //! host action
|
||||
cl_dbg_wave_mode_amd waveMode; //! wave mode
|
||||
} cl_dbg_exception_policy_amd;
|
||||
|
||||
/*! \brief Kernel execution mode
|
||||
@@ -205,83 +199,78 @@ typedef struct _cl_dbg_exception_policy_amd
|
||||
* 5. Disable L2 cache (0: enable (default), 1: disable)
|
||||
* 6. Num of CUs reserved for display (0 (default), 7: max)
|
||||
*/
|
||||
typedef struct _cl_dbg_kernel_exec_mode_amd
|
||||
{
|
||||
union {
|
||||
struct {
|
||||
cl_uint monitorMode : 1;
|
||||
cl_uint gpuSingleStepMode : 1;
|
||||
cl_uint disableL1Scalar : 1;
|
||||
cl_uint disableL1Vector : 1;
|
||||
cl_uint disableL2Cache : 1;
|
||||
cl_uint reservedCuNum : 3;
|
||||
cl_uint reserved : 24;
|
||||
};
|
||||
cl_uint ui32All;
|
||||
typedef struct _cl_dbg_kernel_exec_mode_amd {
|
||||
union {
|
||||
struct {
|
||||
cl_uint monitorMode : 1;
|
||||
cl_uint gpuSingleStepMode : 1;
|
||||
cl_uint disableL1Scalar : 1;
|
||||
cl_uint disableL1Vector : 1;
|
||||
cl_uint disableL2Cache : 1;
|
||||
cl_uint reservedCuNum : 3;
|
||||
cl_uint reserved : 24;
|
||||
};
|
||||
cl_uint ui32All;
|
||||
};
|
||||
} cl_dbg_kernel_exec_mode_amd;
|
||||
|
||||
/*! \brief GPU cache mask
|
||||
*
|
||||
* This structure is used to specify the GPU cache to be flushed/invalidated
|
||||
*/
|
||||
typedef struct _cl_dbg_gpu_cache_mask_amd
|
||||
{
|
||||
union {
|
||||
struct {
|
||||
cl_uint sqICache : 1; //! instruction cache
|
||||
cl_uint sqKCache : 1; //! data cache
|
||||
cl_uint tcL1 : 1; //! tcL1 cache
|
||||
cl_uint tcL2 : 1; //! tcL2 cache
|
||||
cl_uint reserved : 28;
|
||||
};
|
||||
cl_uint ui32All;
|
||||
typedef struct _cl_dbg_gpu_cache_mask_amd {
|
||||
union {
|
||||
struct {
|
||||
cl_uint sqICache : 1; //! instruction cache
|
||||
cl_uint sqKCache : 1; //! data cache
|
||||
cl_uint tcL1 : 1; //! tcL1 cache
|
||||
cl_uint tcL2 : 1; //! tcL2 cache
|
||||
cl_uint reserved : 28;
|
||||
};
|
||||
cl_uint ui32All;
|
||||
};
|
||||
} cl_dbg_gpu_cache_mask_amd;
|
||||
|
||||
/*! \brief Dispatch Debug Info
|
||||
*
|
||||
* This structure is used to store the scratch and global memory descriptors
|
||||
*/
|
||||
typedef struct _cl_dispatch_debug_info_amd
|
||||
{
|
||||
cl_uint scratchMemoryDescriptor[4]; //! Scratch memory descriptors
|
||||
cl_uint globalMemoryDescriptor[4]; //! Global memory descriptors
|
||||
typedef struct _cl_dispatch_debug_info_amd {
|
||||
cl_uint scratchMemoryDescriptor[4]; //! Scratch memory descriptors
|
||||
cl_uint globalMemoryDescriptor[4]; //! Global memory descriptors
|
||||
} cl_dispatch_debug_info_amd;
|
||||
|
||||
/*! \brief AQL Packet Info
|
||||
*
|
||||
* This structure is used to store AQL packet informatin for kernel dispatch
|
||||
*/
|
||||
typedef struct _cl_aql_packet_info_amd
|
||||
{
|
||||
cl_uint trapReservedVgprIndex; //! VGPR index reserved for trap
|
||||
//! value is -1 when kernel was not compiled
|
||||
//! in debug mode.
|
||||
cl_uint scratchBufferWaveOffset; //! scratch buffer wave offset
|
||||
//! value is -1 when kernel was not compiled
|
||||
//! in debug mode or scratch buffer is not enabled
|
||||
void *pointerToIsaBuffer; //! Pointer to buffer containing ISA
|
||||
size_t sizeOfIsaBuffer; //! Size of the ISA buffer
|
||||
typedef struct _cl_aql_packet_info_amd {
|
||||
cl_uint trapReservedVgprIndex; //! VGPR index reserved for trap
|
||||
//! value is -1 when kernel was not compiled
|
||||
//! in debug mode.
|
||||
cl_uint scratchBufferWaveOffset; //! scratch buffer wave offset
|
||||
//! value is -1 when kernel was not compiled
|
||||
//! in debug mode or scratch buffer is not enabled
|
||||
void* pointerToIsaBuffer; //! Pointer to buffer containing ISA
|
||||
size_t sizeOfIsaBuffer; //! Size of the ISA buffer
|
||||
|
||||
cl_uint numberOfVgprs; //! Number of VGPRs used by the kernel
|
||||
cl_uint numberOfSgprs; //! Number of SGPRs used by the kernel
|
||||
size_t sizeOfStaticGroupMemory; //! Static local memory used by the kernel
|
||||
cl_uint numberOfVgprs; //! Number of VGPRs used by the kernel
|
||||
cl_uint numberOfSgprs; //! Number of SGPRs used by the kernel
|
||||
size_t sizeOfStaticGroupMemory; //! Static local memory used by the kernel
|
||||
} cl_aql_packet_info_amd;
|
||||
|
||||
/*! \brief Wave address
|
||||
*
|
||||
* This structure specifies the wave for the SQ control command
|
||||
*/
|
||||
typedef struct _cl_dbg_wave_addr_amd
|
||||
{
|
||||
cl_uint shaderEngine : 2; //! Shader engine
|
||||
cl_uint shaderArray : 1; //! Shader array
|
||||
cl_uint computeUnit : 4; //! Compute unit
|
||||
cl_uint simd : 2; //! SIMD id
|
||||
cl_uint wave : 4; //! Wave id
|
||||
cl_uint vmid : 4; //! VMID
|
||||
cl_uint reserved : 15;
|
||||
typedef struct _cl_dbg_wave_addr_amd {
|
||||
cl_uint shaderEngine : 2; //! Shader engine
|
||||
cl_uint shaderArray : 1; //! Shader array
|
||||
cl_uint computeUnit : 4; //! Compute unit
|
||||
cl_uint simd : 2; //! SIMD id
|
||||
cl_uint wave : 4; //! Wave id
|
||||
cl_uint vmid : 4; //! VMID
|
||||
cl_uint reserved : 15;
|
||||
|
||||
} cl_dbg_wave_addr_amd;
|
||||
|
||||
@@ -291,11 +280,9 @@ typedef struct _cl_dbg_wave_addr_amd
|
||||
* dispatch. The call back function is to indicate the start of the
|
||||
* the kernel launch. It is used by the debugger.
|
||||
*/
|
||||
typedef void * (*cl_PreDispatchCallBackFunctionAMD) ( cl_device_id device,
|
||||
void *ocl_event_handle,
|
||||
const void *aql_packet,
|
||||
void *acl_binary,
|
||||
void *user_args);
|
||||
typedef void* (*cl_PreDispatchCallBackFunctionAMD)(cl_device_id device, void* ocl_event_handle,
|
||||
const void* aql_packet, void* acl_binary,
|
||||
void* user_args);
|
||||
|
||||
/*! \brief Post-dispatch call back function signature
|
||||
*
|
||||
@@ -303,9 +290,8 @@ typedef void * (*cl_PreDispatchCallBackFunctionAMD) ( cl_device_id device,
|
||||
* dispatch. The call back function is to indicate the completion of
|
||||
* the the kernel launch. It is used by the debugger.
|
||||
*/
|
||||
typedef void * (*cl_PostDispatchCallBackFunctionAMD) ( cl_device_id device,
|
||||
cl_ulong event,
|
||||
void *user_args);
|
||||
typedef void* (*cl_PostDispatchCallBackFunctionAMD)(cl_device_id device, cl_ulong event,
|
||||
void* user_args);
|
||||
|
||||
/*! \brief Set up the dispatch call back function pointers
|
||||
*
|
||||
@@ -321,10 +307,9 @@ typedef void * (*cl_PostDispatchCallBackFunctionAMD) ( cl_device_id device,
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetCallBackFunctionsAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_PreDispatchCallBackFunctionAMD /* preDispatchFunction */,
|
||||
cl_PostDispatchCallBackFunctionAMD /* postDispatchFunction */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_device_id /* device */, cl_PreDispatchCallBackFunctionAMD /* preDispatchFunction */,
|
||||
cl_PostDispatchCallBackFunctionAMD /* postDispatchFunction */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Set up the arguments of the dispatch call back function
|
||||
@@ -340,11 +325,10 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetCallBackFunctionsAMD(
|
||||
* - CL_INVALID_DEVICE if the device is not valid
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetCallBackArgumentsAMD(
|
||||
cl_device_id /* device */,
|
||||
void * /* preDispatchArgs */,
|
||||
void * /* postDispatchArgs */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetCallBackArgumentsAMD(cl_device_id /* device */,
|
||||
void* /* preDispatchArgs */,
|
||||
void* /* postDispatchArgs */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Invalidate all cache on the device.
|
||||
@@ -358,10 +342,9 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetCallBackArgumentsAMD(
|
||||
* - CL_INVALID_DEVICE if the device is not valid
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgFlushCacheAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_gpu_cache_mask_amd /* mask */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgFlushCacheAMD(cl_device_id /* device */,
|
||||
cl_dbg_gpu_cache_mask_amd /* mask */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Set up an exception policy in the trap handler object
|
||||
@@ -378,9 +361,8 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgFlushCacheAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetExceptionPolicyAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_exception_policy_amd * /* policy */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_device_id /* device */, cl_dbg_exception_policy_amd* /* policy */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Get the exception policy in the trap handler object
|
||||
*
|
||||
@@ -395,9 +377,8 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetExceptionPolicyAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetExceptionPolicyAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_exception_policy_amd * /* policy */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_device_id /* device */, cl_dbg_exception_policy_amd* /* policy */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Set up the kernel execution mode in the trap handler object
|
||||
*
|
||||
@@ -413,9 +394,8 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetExceptionPolicyAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetKernelExecutionModeAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_kernel_exec_mode_amd * /* mode */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_device_id /* device */, cl_dbg_kernel_exec_mode_amd* /* mode */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Get the kernel execution mode in the trap handler object
|
||||
@@ -431,9 +411,8 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetKernelExecutionModeAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetKernelExecutionModeAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_kernel_exec_mode_amd * /* mode */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_device_id /* device */, cl_dbg_kernel_exec_mode_amd* /* mode */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Create a debug event
|
||||
@@ -453,12 +432,11 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetKernelExecutionModeAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
* - CL_OUT_OF_RESOURCES if fails to create the event
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgCreateEventAMD(
|
||||
cl_device_id /* device */,
|
||||
bool /* autoReset */,
|
||||
cl_dbg_event_amd * /* pDebugEvent */,
|
||||
cl_uint * /* pEventId */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgCreateEventAMD(cl_device_id /* device */,
|
||||
bool /* autoReset */,
|
||||
cl_dbg_event_amd* /* pDebugEvent */,
|
||||
cl_uint* /* pEventId */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Wait for a debug event to be signaled
|
||||
*
|
||||
@@ -477,12 +455,11 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgCreateEventAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
* - CL_EVENT_TIMEOUT_AMD if timeout occurs
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgWaitEventAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_event_amd /* pDebugEvent */,
|
||||
cl_uint /* pEventId */,
|
||||
cl_uint /* timeOut */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgWaitEventAMD(cl_device_id /* device */,
|
||||
cl_dbg_event_amd /* pDebugEvent */,
|
||||
cl_uint /* pEventId */,
|
||||
cl_uint /* timeOut */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Destroy a debug event
|
||||
*
|
||||
@@ -498,11 +475,10 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgWaitEventAMD(
|
||||
* - CL_INVALID_VALUE if the pDebugEvent value is NULL
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgDestroyEventAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_event_amd * /* pDebugEvent */,
|
||||
cl_uint * /* pEventId */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgDestroyEventAMD(cl_device_id /* device */,
|
||||
cl_dbg_event_amd* /* pDebugEvent */,
|
||||
cl_uint* /* pEventId */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Register the debugger on a device
|
||||
@@ -522,10 +498,8 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgDestroyEventAMD(
|
||||
* - CL_OUT_OF_RESOURCES if a host queue cannot be created for the debugger
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgRegisterDebuggerAMD(
|
||||
cl_context /* context */,
|
||||
cl_device_id /* device */,
|
||||
volatile void * /* pMessageStorage */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_context /* context */, cl_device_id /* device */, volatile void* /* pMessageStorage */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Unregister the debugger on a device
|
||||
@@ -537,9 +511,8 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgRegisterDebuggerAMD(
|
||||
* - CL_INVALID_DEVICE if the device is not valid
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnregisterDebuggerAMD(
|
||||
cl_device_id /* device */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnregisterDebuggerAMD(cl_device_id /* device */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Setup the pointer of the acl_binary to be used by the debugger
|
||||
*
|
||||
@@ -553,10 +526,9 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnregisterDebuggerAMD(
|
||||
* - CL_INVALID_VALUE if the aclBinary is not provided
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetAclBinaryAMD(
|
||||
cl_device_id /* device */,
|
||||
void * /* aclBinary */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetAclBinaryAMD(cl_device_id /* device */,
|
||||
void* /* aclBinary */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Control the execution of wavefront on the GPU
|
||||
@@ -577,13 +549,12 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetAclBinaryAMD(
|
||||
* - CL_INVALID_VALUE if the waveMsg is not provided, invalid action or mode value
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgWaveControlAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_waves_action_amd /* action */,
|
||||
cl_dbg_wave_mode_amd /* mode */,
|
||||
cl_uint /* trapId */,
|
||||
cl_dbg_wave_addr_amd /* waveAddress */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgWaveControlAMD(cl_device_id /* device */,
|
||||
cl_dbg_waves_action_amd /* action */,
|
||||
cl_dbg_wave_mode_amd /* mode */,
|
||||
cl_uint /* trapId */,
|
||||
cl_dbg_wave_addr_amd /* waveAddress */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Set watch points on memory address ranges to generate exception events
|
||||
*
|
||||
@@ -606,13 +577,10 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgWaveControlAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgAddressWatchAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_uint /* numWatchPoints */,
|
||||
cl_dbg_address_watch_mode_amd * /* watchMode */,
|
||||
void ** /* watchAddress */,
|
||||
cl_ulong * /* watchMask */,
|
||||
cl_dbg_event_amd * /* watchEvent */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_device_id /* device */, cl_uint /* numWatchPoints */,
|
||||
cl_dbg_address_watch_mode_amd* /* watchMode */, void** /* watchAddress */,
|
||||
cl_ulong* /* watchMask */, cl_dbg_event_amd* /* watchEvent */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Get the packaet information for kernel execution
|
||||
*
|
||||
@@ -628,10 +596,9 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgAddressWatchAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetAqlPacketInfoAMD(
|
||||
cl_device_id /* device */,
|
||||
const void * /* aqlCodeInfo */,
|
||||
cl_aql_packet_info_amd * /* packetInfo */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_device_id /* device */, const void* /* aqlCodeInfo */,
|
||||
cl_aql_packet_info_amd* /* packetInfo */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Get the dispatch debug information
|
||||
@@ -646,16 +613,16 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetAqlPacketInfoAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetDispatchDebugInfoAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dispatch_debug_info_amd * /* debugInfo */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
cl_device_id /* device */, cl_dispatch_debug_info_amd* /* debugInfo */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Map the video memory for the kernel code to allow host access
|
||||
*
|
||||
* \param device specifies the device to be used
|
||||
*
|
||||
* \param aqlCodeAddress is the memory points to the returned host memory address for the kernel code
|
||||
* \param aqlCodeAddress is the memory points to the returned host memory address for the kernel
|
||||
* code
|
||||
*
|
||||
* \param aqlCodeSize returns the size of the kernel code
|
||||
*
|
||||
@@ -664,10 +631,9 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetDispatchDebugInfoAMD(
|
||||
* - CL_INVALID_DEVICE if the device is not valid
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgMapKernelCodeAMD(
|
||||
cl_device_id /* device */,
|
||||
void * /* aqlCodeInfo */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgMapKernelCodeAMD(cl_device_id /* device */,
|
||||
void* /* aqlCodeInfo */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Unmap the video memory for the kernel code
|
||||
@@ -681,17 +647,17 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgMapKernelCodeAMD(
|
||||
* - CL_INVALID_DEVICE if the device is not valid
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnmapKernelCodeAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_ulong * /* aqlCodeAddress */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnmapKernelCodeAMD(cl_device_id /* device */,
|
||||
cl_ulong* /* aqlCodeAddress */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Map the shader scratch ring's video memory to allow CPU access
|
||||
*
|
||||
* \param device specifies the device to be used
|
||||
*
|
||||
* \param scratchRingAddr is the memory points to the returned host memory address for scratch ring
|
||||
* \param scratchRingAddr is the memory points to the returned host memory address for scratch
|
||||
* ring
|
||||
*
|
||||
* \param scratchRingSize returns the size of the scratch ring
|
||||
*
|
||||
@@ -700,11 +666,10 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnmapKernelCodeAMD(
|
||||
* - CL_INVALID_DEVICE if the device is not valid
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgMapScratchRingAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_ulong * /* scratchRingAddr */,
|
||||
cl_uint * /* scratchRingSize */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgMapScratchRingAMD(cl_device_id /* device */,
|
||||
cl_ulong* /* scratchRingAddr */,
|
||||
cl_uint* /* scratchRingSize */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Unmap the shader scratch ring's video memory
|
||||
*
|
||||
@@ -717,10 +682,9 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgMapScratchRingAMD(
|
||||
* - CL_INVALID_DEVICE if the device is not valid
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnmapScratchRingAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_ulong * /* scratchRingAddr */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnmapScratchRingAMD(cl_device_id /* device */,
|
||||
cl_ulong* /* scratchRingAddr */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Get the memory object associated with the kernel parameter
|
||||
*
|
||||
@@ -737,11 +701,10 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgUnmapScratchRingAMD(
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
* - CL_INVALID_KERNEL_ARGS if it fails to get the memory object for the kernel argument
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetKernelParamMemAMD(
|
||||
cl_device_id /* devicepointer */,
|
||||
cl_uint /* paramIdx */,
|
||||
cl_mem * /* paramMem */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetKernelParamMemAMD(cl_device_id /* devicepointer */,
|
||||
cl_uint /* paramIdx */,
|
||||
cl_mem* /* paramMem */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
/*! \brief Set value of a global memory object
|
||||
*
|
||||
@@ -761,13 +724,12 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgGetKernelParamMemAMD(
|
||||
* - CL_INVALID_VALUE if memObj or srcPtr has NULL value, size <= 0 or offset < 0
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetGlobalMemoryAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_mem /* memObject */,
|
||||
cl_uint /* offset */,
|
||||
void * /* srcMem */,
|
||||
cl_uint /* size */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetGlobalMemoryAMD(cl_device_id /* device */,
|
||||
cl_mem /* memObject */,
|
||||
cl_uint /* offset */,
|
||||
void* /* srcMem */,
|
||||
cl_uint /* size */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
/*! \brief Install the trap handler of a given type
|
||||
@@ -790,17 +752,15 @@ extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgSetGlobalMemoryAMD(
|
||||
* - CL_INVALID_VALUE if trapHandler is NULL or trapHandlerSize <= 0
|
||||
* - CL_HWDBG_MANAGER_NOT_AVAILABLE_AMD if there is no HW DEBUG manager
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgInstallTrapAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_dbg_trap_type_amd /* trapType */,
|
||||
cl_mem /* trapHandler */,
|
||||
cl_mem /* trapBuffer */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clHwDbgInstallTrapAMD(cl_device_id /* device */,
|
||||
cl_dbg_trap_type_amd /* trapType */,
|
||||
cl_mem /* trapHandler */,
|
||||
cl_mem /* trapBuffer */
|
||||
) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*__CL_DEBUGGER_AMD_H*/
|
||||
#endif /*__CL_DEBUGGER_AMD_H*/
|
||||
|
||||
Plik diff jest za duży
Load Diff
@@ -62,45 +62,41 @@
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clWaitForEvents, (
|
||||
cl_uint num_events,
|
||||
const cl_event *event_list))
|
||||
{
|
||||
if (num_events == 0 || event_list == NULL) {
|
||||
return CL_INVALID_VALUE;
|
||||
RUNTIME_ENTRY(cl_int, clWaitForEvents, (cl_uint num_events, const cl_event* event_list)) {
|
||||
if (num_events == 0 || event_list == NULL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
const amd::Context* prevContext = NULL;
|
||||
const amd::HostQueue* prevQueue = NULL;
|
||||
|
||||
for (cl_uint i = 0; i < num_events; ++i) {
|
||||
cl_event event = event_list[i];
|
||||
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
|
||||
const amd::Context* prevContext = NULL;
|
||||
const amd::HostQueue* prevQueue = NULL;
|
||||
|
||||
for (cl_uint i = 0; i < num_events; ++i) {
|
||||
cl_event event = event_list[i];
|
||||
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
|
||||
// Make sure all the events are associated with the same context
|
||||
const amd::Context* context = &as_amd(event)->context();
|
||||
if (prevContext != NULL && prevContext != context) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
prevContext = context;
|
||||
|
||||
// Flush the command queues associated with event1...eventN
|
||||
amd::HostQueue* queue = as_amd(event)->command().queue();
|
||||
if (queue != NULL && prevQueue != queue) {
|
||||
queue->flush();
|
||||
}
|
||||
prevQueue = queue;
|
||||
// Make sure all the events are associated with the same context
|
||||
const amd::Context* context = &as_amd(event)->context();
|
||||
if (prevContext != NULL && prevContext != context) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
prevContext = context;
|
||||
|
||||
bool allSucceeded = true;
|
||||
while (num_events-- > 0) {
|
||||
allSucceeded &= as_amd(*event_list++)->awaitCompletion();
|
||||
// Flush the command queues associated with event1...eventN
|
||||
amd::HostQueue* queue = as_amd(event)->command().queue();
|
||||
if (queue != NULL && prevQueue != queue) {
|
||||
queue->flush();
|
||||
}
|
||||
return allSucceeded ? CL_SUCCESS
|
||||
: CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST;
|
||||
prevQueue = queue;
|
||||
}
|
||||
|
||||
bool allSucceeded = true;
|
||||
while (num_events-- > 0) {
|
||||
allSucceeded &= as_amd(*event_list++)->awaitCompletion();
|
||||
}
|
||||
return allSucceeded ? CL_SUCCESS : CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -134,52 +130,44 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetEventInfo, (
|
||||
cl_event event,
|
||||
cl_event_info param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetEventInfo,
|
||||
(cl_event event, cl_event_info param_name, size_t param_value_size, void* param_value,
|
||||
size_t* param_value_size_ret)) {
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
|
||||
switch(param_name) {
|
||||
switch (param_name) {
|
||||
case CL_EVENT_CONTEXT: {
|
||||
amd::Context& amdCtx = const_cast<amd::Context&>(as_amd(event)->context());
|
||||
cl_context context = as_cl(&amdCtx);
|
||||
return amd::clGetInfo(
|
||||
context, param_value_size, param_value, param_value_size_ret);
|
||||
amd::Context& amdCtx = const_cast<amd::Context&>(as_amd(event)->context());
|
||||
cl_context context = as_cl(&amdCtx);
|
||||
return amd::clGetInfo(context, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_EVENT_COMMAND_QUEUE: {
|
||||
amd::Command& command = as_amd(event)->command();
|
||||
cl_command_queue queue = command.queue() == NULL
|
||||
? NULL : const_cast<cl_command_queue>(as_cl(command.queue()->asCommandQueue()));
|
||||
return amd::clGetInfo(
|
||||
queue, param_value_size, param_value, param_value_size_ret);
|
||||
amd::Command& command = as_amd(event)->command();
|
||||
cl_command_queue queue = command.queue() == NULL
|
||||
? NULL
|
||||
: const_cast<cl_command_queue>(as_cl(command.queue()->asCommandQueue()));
|
||||
return amd::clGetInfo(queue, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_EVENT_COMMAND_TYPE: {
|
||||
cl_command_type type = as_amd(event)->command().type();
|
||||
return amd::clGetInfo(
|
||||
type, param_value_size, param_value, param_value_size_ret);
|
||||
cl_command_type type = as_amd(event)->command().type();
|
||||
return amd::clGetInfo(type, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_EVENT_COMMAND_EXECUTION_STATUS: {
|
||||
as_amd(event)->notifyCmdQueue();
|
||||
cl_int status = as_amd(event)->command().status();
|
||||
return amd::clGetInfo(
|
||||
status, param_value_size, param_value, param_value_size_ret);
|
||||
as_amd(event)->notifyCmdQueue();
|
||||
cl_int status = as_amd(event)->command().status();
|
||||
return amd::clGetInfo(status, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_EVENT_REFERENCE_COUNT: {
|
||||
cl_uint count = as_amd(event)->referenceCount();
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint count = as_amd(event)->referenceCount();
|
||||
return amd::clGetInfo(count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -192,13 +180,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clRetainEvent, (cl_event event))
|
||||
{
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
as_amd(event)->retain();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clRetainEvent, (cl_event event)) {
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
as_amd(event)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -214,13 +201,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clReleaseEvent, (cl_event event))
|
||||
{
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
as_amd(event)->release();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clReleaseEvent, (cl_event event)) {
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
as_amd(event)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -240,24 +226,21 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.1r15
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_event, clCreateUserEvent, (
|
||||
cl_context context,
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
return (cl_event) 0;
|
||||
}
|
||||
RUNTIME_ENTRY_RET(cl_event, clCreateUserEvent, (cl_context context, cl_int* errcode_ret)) {
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
return (cl_event)0;
|
||||
}
|
||||
|
||||
amd::Event* event = new amd::UserEvent(*as_amd(context));
|
||||
if (event == NULL) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_event) 0;
|
||||
}
|
||||
amd::Event* event = new amd::UserEvent(*as_amd(context));
|
||||
if (event == NULL) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_event)0;
|
||||
}
|
||||
|
||||
event->retain();
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(event);
|
||||
event->retain();
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(event);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -279,21 +262,18 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.1r15
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clSetUserEventStatus, (
|
||||
cl_event event,
|
||||
cl_int execution_status))
|
||||
{
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
if (execution_status > CL_COMPLETE) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clSetUserEventStatus, (cl_event event, cl_int execution_status)) {
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
if (execution_status > CL_COMPLETE) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
if (!as_amd(event)->setStatus(execution_status)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
if (!as_amd(event)->setStatus(execution_status)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -362,35 +342,30 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.1r15
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clSetEventCallback, (
|
||||
cl_event event,
|
||||
cl_int command_exec_callback_type,
|
||||
void (CL_CALLBACK * pfn_notify)(
|
||||
cl_event event, cl_int command_exec_status, void *user_data),
|
||||
void* user_data))
|
||||
{
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clSetEventCallback,
|
||||
(cl_event event, cl_int command_exec_callback_type,
|
||||
void(CL_CALLBACK* pfn_notify)(cl_event event, cl_int command_exec_status,
|
||||
void* user_data),
|
||||
void* user_data)) {
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
|
||||
if (pfn_notify == NULL
|
||||
|| command_exec_callback_type < CL_COMPLETE
|
||||
|| command_exec_callback_type > CL_QUEUED) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
if (pfn_notify == NULL || command_exec_callback_type < CL_COMPLETE ||
|
||||
command_exec_callback_type > CL_QUEUED) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
if (!as_amd(event)->setCallback(
|
||||
command_exec_callback_type, pfn_notify, user_data)) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
if (!as_amd(event)->setCallback(command_exec_callback_type, pfn_notify, user_data)) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
as_amd(event)->notifyCmdQueue();
|
||||
as_amd(event)->notifyCmdQueue();
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
@@ -150,144 +150,134 @@
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueNDRangeKernel, (
|
||||
cl_command_queue command_queue,
|
||||
cl_kernel kernel,
|
||||
cl_uint work_dim,
|
||||
const size_t *global_work_offset,
|
||||
const size_t *global_work_size,
|
||||
const size_t *local_work_size,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event *event_wait_list,
|
||||
cl_event *event))
|
||||
{
|
||||
*not_null(event) = NULL;
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueNDRangeKernel,
|
||||
(cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim,
|
||||
const size_t* global_work_offset, const size_t* global_work_size,
|
||||
const size_t* local_work_size, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
*not_null(event) = NULL;
|
||||
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
if (!is_valid(kernel)) {
|
||||
return CL_INVALID_KERNEL;
|
||||
}
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
if (!is_valid(kernel)) {
|
||||
return CL_INVALID_KERNEL;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
const amd::Kernel* amdKernel = as_amd(kernel);
|
||||
if (&hostQueue.context() != &amdKernel->program().context()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
const amd::Kernel* amdKernel = as_amd(kernel);
|
||||
if (&hostQueue.context() != &amdKernel->program().context()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
const amd::Device& device = hostQueue.device();
|
||||
const device::Kernel* devKernel = amdKernel->getDeviceKernel(device);
|
||||
if (devKernel == NULL) {
|
||||
return CL_INVALID_PROGRAM_EXECUTABLE;
|
||||
}
|
||||
const amd::Device& device = hostQueue.device();
|
||||
const device::Kernel* devKernel = amdKernel->getDeviceKernel(device);
|
||||
if (devKernel == NULL) {
|
||||
return CL_INVALID_PROGRAM_EXECUTABLE;
|
||||
}
|
||||
|
||||
if (amdKernel->parameters().getSvmSystemPointersSupport() == FGS_YES &&
|
||||
!(device.info().svmCapabilities_ & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM)) {
|
||||
// The user indicated that this kernel will access SVM system pointers,
|
||||
// but the device does not support them.
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
if (amdKernel->parameters().getSvmSystemPointersSupport() == FGS_YES &&
|
||||
!(device.info().svmCapabilities_ & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM)) {
|
||||
// The user indicated that this kernel will access SVM system pointers,
|
||||
// but the device does not support them.
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
if (work_dim < 1 || work_dim > 3) {
|
||||
return CL_INVALID_WORK_DIMENSION;
|
||||
}
|
||||
if (work_dim < 1 || work_dim > 3) {
|
||||
return CL_INVALID_WORK_DIMENSION;
|
||||
}
|
||||
#if !defined(CL_VERSION_1_1)
|
||||
if (global_work_offset != NULL) {
|
||||
return CL_INVALID_GLOBAL_OFFSET;
|
||||
}
|
||||
#endif // CL_VERSION
|
||||
if (global_work_size == NULL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
else {
|
||||
// >32bits global work size is not supported.
|
||||
for (cl_uint dim = 0; dim < work_dim; ++dim) {
|
||||
if (global_work_size[dim] > static_cast<size_t>(0xffffffff)) {
|
||||
return CL_INVALID_GLOBAL_WORK_SIZE;
|
||||
}
|
||||
}
|
||||
if (global_work_offset != NULL) {
|
||||
return CL_INVALID_GLOBAL_OFFSET;
|
||||
}
|
||||
#endif // CL_VERSION
|
||||
if (global_work_size == NULL) {
|
||||
return CL_INVALID_VALUE;
|
||||
} else {
|
||||
// >32bits global work size is not supported.
|
||||
for (cl_uint dim = 0; dim < work_dim; ++dim) {
|
||||
if (global_work_size[dim] > static_cast<size_t>(0xffffffff)) {
|
||||
return CL_INVALID_GLOBAL_WORK_SIZE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (local_work_size == NULL) {
|
||||
static size_t zeroes[3] = { 0, 0, 0 };
|
||||
local_work_size = zeroes;
|
||||
if (local_work_size == NULL) {
|
||||
static size_t zeroes[3] = {0, 0, 0};
|
||||
local_work_size = zeroes;
|
||||
} else {
|
||||
size_t numWorkItems = 1;
|
||||
for (cl_uint dim = 0; dim < work_dim; ++dim) {
|
||||
if (local_work_size[dim] == 0 ||
|
||||
local_work_size[dim] > device.info().maxWorkItemSizes_[dim]) {
|
||||
return CL_INVALID_WORK_ITEM_SIZE;
|
||||
}
|
||||
if ((local_work_size[dim] != 0) && (devKernel->workGroupInfo()->compileSize_[0] != 0) &&
|
||||
(local_work_size[dim] != devKernel->workGroupInfo()->compileSize_[dim])) {
|
||||
return CL_INVALID_WORK_GROUP_SIZE;
|
||||
}
|
||||
if ((global_work_size[dim] == 0) || (((global_work_size[dim] % local_work_size[dim]) != 0) &&
|
||||
(!device.settings().partialDispatch_ ||
|
||||
devKernel->workGroupInfo()->uniformWorkGroupSize_))) {
|
||||
return CL_INVALID_WORK_GROUP_SIZE;
|
||||
}
|
||||
numWorkItems *= local_work_size[dim];
|
||||
}
|
||||
else {
|
||||
size_t numWorkItems = 1;
|
||||
for (cl_uint dim = 0; dim < work_dim; ++dim) {
|
||||
if (local_work_size[dim] == 0 || local_work_size[dim]
|
||||
> device.info().maxWorkItemSizes_[dim]) {
|
||||
return CL_INVALID_WORK_ITEM_SIZE;
|
||||
}
|
||||
if ((local_work_size[dim] != 0) &&
|
||||
(devKernel->workGroupInfo()->compileSize_[0] != 0) && (local_work_size[dim] !=
|
||||
devKernel->workGroupInfo()->compileSize_[dim])) {
|
||||
return CL_INVALID_WORK_GROUP_SIZE;
|
||||
}
|
||||
if ((global_work_size[dim] == 0) ||
|
||||
(((global_work_size[dim] % local_work_size[dim]) != 0) &&
|
||||
(!device.settings().partialDispatch_ ||
|
||||
devKernel->workGroupInfo()->uniformWorkGroupSize_))) {
|
||||
return CL_INVALID_WORK_GROUP_SIZE;
|
||||
}
|
||||
numWorkItems *= local_work_size[dim];
|
||||
}
|
||||
if (numWorkItems > devKernel->workGroupInfo()->size_) {
|
||||
return CL_INVALID_WORK_GROUP_SIZE;
|
||||
}
|
||||
if (numWorkItems > devKernel->workGroupInfo()->size_) {
|
||||
return CL_INVALID_WORK_GROUP_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
// Check that all parameters have been defined.
|
||||
if (!amdKernel->parameters().check()) {
|
||||
return CL_INVALID_KERNEL_ARGS;
|
||||
}
|
||||
// Check that all parameters have been defined.
|
||||
if (!amdKernel->parameters().check()) {
|
||||
return CL_INVALID_KERNEL_ARGS;
|
||||
}
|
||||
|
||||
// Check that we do not exceed the amount of available local memory.
|
||||
const size_t align = device.info().minDataTypeAlignSize_;
|
||||
cl_ulong requiredLocalMemSize =
|
||||
static_cast<cl_ulong>(amdKernel->parameters().localMemSize(align)) +
|
||||
amd::alignUp(devKernel->workGroupInfo()->localMemSize_, align);
|
||||
// Check that we do not exceed the amount of available local memory.
|
||||
const size_t align = device.info().minDataTypeAlignSize_;
|
||||
cl_ulong requiredLocalMemSize =
|
||||
static_cast<cl_ulong>(amdKernel->parameters().localMemSize(align)) +
|
||||
amd::alignUp(devKernel->workGroupInfo()->localMemSize_, align);
|
||||
|
||||
if (requiredLocalMemSize > device.info().localMemSize_) {
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
if (requiredLocalMemSize > device.info().localMemSize_) {
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue.context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue.context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::NDRangeContainer ndrange((size_t) work_dim,
|
||||
global_work_offset, global_work_size, local_work_size);
|
||||
amd::NDRangeKernelCommand* command = new amd::NDRangeKernelCommand(
|
||||
hostQueue, eventWaitList, *as_amd(kernel), ndrange);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
// ndrange is now owned by command. Do not delete it!
|
||||
amd::NDRangeContainer ndrange((size_t)work_dim, global_work_offset, global_work_size,
|
||||
local_work_size);
|
||||
amd::NDRangeKernelCommand* command =
|
||||
new amd::NDRangeKernelCommand(hostQueue, eventWaitList, *as_amd(kernel), ndrange);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
// ndrange is now owned by command. Do not delete it!
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
cl_int result = command->validateMemory();
|
||||
if (result != CL_SUCCESS) {
|
||||
delete command;
|
||||
return result;
|
||||
}
|
||||
// Make sure we have memory for the command execution
|
||||
cl_int result = command->validateMemory();
|
||||
if (result != CL_SUCCESS) {
|
||||
delete command;
|
||||
return result;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -352,28 +342,24 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueTask, (
|
||||
cl_command_queue command_queue,
|
||||
cl_kernel kernel,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event *event_wait_list,
|
||||
cl_event *event))
|
||||
{
|
||||
static size_t const globalWorkSize[3] = {1, 0, 0};
|
||||
static size_t const localWorkSize[3] = {1, 0, 0};
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueTask,
|
||||
(cl_command_queue command_queue, cl_kernel kernel, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
static size_t const globalWorkSize[3] = {1, 0, 0};
|
||||
static size_t const localWorkSize[3] = {1, 0, 0};
|
||||
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
return hostQueue->dispatch_->clEnqueueNDRangeKernel(
|
||||
command_queue, kernel, 1, NULL, globalWorkSize, localWorkSize,
|
||||
num_events_in_wait_list, event_wait_list, event);
|
||||
return hostQueue->dispatch_->clEnqueueNDRangeKernel(
|
||||
command_queue, kernel, 1, NULL, globalWorkSize, localWorkSize, num_events_in_wait_list,
|
||||
event_wait_list, event);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -442,72 +428,62 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueNativeKernel, (
|
||||
cl_command_queue command_queue,
|
||||
void (CL_CALLBACK * user_func)(void *),
|
||||
void *args,
|
||||
size_t cb_args,
|
||||
cl_uint num_mem_objects,
|
||||
const cl_mem *mem_list,
|
||||
const void **args_mem_loc,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event *event_wait_list,
|
||||
cl_event *event))
|
||||
{
|
||||
*not_null(event) = NULL;
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueNativeKernel,
|
||||
(cl_command_queue command_queue, void(CL_CALLBACK* user_func)(void*), void* args,
|
||||
size_t cb_args, cl_uint num_mem_objects, const cl_mem* mem_list,
|
||||
const void** args_mem_loc, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
*not_null(event) = NULL;
|
||||
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
const amd::Device& device = hostQueue.device();
|
||||
|
||||
if (!(device.info().executionCapabilities_ & CL_EXEC_NATIVE_KERNEL)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
if (user_func == NULL || (num_mem_objects > 0 && (mem_list == NULL || args_mem_loc == NULL)) ||
|
||||
(num_mem_objects == 0 && (mem_list != NULL || args_mem_loc != NULL)) ||
|
||||
(args == NULL && (cb_args > 0 || num_mem_objects > 0)) || (args != NULL && cb_args == 0)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue.context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < num_mem_objects; ++i) {
|
||||
cl_mem obj = mem_list[i];
|
||||
if (!is_valid(obj)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
amd::NativeFnCommand* command = new amd::NativeFnCommand(
|
||||
hostQueue, eventWaitList, user_func, args, cb_args, num_mem_objects, mem_list, args_mem_loc);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
const amd::Device& device = hostQueue.device();
|
||||
command->enqueue();
|
||||
|
||||
if (!(device.info().executionCapabilities_ & CL_EXEC_NATIVE_KERNEL)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
if (user_func == NULL
|
||||
|| (num_mem_objects > 0 && (mem_list == NULL || args_mem_loc == NULL))
|
||||
|| (num_mem_objects == 0 && (mem_list != NULL || args_mem_loc != NULL))
|
||||
|| (args == NULL && (cb_args > 0 || num_mem_objects > 0))
|
||||
|| (args != NULL && cb_args == 0)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue.context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS){
|
||||
return err;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < num_mem_objects; ++i) {
|
||||
cl_mem obj = mem_list[i];
|
||||
if (!is_valid(obj)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
}
|
||||
|
||||
amd::NativeFnCommand* command = new amd::NativeFnCommand(
|
||||
hostQueue, eventWaitList,
|
||||
user_func, args, cb_args, num_mem_objects, mem_list, args_mem_loc);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -581,31 +557,28 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueMarker, (
|
||||
cl_command_queue command_queue,
|
||||
cl_event *event))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueMarker, (cl_command_queue command_queue, cl_event* event)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::Command* command = new amd::Marker(*hostQueue, true);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
amd::Command* command = new amd::Marker(*hostQueue, true);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -653,39 +626,36 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.2r07
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueMarkerWithWaitList, (
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event *event_wait_list,
|
||||
cl_event *event))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueMarkerWithWaitList,
|
||||
(cl_command_queue command_queue, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue->context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue->context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::Command* command = new amd::Marker(*hostQueue, true, eventWaitList);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
amd::Command* command = new amd::Marker(*hostQueue, true, eventWaitList);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -719,35 +689,31 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWaitForEvents, (
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_events,
|
||||
const cl_event *event_list))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWaitForEvents,
|
||||
(cl_command_queue command_queue, cl_uint num_events, const cl_event* event_list)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue.context(), num_events, event_list);
|
||||
if (err != CL_SUCCESS){
|
||||
return err;
|
||||
}
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue.context(), num_events, event_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::Command* command = new amd::Marker(hostQueue, false, eventWaitList);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
amd::Command* command = new amd::Marker(hostQueue, false, eventWaitList);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
command->release();
|
||||
return CL_SUCCESS;
|
||||
command->enqueue();
|
||||
command->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -765,10 +731,9 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueBarrier, (cl_command_queue command_queue))
|
||||
{
|
||||
//! @todo: Unimplemented();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueBarrier, (cl_command_queue command_queue)) {
|
||||
//! @todo: Unimplemented();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -817,41 +782,38 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.2r07
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueBarrierWithWaitList, (
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event *event_wait_list,
|
||||
cl_event *event))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueBarrierWithWaitList,
|
||||
(cl_command_queue command_queue, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue->context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue->context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
//!@note: with the current runtime architecture and in-order execution
|
||||
//! barrier and marker should be the same operation
|
||||
amd::Command* command = new amd::Marker(*hostQueue, true, eventWaitList);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
//!@note: with the current runtime architecture and in-order execution
|
||||
//! barrier and marker should be the same operation
|
||||
amd::Command* command = new amd::Marker(*hostQueue, true, eventWaitList);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -914,55 +876,51 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetEventProfilingInfo, (
|
||||
cl_event event,
|
||||
cl_profiling_info param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetEventProfilingInfo,
|
||||
(cl_event event, cl_profiling_info param_name, size_t param_value_size,
|
||||
void* param_value, size_t* param_value_size_ret)) {
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT;
|
||||
}
|
||||
|
||||
if (!as_amd(event)->profilingInfo().enabled_) {
|
||||
return CL_PROFILING_INFO_NOT_AVAILABLE;
|
||||
}
|
||||
if (!as_amd(event)->profilingInfo().enabled_) {
|
||||
return CL_PROFILING_INFO_NOT_AVAILABLE;
|
||||
}
|
||||
|
||||
if (param_value != NULL && param_value_size < sizeof(cl_ulong)) {
|
||||
if (param_value != NULL && param_value_size < sizeof(cl_ulong)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
*not_null(param_value_size_ret) = sizeof(cl_ulong);
|
||||
if (param_value != NULL) {
|
||||
cl_ulong value = 0;
|
||||
switch (param_name) {
|
||||
case CL_PROFILING_COMMAND_END:
|
||||
value = as_amd(event)->profilingInfo().end_;
|
||||
break;
|
||||
|
||||
case CL_PROFILING_COMMAND_START:
|
||||
value = as_amd(event)->profilingInfo().start_;
|
||||
break;
|
||||
|
||||
case CL_PROFILING_COMMAND_SUBMIT:
|
||||
value = as_amd(event)->profilingInfo().submitted_;
|
||||
break;
|
||||
|
||||
case CL_PROFILING_COMMAND_QUEUED:
|
||||
value = as_amd(event)->profilingInfo().queued_;
|
||||
break;
|
||||
|
||||
default:
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
*not_null(param_value_size_ret) = sizeof(cl_ulong);
|
||||
if (param_value != NULL) {
|
||||
cl_ulong value = 0;
|
||||
switch (param_name) {
|
||||
case CL_PROFILING_COMMAND_END:
|
||||
value = as_amd(event)->profilingInfo().end_;
|
||||
break;
|
||||
|
||||
case CL_PROFILING_COMMAND_START:
|
||||
value = as_amd(event)->profilingInfo().start_;
|
||||
break;
|
||||
|
||||
case CL_PROFILING_COMMAND_SUBMIT:
|
||||
value = as_amd(event)->profilingInfo().submitted_;
|
||||
break;
|
||||
|
||||
case CL_PROFILING_COMMAND_QUEUED:
|
||||
value = as_amd(event)->profilingInfo().queued_;
|
||||
break;
|
||||
|
||||
default:
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
if (value == 0) {
|
||||
return CL_PROFILING_INFO_NOT_AVAILABLE;
|
||||
}
|
||||
*(cl_ulong*)param_value = value;
|
||||
if (value == 0) {
|
||||
return CL_PROFILING_INFO_NOT_AVAILABLE;
|
||||
}
|
||||
*(cl_ulong*)param_value = value;
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -992,26 +950,25 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clFlush, (cl_command_queue command_queue))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clFlush, (cl_command_queue command_queue)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::Command* command = new amd::Marker(*hostQueue, false);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
amd::Command* command = new amd::Marker(*hostQueue, false);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
command->release();
|
||||
command->enqueue();
|
||||
command->release();
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -1029,20 +986,19 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clFinish, (cl_command_queue command_queue))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clFinish, (cl_command_queue command_queue)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
hostQueue->finish();
|
||||
hostQueue->finish();
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
+1616
-1742
Plik diff jest za duży
Load Diff
@@ -8,336 +8,218 @@
|
||||
#include "cl_d3d9_amd.hpp"
|
||||
#include "cl_d3d10_amd.hpp"
|
||||
#include "cl_d3d11_amd.hpp"
|
||||
#endif //_WIN32
|
||||
#endif //_WIN32
|
||||
|
||||
#include <icd/icd_dispatch.h>
|
||||
|
||||
amd::PlatformIDS amd::PlatformID::Platform = //{ NULL };
|
||||
{ amd::ICDDispatchedObject::icdVendorDispatch_ };
|
||||
amd::PlatformIDS amd::PlatformID::Platform = //{ NULL };
|
||||
{amd::ICDDispatchedObject::icdVendorDispatch_};
|
||||
|
||||
static cl_int CL_API_CALL
|
||||
icdGetPlatformInfo(
|
||||
cl_platform_id platform,
|
||||
cl_platform_info param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret)
|
||||
{
|
||||
return clGetPlatformInfo(
|
||||
NULL, param_name, param_value_size, param_value, param_value_size_ret);
|
||||
static cl_int CL_API_CALL icdGetPlatformInfo(cl_platform_id platform, cl_platform_info param_name,
|
||||
size_t param_value_size, void* param_value,
|
||||
size_t* param_value_size_ret) {
|
||||
return clGetPlatformInfo(NULL, param_name, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
|
||||
static cl_int CL_API_CALL
|
||||
icdGetDeviceIDs(
|
||||
cl_platform_id platform,
|
||||
cl_device_type device_type,
|
||||
cl_uint num_entries,
|
||||
cl_device_id *devices,
|
||||
cl_uint *num_devices)
|
||||
{
|
||||
return clGetDeviceIDs(
|
||||
NULL, device_type, num_entries, devices, num_devices);
|
||||
static cl_int CL_API_CALL icdGetDeviceIDs(cl_platform_id platform, cl_device_type device_type,
|
||||
cl_uint num_entries, cl_device_id* devices,
|
||||
cl_uint* num_devices) {
|
||||
return clGetDeviceIDs(NULL, device_type, num_entries, devices, num_devices);
|
||||
}
|
||||
|
||||
static cl_int CL_API_CALL
|
||||
icdGetDeviceInfo(
|
||||
cl_device_id device,
|
||||
cl_device_info param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret)
|
||||
{
|
||||
if (param_name == CL_DEVICE_PLATFORM) {
|
||||
// Return the ICD platform instead of the default NULL platform.
|
||||
cl_platform_id platform = reinterpret_cast<cl_platform_id>(&amd::PlatformID::Platform);
|
||||
return amd::clGetInfo(
|
||||
platform, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
static cl_int CL_API_CALL icdGetDeviceInfo(cl_device_id device, cl_device_info param_name,
|
||||
size_t param_value_size, void* param_value,
|
||||
size_t* param_value_size_ret) {
|
||||
if (param_name == CL_DEVICE_PLATFORM) {
|
||||
// Return the ICD platform instead of the default NULL platform.
|
||||
cl_platform_id platform = reinterpret_cast<cl_platform_id>(&amd::PlatformID::Platform);
|
||||
return amd::clGetInfo(platform, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
|
||||
return clGetDeviceInfo(
|
||||
device, param_name, param_value_size, param_value, param_value_size_ret);
|
||||
return clGetDeviceInfo(device, param_name, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
|
||||
KHRicdVendorDispatch
|
||||
amd::ICDDispatchedObject::icdVendorDispatch_[] = {{
|
||||
NULL /* should not get called */,
|
||||
icdGetPlatformInfo,
|
||||
icdGetDeviceIDs,
|
||||
icdGetDeviceInfo,
|
||||
clCreateContext,
|
||||
clCreateContextFromType,
|
||||
clRetainContext,
|
||||
clReleaseContext,
|
||||
clGetContextInfo,
|
||||
clCreateCommandQueue,
|
||||
clRetainCommandQueue,
|
||||
clReleaseCommandQueue,
|
||||
clGetCommandQueueInfo,
|
||||
clSetCommandQueueProperty,
|
||||
clCreateBuffer,
|
||||
clCreateImage2D,
|
||||
clCreateImage3D,
|
||||
clRetainMemObject,
|
||||
clReleaseMemObject,
|
||||
clGetSupportedImageFormats,
|
||||
clGetMemObjectInfo,
|
||||
clGetImageInfo,
|
||||
clCreateSampler,
|
||||
clRetainSampler,
|
||||
clReleaseSampler,
|
||||
clGetSamplerInfo,
|
||||
clCreateProgramWithSource,
|
||||
clCreateProgramWithBinary,
|
||||
clRetainProgram,
|
||||
clReleaseProgram,
|
||||
clBuildProgram,
|
||||
clUnloadCompiler,
|
||||
clGetProgramInfo,
|
||||
clGetProgramBuildInfo,
|
||||
clCreateKernel,
|
||||
clCreateKernelsInProgram,
|
||||
clRetainKernel,
|
||||
clReleaseKernel,
|
||||
clSetKernelArg,
|
||||
clGetKernelInfo,
|
||||
clGetKernelWorkGroupInfo,
|
||||
clWaitForEvents,
|
||||
clGetEventInfo,
|
||||
clRetainEvent,
|
||||
clReleaseEvent,
|
||||
clGetEventProfilingInfo,
|
||||
clFlush,
|
||||
clFinish,
|
||||
clEnqueueReadBuffer,
|
||||
clEnqueueWriteBuffer,
|
||||
clEnqueueCopyBuffer,
|
||||
clEnqueueReadImage,
|
||||
clEnqueueWriteImage,
|
||||
clEnqueueCopyImage,
|
||||
clEnqueueCopyImageToBuffer,
|
||||
clEnqueueCopyBufferToImage,
|
||||
clEnqueueMapBuffer,
|
||||
clEnqueueMapImage,
|
||||
clEnqueueUnmapMemObject,
|
||||
clEnqueueNDRangeKernel,
|
||||
clEnqueueTask,
|
||||
clEnqueueNativeKernel,
|
||||
clEnqueueMarker,
|
||||
clEnqueueWaitForEvents,
|
||||
clEnqueueBarrier,
|
||||
clGetExtensionFunctionAddress,
|
||||
clCreateFromGLBuffer,
|
||||
clCreateFromGLTexture2D,
|
||||
clCreateFromGLTexture3D,
|
||||
clCreateFromGLRenderbuffer,
|
||||
clGetGLObjectInfo,
|
||||
clGetGLTextureInfo,
|
||||
clEnqueueAcquireGLObjects,
|
||||
clEnqueueReleaseGLObjects,
|
||||
clGetGLContextInfoKHR,
|
||||
WINDOWS_SWITCH(clGetDeviceIDsFromD3D10KHR,NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D10BufferKHR,NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D10Texture2DKHR,NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D10Texture3DKHR,NULL),
|
||||
WINDOWS_SWITCH(clEnqueueAcquireD3D10ObjectsKHR,NULL),
|
||||
WINDOWS_SWITCH(clEnqueueReleaseD3D10ObjectsKHR,NULL),
|
||||
clSetEventCallback,
|
||||
clCreateSubBuffer,
|
||||
clSetMemObjectDestructorCallback,
|
||||
clCreateUserEvent,
|
||||
clSetUserEventStatus,
|
||||
clEnqueueReadBufferRect,
|
||||
clEnqueueWriteBufferRect,
|
||||
clEnqueueCopyBufferRect,
|
||||
clCreateSubDevicesEXT,
|
||||
clRetainDeviceEXT,
|
||||
clReleaseDeviceEXT,
|
||||
clCreateEventFromGLsyncKHR,
|
||||
KHRicdVendorDispatch amd::ICDDispatchedObject::icdVendorDispatch_[] = {
|
||||
{NULL /* should not get called */, icdGetPlatformInfo, icdGetDeviceIDs, icdGetDeviceInfo,
|
||||
clCreateContext, clCreateContextFromType, clRetainContext, clReleaseContext, clGetContextInfo,
|
||||
clCreateCommandQueue, clRetainCommandQueue, clReleaseCommandQueue, clGetCommandQueueInfo,
|
||||
clSetCommandQueueProperty, clCreateBuffer, clCreateImage2D, clCreateImage3D, clRetainMemObject,
|
||||
clReleaseMemObject, clGetSupportedImageFormats, clGetMemObjectInfo, clGetImageInfo,
|
||||
clCreateSampler, clRetainSampler, clReleaseSampler, clGetSamplerInfo,
|
||||
clCreateProgramWithSource, clCreateProgramWithBinary, clRetainProgram, clReleaseProgram,
|
||||
clBuildProgram, clUnloadCompiler, clGetProgramInfo, clGetProgramBuildInfo, clCreateKernel,
|
||||
clCreateKernelsInProgram, clRetainKernel, clReleaseKernel, clSetKernelArg, clGetKernelInfo,
|
||||
clGetKernelWorkGroupInfo, clWaitForEvents, clGetEventInfo, clRetainEvent, clReleaseEvent,
|
||||
clGetEventProfilingInfo, clFlush, clFinish, clEnqueueReadBuffer, clEnqueueWriteBuffer,
|
||||
clEnqueueCopyBuffer, clEnqueueReadImage, clEnqueueWriteImage, clEnqueueCopyImage,
|
||||
clEnqueueCopyImageToBuffer, clEnqueueCopyBufferToImage, clEnqueueMapBuffer, clEnqueueMapImage,
|
||||
clEnqueueUnmapMemObject, clEnqueueNDRangeKernel, clEnqueueTask, clEnqueueNativeKernel,
|
||||
clEnqueueMarker, clEnqueueWaitForEvents, clEnqueueBarrier, clGetExtensionFunctionAddress,
|
||||
clCreateFromGLBuffer, clCreateFromGLTexture2D, clCreateFromGLTexture3D,
|
||||
clCreateFromGLRenderbuffer, clGetGLObjectInfo, clGetGLTextureInfo, clEnqueueAcquireGLObjects,
|
||||
clEnqueueReleaseGLObjects, clGetGLContextInfoKHR,
|
||||
WINDOWS_SWITCH(clGetDeviceIDsFromD3D10KHR, NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D10BufferKHR, NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D10Texture2DKHR, NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D10Texture3DKHR, NULL),
|
||||
WINDOWS_SWITCH(clEnqueueAcquireD3D10ObjectsKHR, NULL),
|
||||
WINDOWS_SWITCH(clEnqueueReleaseD3D10ObjectsKHR, NULL), clSetEventCallback, clCreateSubBuffer,
|
||||
clSetMemObjectDestructorCallback, clCreateUserEvent, clSetUserEventStatus,
|
||||
clEnqueueReadBufferRect, clEnqueueWriteBufferRect, clEnqueueCopyBufferRect,
|
||||
clCreateSubDevicesEXT, clRetainDeviceEXT, clReleaseDeviceEXT, clCreateEventFromGLsyncKHR,
|
||||
|
||||
/* OpenCL 1.2*/
|
||||
clCreateSubDevices,
|
||||
clRetainDevice,
|
||||
clReleaseDevice,
|
||||
clCreateImage,
|
||||
clCreateProgramWithBuiltInKernels,
|
||||
clCompileProgram,
|
||||
clLinkProgram,
|
||||
clUnloadPlatformCompiler,
|
||||
clGetKernelArgInfo,
|
||||
clEnqueueFillBuffer,
|
||||
clEnqueueFillImage,
|
||||
clEnqueueMigrateMemObjects,
|
||||
clEnqueueMarkerWithWaitList,
|
||||
clEnqueueBarrierWithWaitList,
|
||||
clGetExtensionFunctionAddressForPlatform,
|
||||
clCreateFromGLTexture,
|
||||
/* OpenCL 1.2*/
|
||||
clCreateSubDevices, clRetainDevice, clReleaseDevice, clCreateImage,
|
||||
clCreateProgramWithBuiltInKernels, clCompileProgram, clLinkProgram, clUnloadPlatformCompiler,
|
||||
clGetKernelArgInfo, clEnqueueFillBuffer, clEnqueueFillImage, clEnqueueMigrateMemObjects,
|
||||
clEnqueueMarkerWithWaitList, clEnqueueBarrierWithWaitList,
|
||||
clGetExtensionFunctionAddressForPlatform, clCreateFromGLTexture,
|
||||
|
||||
WINDOWS_SWITCH(clGetDeviceIDsFromD3D11KHR,NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D11BufferKHR,NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D11Texture2DKHR,NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D11Texture3DKHR,NULL),
|
||||
WINDOWS_SWITCH(clCreateFromDX9MediaSurfaceKHR, NULL),
|
||||
WINDOWS_SWITCH(clEnqueueAcquireD3D11ObjectsKHR,NULL),
|
||||
WINDOWS_SWITCH(clEnqueueReleaseD3D11ObjectsKHR,NULL),
|
||||
WINDOWS_SWITCH(clGetDeviceIDsFromD3D11KHR, NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D11BufferKHR, NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D11Texture2DKHR, NULL),
|
||||
WINDOWS_SWITCH(clCreateFromD3D11Texture3DKHR, NULL),
|
||||
WINDOWS_SWITCH(clCreateFromDX9MediaSurfaceKHR, NULL),
|
||||
WINDOWS_SWITCH(clEnqueueAcquireD3D11ObjectsKHR, NULL),
|
||||
WINDOWS_SWITCH(clEnqueueReleaseD3D11ObjectsKHR, NULL),
|
||||
|
||||
WINDOWS_SWITCH(clGetDeviceIDsFromDX9MediaAdapterKHR,NULL),//KHRpfn_clGetDeviceIDsFromDX9MediaAdapterKHR clGetDeviceIDsFromDX9MediaAdapterKHR;
|
||||
WINDOWS_SWITCH(clEnqueueAcquireDX9MediaSurfacesKHR, NULL), //KHRpfn_clEnqueueAcquireDX9MediaSurfacesKHR clEnqueueAcquireDX9MediaSurfacesKHR;
|
||||
WINDOWS_SWITCH(clEnqueueReleaseDX9MediaSurfacesKHR, NULL), //KHRpfn_clEnqueueReleaseDX9MediaSurfacesKHR clEnqueueReleaseDX9MediaSurfacesKHR;
|
||||
WINDOWS_SWITCH(clGetDeviceIDsFromDX9MediaAdapterKHR,
|
||||
NULL), // KHRpfn_clGetDeviceIDsFromDX9MediaAdapterKHR
|
||||
// clGetDeviceIDsFromDX9MediaAdapterKHR;
|
||||
WINDOWS_SWITCH(
|
||||
clEnqueueAcquireDX9MediaSurfacesKHR,
|
||||
NULL), // KHRpfn_clEnqueueAcquireDX9MediaSurfacesKHR clEnqueueAcquireDX9MediaSurfacesKHR;
|
||||
WINDOWS_SWITCH(
|
||||
clEnqueueReleaseDX9MediaSurfacesKHR,
|
||||
NULL), // KHRpfn_clEnqueueReleaseDX9MediaSurfacesKHR clEnqueueReleaseDX9MediaSurfacesKHR;
|
||||
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL, NULL, NULL,
|
||||
|
||||
clCreateCommandQueueWithProperties,
|
||||
clCreatePipe,
|
||||
clGetPipeInfo,
|
||||
clSVMAlloc,
|
||||
clSVMFree,
|
||||
clEnqueueSVMFree,
|
||||
clEnqueueSVMMemcpy,
|
||||
clEnqueueSVMMemFill,
|
||||
clEnqueueSVMMap,
|
||||
clEnqueueSVMUnmap,
|
||||
clCreateSamplerWithProperties,
|
||||
clSetKernelArgSVMPointer,
|
||||
clSetKernelExecInfo,
|
||||
clCreateCommandQueueWithProperties, clCreatePipe, clGetPipeInfo, clSVMAlloc, clSVMFree,
|
||||
clEnqueueSVMFree, clEnqueueSVMMemcpy, clEnqueueSVMMemFill, clEnqueueSVMMap, clEnqueueSVMUnmap,
|
||||
clCreateSamplerWithProperties, clSetKernelArgSVMPointer, clSetKernelExecInfo,
|
||||
|
||||
clGetKernelSubGroupInfoKHR,
|
||||
clTerminateContextKHR,
|
||||
clCreateProgramWithILKHR
|
||||
}};
|
||||
clGetKernelSubGroupInfoKHR, clTerminateContextKHR, clCreateProgramWithILKHR}};
|
||||
|
||||
#if defined(ATI_OS_WIN)
|
||||
#include <Shlwapi.h>
|
||||
|
||||
#pragma comment( lib, "shlwapi.lib")
|
||||
#pragma comment(lib, "shlwapi.lib")
|
||||
|
||||
static bool
|
||||
ShouldLoadPlatform()
|
||||
{
|
||||
// Get the OpenCL ICD registry values
|
||||
HKEY platformsKey = NULL;
|
||||
if (RegOpenKeyExA(
|
||||
HKEY_LOCAL_MACHINE, "SOFTWARE\\Khronos\\OpenCL\\Vendors",
|
||||
0, KEY_READ, &platformsKey)
|
||||
!= ERROR_SUCCESS) return true;
|
||||
static bool ShouldLoadPlatform() {
|
||||
// Get the OpenCL ICD registry values
|
||||
HKEY platformsKey = NULL;
|
||||
if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Khronos\\OpenCL\\Vendors", 0, KEY_READ,
|
||||
&platformsKey) != ERROR_SUCCESS)
|
||||
return true;
|
||||
|
||||
std::vector<std::string> registryValues;
|
||||
DWORD dwIndex = 0;
|
||||
while (true) {
|
||||
char cszLibraryName[1024] = {0};
|
||||
DWORD dwLibraryNameSize = sizeof(cszLibraryName);
|
||||
DWORD dwLibraryNameType = 0;
|
||||
DWORD dwValue = 0;
|
||||
DWORD dwValueSize = sizeof(dwValue);
|
||||
std::vector<std::string> registryValues;
|
||||
DWORD dwIndex = 0;
|
||||
while (true) {
|
||||
char cszLibraryName[1024] = {0};
|
||||
DWORD dwLibraryNameSize = sizeof(cszLibraryName);
|
||||
DWORD dwLibraryNameType = 0;
|
||||
DWORD dwValue = 0;
|
||||
DWORD dwValueSize = sizeof(dwValue);
|
||||
|
||||
if (RegEnumValueA(
|
||||
platformsKey, dwIndex++, cszLibraryName, &dwLibraryNameSize,
|
||||
NULL, &dwLibraryNameType, (LPBYTE) &dwValue, &dwValueSize)
|
||||
!= ERROR_SUCCESS) break;
|
||||
// Require that the value be a DWORD and equal zero
|
||||
if (dwLibraryNameType != REG_DWORD || dwValue != 0) {
|
||||
continue;
|
||||
}
|
||||
registryValues.push_back(cszLibraryName);
|
||||
if (RegEnumValueA(platformsKey, dwIndex++, cszLibraryName, &dwLibraryNameSize, NULL,
|
||||
&dwLibraryNameType, (LPBYTE)&dwValue, &dwValueSize) != ERROR_SUCCESS)
|
||||
break;
|
||||
// Require that the value be a DWORD and equal zero
|
||||
if (dwLibraryNameType != REG_DWORD || dwValue != 0) {
|
||||
continue;
|
||||
}
|
||||
RegCloseKey(platformsKey);
|
||||
registryValues.push_back(cszLibraryName);
|
||||
}
|
||||
RegCloseKey(platformsKey);
|
||||
|
||||
HMODULE hm = NULL;
|
||||
if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
|
||||
| GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||
(LPCSTR) &ShouldLoadPlatform, &hm)) return true;
|
||||
HMODULE hm = NULL;
|
||||
if (!GetModuleHandleExA(
|
||||
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||
(LPCSTR)&ShouldLoadPlatform, &hm))
|
||||
return true;
|
||||
|
||||
char cszDllPath[1024] = {0};
|
||||
if (!GetModuleFileNameA(hm, cszDllPath, sizeof(cszDllPath)))
|
||||
return true;
|
||||
char cszDllPath[1024] = {0};
|
||||
if (!GetModuleFileNameA(hm, cszDllPath, sizeof(cszDllPath))) return true;
|
||||
|
||||
// If we are loaded from the DriverStore, then there should be a registry
|
||||
// value matching our current module absolute path.
|
||||
if (std::find(registryValues.begin(), registryValues.end(), cszDllPath)
|
||||
== registryValues.end()) return true;
|
||||
// If we are loaded from the DriverStore, then there should be a registry
|
||||
// value matching our current module absolute path.
|
||||
if (std::find(registryValues.begin(), registryValues.end(), cszDllPath) == registryValues.end())
|
||||
return true;
|
||||
|
||||
LPSTR cszFileName;
|
||||
char buffer[1024] = {0};
|
||||
if (!GetFullPathNameA(cszDllPath, sizeof(buffer), buffer, &cszFileName))
|
||||
return true;
|
||||
LPSTR cszFileName;
|
||||
char buffer[1024] = {0};
|
||||
if (!GetFullPathNameA(cszDllPath, sizeof(buffer), buffer, &cszFileName)) return true;
|
||||
|
||||
// We found an absolute path in the registry that matched this DLL, now
|
||||
// check if there is also an entry with the same filename.
|
||||
if (std::find(registryValues.begin(), registryValues.end(), cszFileName)
|
||||
== registryValues.end()) return true;
|
||||
// We found an absolute path in the registry that matched this DLL, now
|
||||
// check if there is also an entry with the same filename.
|
||||
if (std::find(registryValues.begin(), registryValues.end(), cszFileName) == registryValues.end())
|
||||
return true;
|
||||
|
||||
// Lastly, check if there is a DLL with the same name in the System folder.
|
||||
char cszSystemPath[1024] = {0};
|
||||
// Lastly, check if there is a DLL with the same name in the System folder.
|
||||
char cszSystemPath[1024] = {0};
|
||||
#if defined(ATI_BITS_32)
|
||||
if (!GetSystemWow64DirectoryA(cszSystemPath, sizeof(cszSystemPath)))
|
||||
#endif // defined(ATI_BITS_32)
|
||||
if (!GetSystemDirectoryA(cszSystemPath, sizeof(cszSystemPath)))
|
||||
return true;
|
||||
if (!GetSystemWow64DirectoryA(cszSystemPath, sizeof(cszSystemPath)))
|
||||
#endif // defined(ATI_BITS_32)
|
||||
if (!GetSystemDirectoryA(cszSystemPath, sizeof(cszSystemPath))) return true;
|
||||
|
||||
std::string systemDllPath;
|
||||
systemDllPath.append(cszSystemPath).append("\\").append(cszFileName);
|
||||
if (!PathFileExistsA(systemDllPath.c_str())) {
|
||||
return true;
|
||||
}
|
||||
std::string systemDllPath;
|
||||
systemDllPath.append(cszSystemPath).append("\\").append(cszFileName);
|
||||
if (!PathFileExistsA(systemDllPath.c_str())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// If we get here, then all 3 conditions are true:
|
||||
// - An entry in the registry with an absolute path matches the current DLL
|
||||
// - An entry in the registry with a relative path matches the current DLL
|
||||
// - A DLL with the same name was found in the system directory
|
||||
//
|
||||
// We should not load this platform!
|
||||
// If we get here, then all 3 conditions are true:
|
||||
// - An entry in the registry with an absolute path matches the current DLL
|
||||
// - An entry in the registry with a relative path matches the current DLL
|
||||
// - A DLL with the same name was found in the system directory
|
||||
//
|
||||
// We should not load this platform!
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
static BOOL CALLBACK
|
||||
ShouldLoadPlatformInit(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex)
|
||||
{
|
||||
*reinterpret_cast<bool*>(Parameter) = ShouldLoadPlatform();
|
||||
return TRUE;
|
||||
static BOOL CALLBACK ShouldLoadPlatformInit(PINIT_ONCE InitOnce, PVOID Parameter, PVOID* lpContex) {
|
||||
*reinterpret_cast<bool*>(Parameter) = ShouldLoadPlatform();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#endif // defined(ATI_OS_WIN)
|
||||
#endif // defined(ATI_OS_WIN)
|
||||
|
||||
CL_API_ENTRY cl_int CL_API_CALL
|
||||
clIcdGetPlatformIDsKHR(
|
||||
cl_uint num_entries,
|
||||
cl_platform_id * platforms,
|
||||
cl_uint * num_platforms)
|
||||
{
|
||||
if (((num_entries > 0 || num_platforms == NULL) && platforms == NULL)
|
||||
|| (num_entries == 0 && platforms != NULL)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
CL_API_ENTRY cl_int CL_API_CALL clIcdGetPlatformIDsKHR(cl_uint num_entries,
|
||||
cl_platform_id* platforms,
|
||||
cl_uint* num_platforms) {
|
||||
if (((num_entries > 0 || num_platforms == NULL) && platforms == NULL) ||
|
||||
(num_entries == 0 && platforms != NULL)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
#if defined(ATI_OS_WIN)
|
||||
static bool shouldLoad = true;
|
||||
static bool shouldLoad = true;
|
||||
|
||||
static INIT_ONCE initOnce;
|
||||
InitOnceExecuteOnce(&initOnce, ShouldLoadPlatformInit, &shouldLoad, NULL);
|
||||
static INIT_ONCE initOnce;
|
||||
InitOnceExecuteOnce(&initOnce, ShouldLoadPlatformInit, &shouldLoad, NULL);
|
||||
|
||||
if (!shouldLoad) {
|
||||
*not_null(num_platforms) = 0;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
#endif // defined(ATI_OS_WIN)
|
||||
|
||||
if (!amd::Runtime::initialized()) {
|
||||
amd::Runtime::init();
|
||||
}
|
||||
|
||||
if (num_platforms != NULL && platforms == NULL) {
|
||||
*num_platforms = 1;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
assert(platforms != NULL && "check the code above");
|
||||
*platforms = reinterpret_cast<cl_platform_id>(&amd::PlatformID::Platform);
|
||||
|
||||
*not_null(num_platforms) = 1;
|
||||
if (!shouldLoad) {
|
||||
*not_null(num_platforms) = 0;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
#endif // defined(ATI_OS_WIN)
|
||||
|
||||
if (!amd::Runtime::initialized()) {
|
||||
amd::Runtime::init();
|
||||
}
|
||||
|
||||
if (num_platforms != NULL && platforms == NULL) {
|
||||
*num_platforms = 1;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
assert(platforms != NULL && "check the code above");
|
||||
*platforms = reinterpret_cast<cl_platform_id>(&amd::PlatformID::Platform);
|
||||
|
||||
*not_null(num_platforms) = 1;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
Plik diff jest za duży
Load Diff
@@ -10,114 +10,140 @@ struct clk_builtins_t;
|
||||
// This must be a multiple of sizeof(cl_ulong16)
|
||||
#define __CPU_SCRATCH_SIZE 128
|
||||
|
||||
#define CLK_PRIVATE_MEMORY_SIZE (16*1024)
|
||||
#define CLK_PRIVATE_MEMORY_SIZE (16 * 1024)
|
||||
|
||||
struct clk_thread_info_block_t
|
||||
{
|
||||
// Warning! The size of this struct needs to be a multiple
|
||||
// of 16 when compiling 64 bit
|
||||
struct clk_thread_info_block_t {
|
||||
// Warning! The size of this struct needs to be a multiple
|
||||
// of 16 when compiling 64 bit
|
||||
|
||||
struct clk_builtins_t const * builtins;
|
||||
void * local_mem_base;
|
||||
void * local_scratch;
|
||||
const void * table_base;
|
||||
size_t pad;
|
||||
struct clk_builtins_t const* builtins;
|
||||
void* local_mem_base;
|
||||
void* local_scratch;
|
||||
const void* table_base;
|
||||
size_t pad;
|
||||
|
||||
uint work_dim;
|
||||
size_t global_offset[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
size_t global_size[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
uint work_dim;
|
||||
size_t global_offset[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
size_t global_size[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
|
||||
size_t enqueued_local_size[4];
|
||||
size_t local_size[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
size_t local_id[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
size_t group_id[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
size_t enqueued_local_size[4];
|
||||
size_t local_size[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
size_t local_id[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
size_t group_id[4]; /*dim0,dim1,dim2,invalid(dim<0||dim>2)*/
|
||||
};
|
||||
|
||||
typedef enum clk_value_type_t
|
||||
{
|
||||
T_VOID, T_CHAR, T_SHORT, T_INT,
|
||||
T_LONG, T_FLOAT, T_DOUBLE, T_POINTER,
|
||||
T_CHAR2, T_CHAR3, T_CHAR4, T_CHAR8, T_CHAR16,
|
||||
T_SHORT2, T_SHORT3, T_SHORT4, T_SHORT8, T_SHORT16,
|
||||
T_INT2, T_INT3, T_INT4, T_INT8, T_INT16,
|
||||
T_LONG2, T_LONG3, T_LONG4, T_LONG8, T_LONG16,
|
||||
T_FLOAT2, T_FLOAT3, T_FLOAT4, T_FLOAT8, T_FLOAT16,
|
||||
T_DOUBLE2, T_DOUBLE3, T_DOUBLE4, T_DOUBLE8, T_DOUBLE16,
|
||||
T_SAMPLER, T_SEMA, T_STRUCT, T_QUEUE, T_PAD
|
||||
typedef enum clk_value_type_t {
|
||||
T_VOID,
|
||||
T_CHAR,
|
||||
T_SHORT,
|
||||
T_INT,
|
||||
T_LONG,
|
||||
T_FLOAT,
|
||||
T_DOUBLE,
|
||||
T_POINTER,
|
||||
T_CHAR2,
|
||||
T_CHAR3,
|
||||
T_CHAR4,
|
||||
T_CHAR8,
|
||||
T_CHAR16,
|
||||
T_SHORT2,
|
||||
T_SHORT3,
|
||||
T_SHORT4,
|
||||
T_SHORT8,
|
||||
T_SHORT16,
|
||||
T_INT2,
|
||||
T_INT3,
|
||||
T_INT4,
|
||||
T_INT8,
|
||||
T_INT16,
|
||||
T_LONG2,
|
||||
T_LONG3,
|
||||
T_LONG4,
|
||||
T_LONG8,
|
||||
T_LONG16,
|
||||
T_FLOAT2,
|
||||
T_FLOAT3,
|
||||
T_FLOAT4,
|
||||
T_FLOAT8,
|
||||
T_FLOAT16,
|
||||
T_DOUBLE2,
|
||||
T_DOUBLE3,
|
||||
T_DOUBLE4,
|
||||
T_DOUBLE8,
|
||||
T_DOUBLE16,
|
||||
T_SAMPLER,
|
||||
T_SEMA,
|
||||
T_STRUCT,
|
||||
T_QUEUE,
|
||||
T_PAD
|
||||
} clk_value_type_t;
|
||||
|
||||
typedef enum clk_address_space_t
|
||||
{
|
||||
A_PRIVATE, A_LOCAL, A_CONSTANT, A_GLOBAL, A_REGION
|
||||
typedef enum clk_address_space_t {
|
||||
A_PRIVATE,
|
||||
A_LOCAL,
|
||||
A_CONSTANT,
|
||||
A_GLOBAL,
|
||||
A_REGION
|
||||
} clk_address_space_t;
|
||||
|
||||
//kernel arg access qualifier and type qualifier
|
||||
typedef enum clk_arg_qualifier_t
|
||||
{
|
||||
Q_NONE = 0,
|
||||
// kernel arg access qualifier and type qualifier
|
||||
typedef enum clk_arg_qualifier_t {
|
||||
Q_NONE = 0,
|
||||
|
||||
//for image type only, access qualifier
|
||||
Q_READ = 1,
|
||||
Q_WRITE = 2,
|
||||
// for image type only, access qualifier
|
||||
Q_READ = 1,
|
||||
Q_WRITE = 2,
|
||||
|
||||
//for pointer type only
|
||||
Q_CONST = 4, // pointee
|
||||
Q_RESTRICT = 8,
|
||||
Q_VOLATILE = 16, // pointee
|
||||
Q_PIPE = 32 // pipe
|
||||
// for pointer type only
|
||||
Q_CONST = 4, // pointee
|
||||
Q_RESTRICT = 8,
|
||||
Q_VOLATILE = 16, // pointee
|
||||
Q_PIPE = 32 // pipe
|
||||
|
||||
} clk_arg_qualifier_t;
|
||||
|
||||
#pragma pack(push, 4)
|
||||
struct clk_parameter_descriptor_t
|
||||
{
|
||||
clk_value_type_t type;
|
||||
clk_address_space_t space;
|
||||
uint qualifier;
|
||||
const char* name;
|
||||
struct clk_parameter_descriptor_t {
|
||||
clk_value_type_t type;
|
||||
clk_address_space_t space;
|
||||
uint qualifier;
|
||||
const char* name;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
//#define CLK_LOCAL_MEM_FENCE (1 << 0)
|
||||
//#define CLK_GLOBAL_MEM_FENCE (1 << 1)
|
||||
|
||||
struct clk_builtins_t
|
||||
{
|
||||
/* Synchronization functions */
|
||||
void (*barrier_ptr)(cl_mem_fence_flags flags);
|
||||
struct clk_builtins_t {
|
||||
/* Synchronization functions */
|
||||
void (*barrier_ptr)(cl_mem_fence_flags flags);
|
||||
|
||||
/* AMD Only builtins: FIXME_lmoriche (extension) */
|
||||
void* reserved;
|
||||
int (*printf_ptr)(const char *format, ...);
|
||||
/* AMD Only builtins: FIXME_lmoriche (extension) */
|
||||
void* reserved;
|
||||
int (*printf_ptr)(const char* format, ...);
|
||||
};
|
||||
|
||||
enum clk_natures_t
|
||||
{
|
||||
KN_HAS_BARRIER = 1 << 0,
|
||||
KN_WG_LEVEL = 1 << 1
|
||||
};
|
||||
enum clk_natures_t { KN_HAS_BARRIER = 1 << 0, KN_WG_LEVEL = 1 << 1 };
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable : 4200 )
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4200)
|
||||
#endif
|
||||
|
||||
#if !defined(__OPENCL_VERSION__) || __OPENCL_VERSION__ >= 200
|
||||
|
||||
typedef struct clk_pipe_t
|
||||
{
|
||||
size_t read_idx;
|
||||
size_t write_idx;
|
||||
size_t end_idx;
|
||||
char padding[128 - 3*sizeof(size_t)];
|
||||
char packets[];
|
||||
typedef struct clk_pipe_t {
|
||||
size_t read_idx;
|
||||
size_t write_idx;
|
||||
size_t end_idx;
|
||||
char padding[128 - 3 * sizeof(size_t)];
|
||||
char packets[];
|
||||
} clk_pipe_t;
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning( pop )
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#endif /*CL_KERNEL_H_*/
|
||||
|
||||
|
||||
@@ -42,92 +42,73 @@
|
||||
* \a param_value is not NULL
|
||||
* - CL_INVALID_KERNEL if \a kernel is a not a valid program object
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetKernelInfoAMD, (
|
||||
cl_kernel kernel,
|
||||
cl_device_id device,
|
||||
cl_kernel_info_amd param_name,
|
||||
size_t param_value_size,
|
||||
void* param_value,
|
||||
size_t* param_value_size_ret))
|
||||
{
|
||||
// Check if we have a valid device
|
||||
if (!is_valid(device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetKernelInfoAMD,
|
||||
(cl_kernel kernel, cl_device_id device, cl_kernel_info_amd param_name,
|
||||
size_t param_value_size, void* param_value, size_t* param_value_size_ret)) {
|
||||
// Check if we have a valid device
|
||||
if (!is_valid(device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
|
||||
// Check if we have a valid performance counter
|
||||
if (!is_valid(kernel)) {
|
||||
return CL_INVALID_KERNEL;
|
||||
}
|
||||
// Check if we have a valid performance counter
|
||||
if (!is_valid(kernel)) {
|
||||
return CL_INVALID_KERNEL;
|
||||
}
|
||||
|
||||
// Find the kernel, associated with the specified device
|
||||
const device::Kernel* devKernel =
|
||||
as_amd(kernel)->getDeviceKernel(*as_amd(device));
|
||||
// Find the kernel, associated with the specified device
|
||||
const device::Kernel* devKernel = as_amd(kernel)->getDeviceKernel(*as_amd(device));
|
||||
|
||||
// Make sure we found a valid kernel
|
||||
if (devKernel == NULL) {
|
||||
return CL_INVALID_KERNEL;
|
||||
}
|
||||
// Make sure we found a valid kernel
|
||||
if (devKernel == NULL) {
|
||||
return CL_INVALID_KERNEL;
|
||||
}
|
||||
|
||||
// Get the corresponded parameters
|
||||
switch (param_name) {
|
||||
// Get the corresponded parameters
|
||||
switch (param_name) {
|
||||
case CL_KERNELINFO_SCRATCH_REGS:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->scratchRegs_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->scratchRegs_, param_value_size, param_value,
|
||||
param_value_size_ret);
|
||||
case CL_KERNELINFO_WAVEFRONT_PER_SIMD:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->wavefrontPerSIMD_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->wavefrontPerSIMD_, param_value_size,
|
||||
param_value, param_value_size_ret);
|
||||
case CL_KERNELINFO_WAVEFRONT_SIZE:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->wavefrontSize_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->wavefrontSize_, param_value_size,
|
||||
param_value, param_value_size_ret);
|
||||
case CL_KERNELINFO_AVAILABLE_GPRS:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->availableGPRs_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->availableGPRs_, param_value_size,
|
||||
param_value, param_value_size_ret);
|
||||
case CL_KERNELINFO_USED_GPRS:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->usedGPRs_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->usedGPRs_, param_value_size, param_value,
|
||||
param_value_size_ret);
|
||||
case CL_KERNELINFO_AVAILABLE_SGPRS:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->availableSGPRs_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->availableSGPRs_, param_value_size,
|
||||
param_value, param_value_size_ret);
|
||||
case CL_KERNELINFO_USED_SGPRS:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->usedSGPRs_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->usedSGPRs_, param_value_size, param_value,
|
||||
param_value_size_ret);
|
||||
case CL_KERNELINFO_AVAILABLE_VGPRS:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->availableVGPRs_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->availableVGPRs_, param_value_size,
|
||||
param_value, param_value_size_ret);
|
||||
case CL_KERNELINFO_USED_VGPRS:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->usedVGPRs_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->usedVGPRs_, param_value_size, param_value,
|
||||
param_value_size_ret);
|
||||
case CL_KERNELINFO_AVAILABLE_LDS_SIZE:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->availableLDSSize_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->availableLDSSize_, param_value_size,
|
||||
param_value, param_value_size_ret);
|
||||
case CL_KERNELINFO_USED_LDS_SIZE:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->usedLDSSize_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->usedLDSSize_, param_value_size, param_value,
|
||||
param_value_size_ret);
|
||||
case CL_KERNELINFO_AVAILABLE_STACK_SIZE:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->availableStackSize_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->availableStackSize_, param_value_size,
|
||||
param_value, param_value_size_ret);
|
||||
case CL_KERNELINFO_USED_STACK_SIZE:
|
||||
return amd::clGetInfo(
|
||||
devKernel->workGroupInfo()->usedStackSize_,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
return amd::clGetInfo(devKernel->workGroupInfo()->usedStackSize_, param_value_size,
|
||||
param_value, param_value_size_ret);
|
||||
default:
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
@@ -102,23 +102,22 @@ extern "C" {
|
||||
typedef cl_uint cl_kernel_info_amd;
|
||||
|
||||
/* cl_kernel_info */
|
||||
enum KernelInfoAMD
|
||||
{
|
||||
CL_KERNELINFO_NONE = 0x0,
|
||||
CL_KERNELINFO_SCRATCH_REGS,
|
||||
CL_KERNELINFO_WAVEFRONT_PER_SIMD,
|
||||
CL_KERNELINFO_WAVEFRONT_SIZE,
|
||||
CL_KERNELINFO_AVAILABLE_GPRS,
|
||||
CL_KERNELINFO_USED_GPRS,
|
||||
CL_KERNELINFO_AVAILABLE_LDS_SIZE,
|
||||
CL_KERNELINFO_USED_LDS_SIZE,
|
||||
CL_KERNELINFO_AVAILABLE_STACK_SIZE,
|
||||
CL_KERNELINFO_USED_STACK_SIZE,
|
||||
CL_KERNELINFO_AVAILABLE_SGPRS,
|
||||
CL_KERNELINFO_USED_SGPRS,
|
||||
CL_KERNELINFO_AVAILABLE_VGPRS,
|
||||
CL_KERNELINFO_USED_VGPRS,
|
||||
CL_KERNELINFO_LAST
|
||||
enum KernelInfoAMD {
|
||||
CL_KERNELINFO_NONE = 0x0,
|
||||
CL_KERNELINFO_SCRATCH_REGS,
|
||||
CL_KERNELINFO_WAVEFRONT_PER_SIMD,
|
||||
CL_KERNELINFO_WAVEFRONT_SIZE,
|
||||
CL_KERNELINFO_AVAILABLE_GPRS,
|
||||
CL_KERNELINFO_USED_GPRS,
|
||||
CL_KERNELINFO_AVAILABLE_LDS_SIZE,
|
||||
CL_KERNELINFO_USED_LDS_SIZE,
|
||||
CL_KERNELINFO_AVAILABLE_STACK_SIZE,
|
||||
CL_KERNELINFO_USED_STACK_SIZE,
|
||||
CL_KERNELINFO_AVAILABLE_SGPRS,
|
||||
CL_KERNELINFO_USED_SGPRS,
|
||||
CL_KERNELINFO_AVAILABLE_VGPRS,
|
||||
CL_KERNELINFO_USED_VGPRS,
|
||||
CL_KERNELINFO_LAST
|
||||
};
|
||||
|
||||
/*! \brief Retrieves the kernel information.
|
||||
@@ -148,18 +147,13 @@ enum KernelInfoAMD
|
||||
* \a param_value is not NULL
|
||||
* - CL_INVALID_KERNEL if \a kernel is a not a valid program object
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetKernelInfoAMD(
|
||||
cl_kernel /* kernel */,
|
||||
cl_device_id /* device */,
|
||||
cl_kernel_info_amd /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void* /* param_value */,
|
||||
size_t* /* param_value_size_ret */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clGetKernelInfoAMD(
|
||||
cl_kernel /* kernel */, cl_device_id /* device */, cl_kernel_info_amd /* param_name */,
|
||||
size_t /* param_value_size */, void* /* param_value */, size_t* /* param_value_size_ret */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*__CL_KERNEL_INFO_AMD_H*/
|
||||
#endif /*__CL_KERNEL_INFO_AMD_H*/
|
||||
|
||||
@@ -11,98 +11,89 @@
|
||||
|
||||
#if defined __linux__
|
||||
typedef wchar_t char_t;
|
||||
#endif // __linux__
|
||||
#endif // __linux__
|
||||
|
||||
#if !defined(BUILD_HSA_TARGET) && defined(_WIN32)
|
||||
#define WITH_LIQUID_FLASH 1
|
||||
#endif // _WIN32
|
||||
#endif // _WIN32
|
||||
|
||||
#if defined(WITH_LIQUID_FLASH)
|
||||
#include "lf.h"
|
||||
#endif // WITH_LIQUID_FLASH
|
||||
#endif // WITH_LIQUID_FLASH
|
||||
|
||||
|
||||
namespace amd {
|
||||
|
||||
LiquidFlashFile::~LiquidFlashFile()
|
||||
{
|
||||
close();
|
||||
LiquidFlashFile::~LiquidFlashFile() { close(); }
|
||||
|
||||
bool LiquidFlashFile::open() {
|
||||
#if defined WITH_LIQUID_FLASH
|
||||
lf_status err;
|
||||
lf_file_flags flags;
|
||||
|
||||
switch (flags_) {
|
||||
case CL_FILE_READ_ONLY_AMD:
|
||||
flags = LF_READ;
|
||||
break;
|
||||
case CL_FILE_WRITE_ONLY_AMD:
|
||||
flags = LF_WRITE;
|
||||
break;
|
||||
case CL_FILE_READ_WRITE_AMD:
|
||||
flags = LF_READ | LF_WRITE;
|
||||
break;
|
||||
}
|
||||
|
||||
handle_ = lfOpenFile(name_, flags, &err);
|
||||
if (err != lf_success) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lfGetFileBlockSize((lf_file)handle_, &blockSize_) != lf_success) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lfGetFileSize((lf_file)handle_, &fileSize_) != lf_success) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif // WITH_LIQUID_FLASH
|
||||
}
|
||||
|
||||
bool
|
||||
LiquidFlashFile::open()
|
||||
{
|
||||
void LiquidFlashFile::close() {
|
||||
#if defined WITH_LIQUID_FLASH
|
||||
lf_status err;
|
||||
lf_file_flags flags;
|
||||
if (handle_ != NULL) {
|
||||
lfReleaseFile((lf_file)handle_);
|
||||
handle_ = NULL;
|
||||
}
|
||||
#endif // WITH_LIQUID_FLASH
|
||||
}
|
||||
|
||||
switch (flags_) {
|
||||
case CL_FILE_READ_ONLY_AMD: flags = LF_READ; break;
|
||||
case CL_FILE_WRITE_ONLY_AMD: flags = LF_WRITE; break;
|
||||
case CL_FILE_READ_WRITE_AMD: flags = LF_READ|LF_WRITE; break;
|
||||
}
|
||||
bool LiquidFlashFile::transferBlock(bool writeBuffer, void* srcDst, uint64_t bufferSize,
|
||||
uint64_t fileOffset, uint64_t bufferOffset,
|
||||
uint64_t size) const {
|
||||
#if defined WITH_LIQUID_FLASH
|
||||
lf_status status;
|
||||
|
||||
handle_ = lfOpenFile(name_, flags, &err);
|
||||
if (err != lf_success) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lfGetFileBlockSize((lf_file)handle_, &blockSize_) != lf_success) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (lfGetFileSize((lf_file)handle_, &fileSize_) != lf_success) {
|
||||
return false;
|
||||
}
|
||||
lf_region_descriptor region = {fileOffset / blockSize(), bufferOffset / blockSize(),
|
||||
size / blockSize()};
|
||||
if (writeBuffer) {
|
||||
status = lfReadFile(srcDst, bufferSize, (lf_file)handle_, 1, ®ion, NULL);
|
||||
} else {
|
||||
status = lfWriteFile(srcDst, bufferSize, (lf_file)handle_, 1, ®ion, NULL);
|
||||
}
|
||||
if (lf_success == status) {
|
||||
return true;
|
||||
#else
|
||||
} else {
|
||||
return false;
|
||||
#endif // WITH_LIQUID_FLASH
|
||||
}
|
||||
|
||||
void
|
||||
LiquidFlashFile::close()
|
||||
{
|
||||
#if defined WITH_LIQUID_FLASH
|
||||
if (handle_ != NULL) {
|
||||
lfReleaseFile((lf_file)handle_);
|
||||
handle_ = NULL;
|
||||
}
|
||||
#endif // WITH_LIQUID_FLASH
|
||||
}
|
||||
|
||||
bool
|
||||
LiquidFlashFile::transferBlock(
|
||||
bool writeBuffer,
|
||||
void* srcDst,
|
||||
uint64_t bufferSize,
|
||||
uint64_t fileOffset,
|
||||
uint64_t bufferOffset,
|
||||
uint64_t size) const
|
||||
{
|
||||
#if defined WITH_LIQUID_FLASH
|
||||
lf_status status;
|
||||
|
||||
lf_region_descriptor region =
|
||||
{ fileOffset / blockSize(), bufferOffset / blockSize(), size / blockSize() };
|
||||
if (writeBuffer) {
|
||||
status = lfReadFile(srcDst, bufferSize, (lf_file)handle_, 1, ®ion, NULL);
|
||||
}
|
||||
else {
|
||||
status = lfWriteFile(srcDst, bufferSize, (lf_file)handle_, 1, ®ion, NULL);
|
||||
}
|
||||
if (lf_success == status) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#else
|
||||
return false;
|
||||
#endif // WITH_LIQUID_FLASH
|
||||
return false;
|
||||
#endif // WITH_LIQUID_FLASH
|
||||
}
|
||||
|
||||
} // namespace amd
|
||||
} // namespace amd
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
@@ -112,224 +103,164 @@ LiquidFlashFile::transferBlock(
|
||||
*
|
||||
*/
|
||||
|
||||
RUNTIME_ENTRY_RET(cl_file_amd, clCreateSsgFileObjectAMD, (
|
||||
cl_context context,
|
||||
cl_file_flags_amd flags,
|
||||
const wchar_t* file_name,
|
||||
cl_int* errcode_ret))
|
||||
{
|
||||
amd::LiquidFlashFile* file = new amd::LiquidFlashFile(file_name, flags);
|
||||
RUNTIME_ENTRY_RET(cl_file_amd, clCreateSsgFileObjectAMD,
|
||||
(cl_context context, cl_file_flags_amd flags, const wchar_t* file_name,
|
||||
cl_int* errcode_ret)) {
|
||||
amd::LiquidFlashFile* file = new amd::LiquidFlashFile(file_name, flags);
|
||||
|
||||
if (file == NULL) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_file_amd)0;
|
||||
}
|
||||
if (file == NULL) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_file_amd)0;
|
||||
}
|
||||
|
||||
if (!file->open()) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
delete file;
|
||||
return (cl_file_amd)0;
|
||||
}
|
||||
if (!file->open()) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
delete file;
|
||||
return (cl_file_amd)0;
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(file);
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(file);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clGetSsgFileObjectInfoAMD, (
|
||||
cl_file_amd file,
|
||||
cl_file_info_amd param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(file)) {
|
||||
return CL_INVALID_FILE_OBJECT_AMD;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetSsgFileObjectInfoAMD,
|
||||
(cl_file_amd file, cl_file_info_amd param_name, size_t param_value_size,
|
||||
void* param_value, size_t* param_value_size_ret)) {
|
||||
if (!is_valid(file)) {
|
||||
return CL_INVALID_FILE_OBJECT_AMD;
|
||||
}
|
||||
|
||||
switch (param_name) {
|
||||
switch (param_name) {
|
||||
case CL_FILE_BLOCK_SIZE_AMD: {
|
||||
cl_uint blockSize = as_amd(file)->blockSize();
|
||||
return amd::clGetInfo(
|
||||
blockSize, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint blockSize = as_amd(file)->blockSize();
|
||||
return amd::clGetInfo(blockSize, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_FILE_SIZE_AMD: {
|
||||
cl_ulong fileSize = as_amd(file)->fileSize();
|
||||
return amd::clGetInfo(
|
||||
fileSize, param_value_size, param_value, param_value_size_ret);
|
||||
cl_ulong fileSize = as_amd(file)->fileSize();
|
||||
return amd::clGetInfo(fileSize, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clRetainSsgFileObjectAMD, (cl_file_amd file)) {
|
||||
if (!is_valid(file)) {
|
||||
return CL_INVALID_FILE_OBJECT_AMD;
|
||||
}
|
||||
as_amd(file)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clReleaseSsgFileObjectAMD, (cl_file_amd file)) {
|
||||
if (!is_valid(file)) {
|
||||
return CL_INVALID_FILE_OBJECT_AMD;
|
||||
}
|
||||
as_amd(file)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
static cl_int EnqueueTransferBufferFromSsgFileAMD(
|
||||
cl_bool isWrite, cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write,
|
||||
size_t buffer_offset, size_t cb, cl_file_amd file, size_t file_offset,
|
||||
cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if (!is_valid(buffer)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
amd::Buffer* pBuffer = as_amd(buffer)->asBuffer();
|
||||
if (pBuffer == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (pBuffer->getMemFlags() & (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
if (hostQueue.context() != pBuffer->getContext()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
if (!is_valid(file)) {
|
||||
return CL_INVALID_FILE_OBJECT_AMD;
|
||||
}
|
||||
|
||||
amd::LiquidFlashFile* amdFile = as_amd(file);
|
||||
amd::Coord3D bufferOffset(buffer_offset, 0, 0);
|
||||
amd::Coord3D bufferSize(cb, 1, 1);
|
||||
|
||||
if ((!pBuffer->validateRegion(bufferOffset, bufferSize)) ||
|
||||
// LF library supports aligned sizes only
|
||||
((buffer_offset % amdFile->blockSize()) != 0) || ((cb % amdFile->blockSize()) != 0) ||
|
||||
((file_offset % amdFile->blockSize()) != 0)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue.context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::TransferBufferFileCommand* command;
|
||||
command = new amd::TransferBufferFileCommand(
|
||||
isWrite ? CL_COMMAND_READ_SSG_FILE_AMD : CL_COMMAND_WRITE_SSG_FILE_AMD, hostQueue,
|
||||
eventWaitList, *pBuffer, bufferOffset, bufferSize, amdFile, file_offset);
|
||||
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_MEM_OBJECT_ALLOCATION_FAILURE;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
if (blocking_write) {
|
||||
command->awaitCompletion();
|
||||
}
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueReadSsgFileAMD,
|
||||
(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write,
|
||||
size_t buffer_offset, size_t cb, cl_file_amd file, size_t file_offset,
|
||||
cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event)) {
|
||||
return EnqueueTransferBufferFromSsgFileAMD(CL_TRUE, command_queue, buffer, blocking_write,
|
||||
buffer_offset, cb, file, file_offset,
|
||||
num_events_in_wait_list, event_wait_list, event);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clRetainSsgFileObjectAMD, (
|
||||
cl_file_amd file))
|
||||
{
|
||||
if (!is_valid(file)) {
|
||||
return CL_INVALID_FILE_OBJECT_AMD;
|
||||
}
|
||||
as_amd(file)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clReleaseSsgFileObjectAMD, (
|
||||
cl_file_amd file))
|
||||
{
|
||||
if (!is_valid(file)) {
|
||||
return CL_INVALID_FILE_OBJECT_AMD;
|
||||
}
|
||||
as_amd(file)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
static cl_int
|
||||
EnqueueTransferBufferFromSsgFileAMD(
|
||||
cl_bool isWrite,
|
||||
cl_command_queue command_queue,
|
||||
cl_mem buffer,
|
||||
cl_bool blocking_write,
|
||||
size_t buffer_offset,
|
||||
size_t cb,
|
||||
cl_file_amd file,
|
||||
size_t file_offset,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event *event_wait_list,
|
||||
cl_event *event)
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if (!is_valid(buffer)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
amd::Buffer* pBuffer = as_amd(buffer)->asBuffer();
|
||||
if (pBuffer == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (pBuffer->getMemFlags() &
|
||||
(CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_NO_ACCESS)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
if(hostQueue.context() != pBuffer->getContext()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
if (!is_valid(file)) {
|
||||
return CL_INVALID_FILE_OBJECT_AMD;
|
||||
}
|
||||
|
||||
amd::LiquidFlashFile* amdFile = as_amd(file);
|
||||
amd::Coord3D bufferOffset(buffer_offset, 0, 0);
|
||||
amd::Coord3D bufferSize(cb, 1, 1);
|
||||
|
||||
if ((!pBuffer->validateRegion(bufferOffset, bufferSize)) ||
|
||||
// LF library supports aligned sizes only
|
||||
((buffer_offset % amdFile->blockSize()) != 0) ||
|
||||
((cb % amdFile->blockSize()) != 0) ||
|
||||
((file_offset % amdFile->blockSize()) != 0)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue.context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS){
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::TransferBufferFileCommand *command;
|
||||
command = new amd::TransferBufferFileCommand(
|
||||
isWrite ? CL_COMMAND_READ_SSG_FILE_AMD : CL_COMMAND_WRITE_SSG_FILE_AMD,
|
||||
hostQueue, eventWaitList, *pBuffer, bufferOffset, bufferSize,
|
||||
amdFile, file_offset);
|
||||
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_MEM_OBJECT_ALLOCATION_FAILURE;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
if (blocking_write) {
|
||||
command->awaitCompletion();
|
||||
}
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueReadSsgFileAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_mem buffer,
|
||||
cl_bool blocking_write,
|
||||
size_t buffer_offset,
|
||||
size_t cb,
|
||||
cl_file_amd file,
|
||||
size_t file_offset,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event *event_wait_list,
|
||||
cl_event *event))
|
||||
{
|
||||
return EnqueueTransferBufferFromSsgFileAMD(
|
||||
CL_TRUE,
|
||||
command_queue,
|
||||
buffer,
|
||||
blocking_write,
|
||||
buffer_offset,
|
||||
cb,
|
||||
file,
|
||||
file_offset,
|
||||
num_events_in_wait_list,
|
||||
event_wait_list,
|
||||
event);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWriteSsgFileAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_mem buffer,
|
||||
cl_bool blocking_write,
|
||||
size_t buffer_offset,
|
||||
size_t cb,
|
||||
cl_file_amd file,
|
||||
size_t file_offset,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event))
|
||||
{
|
||||
return EnqueueTransferBufferFromSsgFileAMD(
|
||||
CL_FALSE,
|
||||
command_queue,
|
||||
buffer,
|
||||
blocking_write,
|
||||
buffer_offset,
|
||||
cb,
|
||||
file,
|
||||
file_offset,
|
||||
num_events_in_wait_list,
|
||||
event_wait_list,
|
||||
event);
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWriteSsgFileAMD,
|
||||
(cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write,
|
||||
size_t buffer_offset, size_t cb, cl_file_amd file, size_t file_offset,
|
||||
cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event)) {
|
||||
return EnqueueTransferBufferFromSsgFileAMD(CL_FALSE, command_queue, buffer, blocking_write,
|
||||
buffer_offset, cb, file, file_offset,
|
||||
num_events_in_wait_list, event_wait_list, event);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -8,53 +8,28 @@ extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
extern CL_API_ENTRY cl_file_amd CL_API_CALL
|
||||
clCreateSsgFileObjectAMD(
|
||||
cl_context context,
|
||||
cl_file_flags_amd flags,
|
||||
const wchar_t * file_name,
|
||||
cl_int * errcode_ret) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
clCreateSsgFileObjectAMD(cl_context context, cl_file_flags_amd flags, const wchar_t* file_name,
|
||||
cl_int* errcode_ret) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetSsgFileObjectInfoAMD(
|
||||
cl_file_amd file,
|
||||
cl_file_info_amd param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clGetSsgFileObjectInfoAMD(
|
||||
cl_file_amd file, cl_file_info_amd param_name, size_t param_value_size, void* param_value,
|
||||
size_t* param_value_size_ret) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clRetainSsgFileObjectAMD(
|
||||
cl_file_amd file) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clRetainSsgFileObjectAMD(cl_file_amd file)
|
||||
CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clReleaseSsgFileObjectAMD(
|
||||
cl_file_amd file) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clReleaseSsgFileObjectAMD(cl_file_amd file)
|
||||
CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueReadSsgFileAMD(
|
||||
cl_command_queue command_queue,
|
||||
cl_mem buffer,
|
||||
cl_bool blocking_write,
|
||||
size_t buffer_offset,
|
||||
size_t cb,
|
||||
cl_file_amd file,
|
||||
size_t file_offset,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueReadSsgFileAMD(
|
||||
cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t buffer_offset,
|
||||
size_t cb, cl_file_amd file, size_t file_offset, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueWriteSsgFileAMD(
|
||||
cl_command_queue command_queue,
|
||||
cl_mem buffer,
|
||||
cl_bool blocking_write,
|
||||
size_t buffer_offset,
|
||||
size_t cb,
|
||||
cl_file_amd file,
|
||||
size_t file_offset,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteSsgFileAMD(
|
||||
cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t buffer_offset,
|
||||
size_t cb, cl_file_amd file, size_t file_offset, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
|
||||
+2294
-2722
Plik diff jest za duży
Load Diff
@@ -4,69 +4,58 @@
|
||||
|
||||
#include "cl_common.hpp"
|
||||
|
||||
RUNTIME_ENTRY_RET(cl_key_amd, clCreateKeyAMD, (
|
||||
cl_platform_id platform,
|
||||
void (CL_CALLBACK * destructor)( void* ),
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
cl_key_amd key = amd::ObjectMetadata::createKey(destructor);
|
||||
RUNTIME_ENTRY_RET(cl_key_amd, clCreateKeyAMD,
|
||||
(cl_platform_id platform, void(CL_CALLBACK* destructor)(void*),
|
||||
cl_int* errcode_ret)) {
|
||||
cl_key_amd key = amd::ObjectMetadata::createKey(destructor);
|
||||
|
||||
*not_null(errcode_ret) = amd::ObjectMetadata::check(key)
|
||||
? CL_SUCCESS : CL_OUT_OF_RESOURCES;
|
||||
*not_null(errcode_ret) = amd::ObjectMetadata::check(key) ? CL_SUCCESS : CL_OUT_OF_RESOURCES;
|
||||
|
||||
return key;
|
||||
return key;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clObjectGetValueForKeyAMD, (
|
||||
void * object,
|
||||
cl_key_amd key,
|
||||
void ** ret_val))
|
||||
{
|
||||
if (ret_val == NULL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*ret_val = NULL;
|
||||
RUNTIME_ENTRY(cl_int, clObjectGetValueForKeyAMD, (void* object, cl_key_amd key, void** ret_val)) {
|
||||
if (ret_val == NULL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*ret_val = NULL;
|
||||
|
||||
if (!amd::RuntimeObject::isValidHandle(object)) {
|
||||
return CL_INVALID_OBJECT_AMD;
|
||||
}
|
||||
if (!amd::ObjectMetadata::check(key)) {
|
||||
return CL_INVALID_KEY_AMD;
|
||||
}
|
||||
if (!amd::RuntimeObject::isValidHandle(object)) {
|
||||
return CL_INVALID_OBJECT_AMD;
|
||||
}
|
||||
if (!amd::ObjectMetadata::check(key)) {
|
||||
return CL_INVALID_KEY_AMD;
|
||||
}
|
||||
|
||||
amd::ObjectMetadata& metadata =
|
||||
amd::RuntimeObject::fromHandle<amd::RuntimeObject>(object)->metadata();
|
||||
amd::ObjectMetadata& metadata =
|
||||
amd::RuntimeObject::fromHandle<amd::RuntimeObject>(object)->metadata();
|
||||
|
||||
void* value = metadata.getValueForKey(key);
|
||||
if (value == NULL) {
|
||||
return CL_INVALID_KEY_AMD;
|
||||
}
|
||||
void* value = metadata.getValueForKey(key);
|
||||
if (value == NULL) {
|
||||
return CL_INVALID_KEY_AMD;
|
||||
}
|
||||
|
||||
*ret_val = value;
|
||||
return CL_SUCCESS;
|
||||
*ret_val = value;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clObjectSetValueForKeyAMD, (
|
||||
void * object,
|
||||
cl_key_amd key,
|
||||
void * value))
|
||||
{
|
||||
if (!amd::RuntimeObject::isValidHandle(object)) {
|
||||
return CL_INVALID_OBJECT_AMD;
|
||||
}
|
||||
if (!amd::ObjectMetadata::check(key)) {
|
||||
return CL_INVALID_KEY_AMD;
|
||||
}
|
||||
if (value == NULL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clObjectSetValueForKeyAMD, (void* object, cl_key_amd key, void* value)) {
|
||||
if (!amd::RuntimeObject::isValidHandle(object)) {
|
||||
return CL_INVALID_OBJECT_AMD;
|
||||
}
|
||||
if (!amd::ObjectMetadata::check(key)) {
|
||||
return CL_INVALID_KEY_AMD;
|
||||
}
|
||||
if (value == NULL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
amd::ObjectMetadata& metadata =
|
||||
amd::RuntimeObject::fromHandle<amd::RuntimeObject>(object)->metadata();
|
||||
amd::ObjectMetadata& metadata =
|
||||
amd::RuntimeObject::fromHandle<amd::RuntimeObject>(object)->metadata();
|
||||
|
||||
metadata.setValueForKey(key, value);
|
||||
return CL_SUCCESS;
|
||||
metadata.setValueForKey(key, value);
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -57,67 +57,62 @@
|
||||
*
|
||||
* \version 2.0r19
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_mem, clCreatePipe, (
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
cl_uint pipe_packet_size,
|
||||
cl_uint pipe_max_packets,
|
||||
const cl_pipe_properties *properties,
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
return NULL;
|
||||
RUNTIME_ENTRY_RET(cl_mem, clCreatePipe,
|
||||
(cl_context context, cl_mem_flags flags, cl_uint pipe_packet_size,
|
||||
cl_uint pipe_max_packets, const cl_pipe_properties* properties,
|
||||
cl_int* errcode_ret)) {
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// check flags for validity
|
||||
cl_bitfield temp =
|
||||
flags & (CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | CL_MEM_HOST_NO_ACCESS);
|
||||
|
||||
if (temp &&
|
||||
!(CL_MEM_READ_WRITE == temp || CL_MEM_WRITE_ONLY == temp || CL_MEM_READ_ONLY == temp ||
|
||||
CL_MEM_HOST_NO_ACCESS == temp)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid parameter \"flags\"");
|
||||
return (cl_mem)0;
|
||||
}
|
||||
|
||||
size_t size = sizeof(struct clk_pipe_t) + pipe_packet_size * pipe_max_packets;
|
||||
|
||||
const std::vector<amd::Device*>& devices = as_amd(context)->devices();
|
||||
std::vector<amd::Device*>::const_iterator it;
|
||||
bool sizePass = false;
|
||||
for (it = devices.begin(); it != devices.end(); ++it) {
|
||||
if (((*it)->info().maxMemAllocSize_ >= size)) {
|
||||
sizePass = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// check flags for validity
|
||||
cl_bitfield temp = flags
|
||||
& (CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | CL_MEM_HOST_NO_ACCESS);
|
||||
// check size
|
||||
if (pipe_packet_size == 0 || pipe_max_packets == 0 || !sizePass) {
|
||||
*not_null(errcode_ret) = CL_INVALID_PIPE_SIZE;
|
||||
LogWarning("invalid parameter \"size = 0 or size > CL_DEVICE_PIPE_MAX_PACKET_SIZE\"");
|
||||
return (cl_mem)0;
|
||||
}
|
||||
|
||||
if(temp
|
||||
&& !(CL_MEM_READ_WRITE == temp
|
||||
|| CL_MEM_WRITE_ONLY == temp
|
||||
|| CL_MEM_READ_ONLY == temp
|
||||
|| CL_MEM_HOST_NO_ACCESS == temp)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid parameter \"flags\"");
|
||||
return (cl_mem) 0;
|
||||
}
|
||||
amd::Context& amdContext = *as_amd(context);
|
||||
amd::Memory* mem = new (amdContext)
|
||||
amd::Pipe(amdContext, flags, size, (size_t)pipe_packet_size, (size_t)pipe_max_packets);
|
||||
if (mem == NULL) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_mem)0;
|
||||
}
|
||||
|
||||
size_t size = sizeof(struct clk_pipe_t) + pipe_packet_size * pipe_max_packets;
|
||||
if (!mem->create()) {
|
||||
*not_null(errcode_ret) = CL_MEM_OBJECT_ALLOCATION_FAILURE;
|
||||
mem->release();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const std::vector<amd::Device*>& devices = as_amd(context)->devices();
|
||||
std::vector<amd::Device*>::const_iterator it;
|
||||
bool sizePass = false;
|
||||
for (it = devices.begin(); it != devices.end(); ++it) {
|
||||
if (((*it)->info().maxMemAllocSize_ >= size)) {
|
||||
sizePass = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// check size
|
||||
if (pipe_packet_size == 0 || pipe_max_packets == 0 || !sizePass ) {
|
||||
*not_null(errcode_ret) = CL_INVALID_PIPE_SIZE;
|
||||
LogWarning("invalid parameter \"size = 0 or size > CL_DEVICE_PIPE_MAX_PACKET_SIZE\"");
|
||||
return (cl_mem)0;
|
||||
}
|
||||
|
||||
amd::Context& amdContext = *as_amd(context);
|
||||
amd::Memory* mem = new(amdContext) amd::Pipe(amdContext, flags, size, (size_t)pipe_packet_size, (size_t)pipe_max_packets);
|
||||
if (mem == NULL) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_mem)0;
|
||||
}
|
||||
|
||||
if (!mem->create()) {
|
||||
*not_null(errcode_ret) = CL_MEM_OBJECT_ALLOCATION_FAILURE;
|
||||
mem->release();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(mem);
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(mem);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -141,44 +136,37 @@ RUNTIME_EXIT
|
||||
* - CL_INVALID_MEM_OBJECT if pipe is a not a valid pipe object.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required
|
||||
* by the OpenCL implementation on the device.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required
|
||||
* by the OpenCL implementation on the host.
|
||||
*
|
||||
* \version 2.0r19
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetPipeInfo, (
|
||||
cl_mem memobj,
|
||||
cl_image_info param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(memobj)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetPipeInfo,
|
||||
(cl_mem memobj, cl_image_info param_name, size_t param_value_size, void* param_value,
|
||||
size_t* param_value_size_ret)) {
|
||||
if (!is_valid(memobj)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::Pipe* pipe = as_amd(memobj)->asPipe();
|
||||
if (pipe == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
amd::Pipe* pipe = as_amd(memobj)->asPipe();
|
||||
if (pipe == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
switch (param_name) {
|
||||
switch (param_name) {
|
||||
case CL_PIPE_PACKET_SIZE: {
|
||||
cl_uint packetSize = pipe->getPacketSize();
|
||||
return amd::clGetInfo(
|
||||
packetSize, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint packetSize = pipe->getPacketSize();
|
||||
return amd::clGetInfo(packetSize, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_PIPE_MAX_PACKETS: {
|
||||
cl_uint count = pipe->getMaxNumPackets();
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint count = pipe->getMaxNumPackets();
|
||||
return amd::clGetInfo(count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
@@ -13,12 +13,11 @@
|
||||
*
|
||||
*/
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clUnloadPlatformAMD, (cl_platform_id platform))
|
||||
{
|
||||
if (AMD_PLATFORM == platform) {
|
||||
amd::Runtime::tearDown();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clUnloadPlatformAMD, (cl_platform_id platform)) {
|
||||
if (AMD_PLATFORM == platform) {
|
||||
amd::Runtime::tearDown();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
@@ -103,15 +103,15 @@ extern "C" {
|
||||
|
||||
/*! \brief Unloads the specified platform, handling all required cleanup.
|
||||
*
|
||||
* @todo This is still somewhat of a stub. It only works for the AMD
|
||||
* platform and just forces shutdown of all devices (to get PM4
|
||||
* @todo This is still somewhat of a stub. It only works for the AMD
|
||||
* platform and just forces shutdown of all devices (to get PM4
|
||||
* capture working). It should handle ICD unregistration as well.
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clUnloadPlatformAMD(cl_platform_id platform) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clUnloadPlatformAMD(cl_platform_id platform)
|
||||
CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*__CL_AMD_PROFILE_H*/
|
||||
#endif /*__CL_AMD_PROFILE_H*/
|
||||
|
||||
@@ -38,46 +38,40 @@
|
||||
*
|
||||
* \return Created perfcounter object
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_perfcounter_amd, clCreatePerfCounterAMD, (
|
||||
cl_device_id device,
|
||||
cl_perfcounter_property* properties,
|
||||
cl_int* errcode_ret))
|
||||
{
|
||||
// Make sure we have a valid device object
|
||||
if (!is_valid(device)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
return NULL;
|
||||
RUNTIME_ENTRY_RET(cl_perfcounter_amd, clCreatePerfCounterAMD,
|
||||
(cl_device_id device, cl_perfcounter_property* properties, cl_int* errcode_ret)) {
|
||||
// Make sure we have a valid device object
|
||||
if (!is_valid(device)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Make sure we have a valid pointer to the performance counter properties
|
||||
if (NULL == properties) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
amd::PerfCounter::Properties perfProperties;
|
||||
size_t size = 0;
|
||||
while (properties[size] != CL_PERFCOUNTER_NONE) {
|
||||
if (properties[size] < CL_PERFCOUNTER_LAST) {
|
||||
perfProperties[properties[size]] = static_cast<ulong>(properties[size + 1]);
|
||||
size += 2;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure we have a valid pointer to the performance counter properties
|
||||
if (NULL == properties) {
|
||||
return NULL;
|
||||
}
|
||||
// Create the device perf counter
|
||||
amd::PerfCounter* perfCounter = new amd::PerfCounter(*as_amd(device), perfProperties);
|
||||
|
||||
amd::PerfCounter::Properties perfProperties;
|
||||
size_t size = 0;
|
||||
while (properties[size] != CL_PERFCOUNTER_NONE) {
|
||||
if (properties[size] < CL_PERFCOUNTER_LAST) {
|
||||
perfProperties[properties[size]] =
|
||||
static_cast<ulong>(properties[size+1]);
|
||||
size += 2;
|
||||
}
|
||||
else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (perfCounter == NULL) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Create the device perf counter
|
||||
amd::PerfCounter* perfCounter =
|
||||
new amd::PerfCounter(*as_amd(device), perfProperties);
|
||||
|
||||
if (perfCounter == NULL) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(perfCounter);
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(perfCounter);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -89,14 +83,12 @@ RUNTIME_EXIT
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_OPERATION if we failed to release the object
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clReleasePerfCounterAMD, (
|
||||
cl_perfcounter_amd perf_counter))
|
||||
{
|
||||
if (!is_valid(perf_counter)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
as_amd(perf_counter)->release();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clReleasePerfCounterAMD, (cl_perfcounter_amd perf_counter)) {
|
||||
if (!is_valid(perf_counter)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
as_amd(perf_counter)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -108,14 +100,12 @@ RUNTIME_EXIT
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_OPERATION if we failed to release the object
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clRetainPerfCounterAMD, (
|
||||
cl_perfcounter_amd perf_counter))
|
||||
{
|
||||
if (!is_valid(perf_counter)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
as_amd(perf_counter)->retain();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clRetainPerfCounterAMD, (cl_perfcounter_amd perf_counter)) {
|
||||
if (!is_valid(perf_counter)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
as_amd(perf_counter)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -151,64 +141,58 @@ RUNTIME_EXIT
|
||||
* - CL_INVALID_OPERATION if we failed to enqueue the begin operation
|
||||
* - CL_INVALID_COMMAND_QUEUE if the queue is
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueBeginPerfCounterAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_perf_counters,
|
||||
cl_perfcounter_amd* perf_counters,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list,
|
||||
cl_event* event))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueBeginPerfCounterAMD,
|
||||
(cl_command_queue command_queue, cl_uint num_perf_counters,
|
||||
cl_perfcounter_amd* perf_counters, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if ((num_perf_counters == 0) || (perf_counters == NULL)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::PerfCounterCommand::PerfCounterList counters;
|
||||
|
||||
// Place all counters into the list
|
||||
for (cl_uint i = 0; i < num_perf_counters; ++i) {
|
||||
amd::PerfCounter* amdPerf = as_amd(perf_counters[i]);
|
||||
if (&hostQueue->device() == &amdPerf->device()) {
|
||||
counters.push_back(amdPerf);
|
||||
} else {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
}
|
||||
|
||||
if ((num_perf_counters == 0) || (perf_counters == NULL)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue->context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
// Create a new command for the performance counters
|
||||
amd::PerfCounterCommand* command = new amd::PerfCounterCommand(
|
||||
*hostQueue, eventWaitList, counters, amd::PerfCounterCommand::Begin);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
amd::PerfCounterCommand::PerfCounterList counters;
|
||||
// Submit the command to the device
|
||||
command->enqueue();
|
||||
|
||||
// Place all counters into the list
|
||||
for (cl_uint i = 0; i < num_perf_counters; ++i) {
|
||||
amd::PerfCounter* amdPerf = as_amd(perf_counters[i]);
|
||||
if (&hostQueue->device() == &amdPerf->device()) {
|
||||
counters.push_back(amdPerf);
|
||||
}
|
||||
else {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
}
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue->context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS){
|
||||
return err;
|
||||
}
|
||||
|
||||
// Create a new command for the performance counters
|
||||
amd::PerfCounterCommand* command =
|
||||
new amd::PerfCounterCommand(*hostQueue, eventWaitList, counters,
|
||||
amd::PerfCounterCommand::Begin);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Submit the command to the device
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -243,64 +227,58 @@ RUNTIME_EXIT
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_OPERATION if we failed to enqueue the end operation
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueEndPerfCounterAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_perf_counters,
|
||||
cl_perfcounter_amd* perf_counters,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list,
|
||||
cl_event* event))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueEndPerfCounterAMD,
|
||||
(cl_command_queue command_queue, cl_uint num_perf_counters,
|
||||
cl_perfcounter_amd* perf_counters, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if ((num_perf_counters == 0) || (perf_counters == NULL)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
amd::PerfCounterCommand::PerfCounterList counters;
|
||||
|
||||
// Place all counters into the list
|
||||
for (cl_uint i = 0; i < num_perf_counters; ++i) {
|
||||
amd::PerfCounter* amdPerf = as_amd(perf_counters[i]);
|
||||
if (&hostQueue->device() == &amdPerf->device()) {
|
||||
counters.push_back(amdPerf);
|
||||
} else {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
}
|
||||
|
||||
if ((num_perf_counters == 0) || (perf_counters == NULL)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue->context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
// Create a new command for the performance counters
|
||||
amd::PerfCounterCommand* command = new amd::PerfCounterCommand(
|
||||
*hostQueue, eventWaitList, counters, amd::PerfCounterCommand::End);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
amd::PerfCounterCommand::PerfCounterList counters;
|
||||
// Submit the command to the device
|
||||
command->enqueue();
|
||||
|
||||
// Place all counters into the list
|
||||
for (cl_uint i = 0; i < num_perf_counters; ++i) {
|
||||
amd::PerfCounter* amdPerf = as_amd(perf_counters[i]);
|
||||
if (&hostQueue->device() == &amdPerf->device()) {
|
||||
counters.push_back(amdPerf);
|
||||
}
|
||||
else {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
}
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue->context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS){
|
||||
return err;
|
||||
}
|
||||
|
||||
// Create a new command for the performance counters
|
||||
amd::PerfCounterCommand* command =
|
||||
new amd::PerfCounterCommand(*hostQueue, eventWaitList, counters,
|
||||
amd::PerfCounterCommand::End);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Submit the command to the device
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -323,57 +301,49 @@ RUNTIME_EXIT
|
||||
* - CL_PROFILING_INFO_NOT_AVAILABLE if event isn't finished.
|
||||
* - CL_INVALID_OPERATION if we failed to get the data
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetPerfCounterInfoAMD, (
|
||||
cl_perfcounter_amd perf_counter,
|
||||
cl_perfcounter_info param_name,
|
||||
size_t param_value_size,
|
||||
void* param_value,
|
||||
size_t* param_value_size_ret))
|
||||
{
|
||||
// Check if we have a valid performance counter
|
||||
if (!is_valid(perf_counter)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetPerfCounterInfoAMD,
|
||||
(cl_perfcounter_amd perf_counter, cl_perfcounter_info param_name,
|
||||
size_t param_value_size, void* param_value, size_t* param_value_size_ret)) {
|
||||
// Check if we have a valid performance counter
|
||||
if (!is_valid(perf_counter)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// Find the kernel, associated with the specified device
|
||||
const device::PerfCounter* devCounter =
|
||||
as_amd(perf_counter)->getDeviceCounter();
|
||||
// Find the kernel, associated with the specified device
|
||||
const device::PerfCounter* devCounter = as_amd(perf_counter)->getDeviceCounter();
|
||||
|
||||
// Make sure we found a valid performance counter
|
||||
if (devCounter == NULL) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
// Make sure we found a valid performance counter
|
||||
if (devCounter == NULL) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// Get the corresponded parameters
|
||||
switch (param_name) {
|
||||
// Get the corresponded parameters
|
||||
switch (param_name) {
|
||||
case CL_PERFCOUNTER_REFERENCE_COUNT: {
|
||||
cl_uint count = as_amd(perf_counter)->referenceCount();
|
||||
// Return the reference counter
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint count = as_amd(perf_counter)->referenceCount();
|
||||
// Return the reference counter
|
||||
return amd::clGetInfo(count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_PERFCOUNTER_GPU_BLOCK_INDEX:
|
||||
case CL_PERFCOUNTER_GPU_COUNTER_INDEX:
|
||||
case CL_PERFCOUNTER_GPU_EVENT_INDEX: {
|
||||
cl_ulong data = devCounter->getInfo(param_name);
|
||||
// Return the device performance counter information
|
||||
return amd::clGetInfo(data,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
cl_ulong data = devCounter->getInfo(param_name);
|
||||
// Return the device performance counter information
|
||||
return amd::clGetInfo(data, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_PERFCOUNTER_DATA: {
|
||||
cl_ulong data = devCounter->getInfo(param_name);
|
||||
if (static_cast<cl_ulong>(0xffffffffffffffffULL) == data) {
|
||||
return CL_PROFILING_INFO_NOT_AVAILABLE;
|
||||
}
|
||||
// Return the device performance counter result
|
||||
return amd::clGetInfo(data,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
cl_ulong data = devCounter->getInfo(param_name);
|
||||
if (static_cast<cl_ulong>(0xffffffffffffffffULL) == data) {
|
||||
return CL_PROFILING_INFO_NOT_AVAILABLE;
|
||||
}
|
||||
// Return the device performance counter result
|
||||
return amd::clGetInfo(data, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
@@ -99,20 +99,19 @@ jurisdiction and venue of these courts.
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
typedef struct _cl_perfcounter_amd * cl_perfcounter_amd;
|
||||
typedef struct _cl_perfcounter_amd* cl_perfcounter_amd;
|
||||
typedef cl_ulong cl_perfcounter_property;
|
||||
typedef cl_uint cl_perfcounter_info;
|
||||
|
||||
/* cl_perfcounter_info */
|
||||
enum PerfcounterInfo
|
||||
{
|
||||
CL_PERFCOUNTER_NONE = 0x0,
|
||||
CL_PERFCOUNTER_REFERENCE_COUNT = 0x1,
|
||||
CL_PERFCOUNTER_DATA = 0x2,
|
||||
CL_PERFCOUNTER_GPU_BLOCK_INDEX = 0x3,
|
||||
CL_PERFCOUNTER_GPU_COUNTER_INDEX = 0x4,
|
||||
CL_PERFCOUNTER_GPU_EVENT_INDEX = 0x5,
|
||||
CL_PERFCOUNTER_LAST
|
||||
enum PerfcounterInfo {
|
||||
CL_PERFCOUNTER_NONE = 0x0,
|
||||
CL_PERFCOUNTER_REFERENCE_COUNT = 0x1,
|
||||
CL_PERFCOUNTER_DATA = 0x2,
|
||||
CL_PERFCOUNTER_GPU_BLOCK_INDEX = 0x3,
|
||||
CL_PERFCOUNTER_GPU_COUNTER_INDEX = 0x4,
|
||||
CL_PERFCOUNTER_GPU_EVENT_INDEX = 0x5,
|
||||
CL_PERFCOUNTER_LAST
|
||||
};
|
||||
|
||||
/*! \brief Creates a new HW performance counter
|
||||
@@ -129,12 +128,9 @@ enum PerfcounterInfo
|
||||
*
|
||||
* \return the created perfcounter object
|
||||
*/
|
||||
extern CL_API_ENTRY cl_perfcounter_amd CL_API_CALL
|
||||
clCreatePerfCounterAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_perfcounter_property* /* properties */,
|
||||
cl_int* /* errcode_ret */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_perfcounter_amd CL_API_CALL clCreatePerfCounterAMD(
|
||||
cl_device_id /* device */, cl_perfcounter_property* /* properties */, cl_int* /* errcode_ret */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Destroy a performance counter object.
|
||||
*
|
||||
@@ -144,10 +140,8 @@ clCreatePerfCounterAMD(
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_OPERATION if we failed to release the object
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clReleasePerfCounterAMD(
|
||||
cl_perfcounter_amd /* perf_counter */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clReleasePerfCounterAMD(cl_perfcounter_amd /* perf_counter */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Increments the perfcounter object reference count.
|
||||
*
|
||||
@@ -157,10 +151,8 @@ clReleasePerfCounterAMD(
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_OPERATION if we failed to release the object
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clRetainPerfCounterAMD(
|
||||
cl_perfcounter_amd /* perf_counter */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clRetainPerfCounterAMD(cl_perfcounter_amd /* perf_counter */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Enqueues the begin command for the specified counters.
|
||||
*
|
||||
@@ -174,15 +166,11 @@ clRetainPerfCounterAMD(
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_OPERATION if we failed to enqueue the begin operation
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueBeginPerfCounterAMD(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_perf_counters */,
|
||||
cl_perfcounter_amd* /* perf_counters */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event* /* event_wait_list */,
|
||||
cl_event* /* event */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueBeginPerfCounterAMD(
|
||||
cl_command_queue /* command_queue */, cl_uint /* num_perf_counters */,
|
||||
cl_perfcounter_amd* /* perf_counters */, cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event* /* event_wait_list */, cl_event* /* event */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Enqueues the end command for the specified counters.
|
||||
*
|
||||
@@ -198,15 +186,11 @@ clEnqueueBeginPerfCounterAMD(
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_OPERATION if we failed to enqueue the end operation
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueEndPerfCounterAMD(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_perf_counters */,
|
||||
cl_perfcounter_amd* /* perf_counters */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event* /* event_wait_list */,
|
||||
cl_event* /* event */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueEndPerfCounterAMD(
|
||||
cl_command_queue /* command_queue */, cl_uint /* num_perf_counters */,
|
||||
cl_perfcounter_amd* /* perf_counters */, cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event* /* event_wait_list */, cl_event* /* event */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Retrieves the results from the counter objects.
|
||||
*
|
||||
@@ -231,17 +215,13 @@ clEnqueueEndPerfCounterAMD(
|
||||
* - CL_PROFILING_INFO_NOT_AVAILABLE if event isn't finished.
|
||||
* - CL_INVALID_OPERATION if we failed to get the data
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetPerfCounterInfoAMD(
|
||||
cl_perfcounter_amd /* perf_counter */,
|
||||
cl_perfcounter_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void* /* param_value */,
|
||||
size_t* /* param_value_size_ret */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clGetPerfCounterInfoAMD(
|
||||
cl_perfcounter_amd /* perf_counter */, cl_perfcounter_info /* param_name */,
|
||||
size_t /* param_value_size */, void* /* param_value */, size_t* /* param_value_size_ret */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*__CL_PROFILE_AMD_H*/
|
||||
#endif /*__CL_PROFILE_AMD_H*/
|
||||
|
||||
Plik diff jest za duży
Load Diff
@@ -52,138 +52,133 @@
|
||||
*
|
||||
* \version 2.0r19
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_sampler, clCreateSamplerWithProperties, (
|
||||
cl_context context,
|
||||
const cl_sampler_properties *sampler_properties,
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
if(!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
LogWarning("invalid parameter \"context\"");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
RUNTIME_ENTRY_RET(cl_sampler, clCreateSamplerWithProperties,
|
||||
(cl_context context, const cl_sampler_properties* sampler_properties,
|
||||
cl_int* errcode_ret)) {
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
LogWarning("invalid parameter \"context\"");
|
||||
return (cl_sampler)0;
|
||||
}
|
||||
|
||||
cl_bool normalizedCoords = CL_TRUE;
|
||||
cl_addressing_mode addressingMode = CL_ADDRESS_CLAMP;
|
||||
cl_filter_mode filterMode = CL_FILTER_NEAREST;
|
||||
cl_bool normalizedCoords = CL_TRUE;
|
||||
cl_addressing_mode addressingMode = CL_ADDRESS_CLAMP;
|
||||
cl_filter_mode filterMode = CL_FILTER_NEAREST;
|
||||
#ifndef CL_FILTER_NONE
|
||||
#define CL_FILTER_NONE 0x1142
|
||||
#endif
|
||||
cl_filter_mode mipFilterMode = CL_FILTER_NONE;
|
||||
float minLod = 0.f;
|
||||
float maxLod = CL_MAXFLOAT;
|
||||
cl_filter_mode mipFilterMode = CL_FILTER_NONE;
|
||||
float minLod = 0.f;
|
||||
float maxLod = CL_MAXFLOAT;
|
||||
|
||||
const struct SamplerProperty {
|
||||
cl_sampler_properties name;
|
||||
union {
|
||||
cl_sampler_properties raw;
|
||||
cl_bool normalizedCoords;
|
||||
cl_addressing_mode addressingMode;
|
||||
cl_filter_mode filterMode;
|
||||
cl_float lod;
|
||||
} value;
|
||||
} *p = reinterpret_cast<const SamplerProperty*>(sampler_properties);
|
||||
const struct SamplerProperty {
|
||||
cl_sampler_properties name;
|
||||
union {
|
||||
cl_sampler_properties raw;
|
||||
cl_bool normalizedCoords;
|
||||
cl_addressing_mode addressingMode;
|
||||
cl_filter_mode filterMode;
|
||||
cl_float lod;
|
||||
} value;
|
||||
}* p = reinterpret_cast<const SamplerProperty*>(sampler_properties);
|
||||
|
||||
if (p != NULL) while(p->name != 0) {
|
||||
switch(p->name) {
|
||||
if (p != NULL)
|
||||
while (p->name != 0) {
|
||||
switch (p->name) {
|
||||
case CL_SAMPLER_NORMALIZED_COORDS:
|
||||
normalizedCoords = p->value.normalizedCoords;
|
||||
break;
|
||||
normalizedCoords = p->value.normalizedCoords;
|
||||
break;
|
||||
case CL_SAMPLER_ADDRESSING_MODE:
|
||||
addressingMode = p->value.addressingMode;
|
||||
break;
|
||||
addressingMode = p->value.addressingMode;
|
||||
break;
|
||||
case CL_SAMPLER_FILTER_MODE:
|
||||
filterMode = p->value.filterMode;
|
||||
break;
|
||||
filterMode = p->value.filterMode;
|
||||
break;
|
||||
case CL_SAMPLER_MIP_FILTER_MODE:
|
||||
mipFilterMode = p->value.filterMode;
|
||||
break;
|
||||
mipFilterMode = p->value.filterMode;
|
||||
break;
|
||||
case CL_SAMPLER_LOD_MIN:
|
||||
minLod = p->value.lod;
|
||||
break;
|
||||
minLod = p->value.lod;
|
||||
break;
|
||||
case CL_SAMPLER_LOD_MAX:
|
||||
maxLod = p->value.lod;
|
||||
break;
|
||||
maxLod = p->value.lod;
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid property name");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
++p;
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid property name");
|
||||
return (cl_sampler)0;
|
||||
}
|
||||
++p;
|
||||
}
|
||||
|
||||
// Check sampler validity
|
||||
// Check addressing mode
|
||||
switch (addressingMode) {
|
||||
case CL_ADDRESS_NONE:
|
||||
case CL_ADDRESS_CLAMP_TO_EDGE:
|
||||
case CL_ADDRESS_CLAMP:
|
||||
break;
|
||||
case CL_ADDRESS_REPEAT:
|
||||
if (!normalizedCoords) {
|
||||
// repeat mode cannot be used with unnormalized coordinates
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid combination for sampler");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
break;
|
||||
case CL_ADDRESS_MIRRORED_REPEAT:
|
||||
if (!normalizedCoords) {
|
||||
// repeat mode cannot be used with unnormalized coordinates
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid combination for sampler");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid addressing mode");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
// Check filter mode
|
||||
switch (filterMode) {
|
||||
case CL_FILTER_NEAREST:
|
||||
case CL_FILTER_LINEAR:
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid filter mode");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
switch (mipFilterMode) {
|
||||
case CL_FILTER_NONE:
|
||||
case CL_FILTER_NEAREST:
|
||||
case CL_FILTER_LINEAR:
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid filter mode");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
// Create instance of Sampler
|
||||
amd::Sampler* sampler = new amd::Sampler(
|
||||
*as_amd(context),
|
||||
normalizedCoords == CL_TRUE, // To get rid of VS warning C4800
|
||||
addressingMode,
|
||||
filterMode,
|
||||
mipFilterMode,
|
||||
minLod,
|
||||
maxLod);
|
||||
if (!sampler) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
LogWarning("not enough host memory");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
// Check sampler validity
|
||||
// Check addressing mode
|
||||
switch (addressingMode) {
|
||||
case CL_ADDRESS_NONE:
|
||||
case CL_ADDRESS_CLAMP_TO_EDGE:
|
||||
case CL_ADDRESS_CLAMP:
|
||||
break;
|
||||
case CL_ADDRESS_REPEAT:
|
||||
if (!normalizedCoords) {
|
||||
// repeat mode cannot be used with unnormalized coordinates
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid combination for sampler");
|
||||
return (cl_sampler)0;
|
||||
}
|
||||
break;
|
||||
case CL_ADDRESS_MIRRORED_REPEAT:
|
||||
if (!normalizedCoords) {
|
||||
// repeat mode cannot be used with unnormalized coordinates
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid combination for sampler");
|
||||
return (cl_sampler)0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid addressing mode");
|
||||
return (cl_sampler)0;
|
||||
}
|
||||
// Check filter mode
|
||||
switch (filterMode) {
|
||||
case CL_FILTER_NEAREST:
|
||||
case CL_FILTER_LINEAR:
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid filter mode");
|
||||
return (cl_sampler)0;
|
||||
}
|
||||
switch (mipFilterMode) {
|
||||
case CL_FILTER_NONE:
|
||||
case CL_FILTER_NEAREST:
|
||||
case CL_FILTER_LINEAR:
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid filter mode");
|
||||
return (cl_sampler)0;
|
||||
}
|
||||
// Create instance of Sampler
|
||||
amd::Sampler* sampler =
|
||||
new amd::Sampler(*as_amd(context),
|
||||
normalizedCoords == CL_TRUE, // To get rid of VS warning C4800
|
||||
addressingMode, filterMode, mipFilterMode, minLod, maxLod);
|
||||
if (!sampler) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
LogWarning("not enough host memory");
|
||||
return (cl_sampler)0;
|
||||
}
|
||||
|
||||
if (!sampler->create()) {
|
||||
delete sampler;
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
LogWarning("Runtime failed sampler creation!");
|
||||
return as_cl<amd::Sampler>(0);
|
||||
}
|
||||
if (!sampler->create()) {
|
||||
delete sampler;
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
LogWarning("Runtime failed sampler creation!");
|
||||
return as_cl<amd::Sampler>(0);
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl<amd::Sampler>(sampler);
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl<amd::Sampler>(sampler);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -219,22 +214,17 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_sampler, clCreateSampler, (
|
||||
cl_context context,
|
||||
cl_bool normalized_coords,
|
||||
cl_addressing_mode addressing_mode,
|
||||
cl_filter_mode filter_mode,
|
||||
cl_int *errcode_ret))
|
||||
{
|
||||
const cl_sampler_properties sprops[] = {
|
||||
CL_SAMPLER_NORMALIZED_COORDS,
|
||||
static_cast<cl_sampler_properties>(normalized_coords),
|
||||
CL_SAMPLER_ADDRESSING_MODE,
|
||||
static_cast<cl_sampler_properties>(addressing_mode),
|
||||
CL_SAMPLER_FILTER_MODE,
|
||||
static_cast<cl_sampler_properties>(filter_mode),
|
||||
0 };
|
||||
return clCreateSamplerWithProperties(context, sprops, errcode_ret);
|
||||
RUNTIME_ENTRY_RET(cl_sampler, clCreateSampler, (cl_context context, cl_bool normalized_coords,
|
||||
cl_addressing_mode addressing_mode,
|
||||
cl_filter_mode filter_mode, cl_int* errcode_ret)) {
|
||||
const cl_sampler_properties sprops[] = {CL_SAMPLER_NORMALIZED_COORDS,
|
||||
static_cast<cl_sampler_properties>(normalized_coords),
|
||||
CL_SAMPLER_ADDRESSING_MODE,
|
||||
static_cast<cl_sampler_properties>(addressing_mode),
|
||||
CL_SAMPLER_FILTER_MODE,
|
||||
static_cast<cl_sampler_properties>(filter_mode),
|
||||
0};
|
||||
return clCreateSamplerWithProperties(context, sprops, errcode_ret);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -247,13 +237,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clRetainSampler, (cl_sampler sampler))
|
||||
{
|
||||
if (!is_valid(sampler)) {
|
||||
return CL_INVALID_SAMPLER;
|
||||
}
|
||||
as_amd(sampler)->retain();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clRetainSampler, (cl_sampler sampler)) {
|
||||
if (!is_valid(sampler)) {
|
||||
return CL_INVALID_SAMPLER;
|
||||
}
|
||||
as_amd(sampler)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -268,13 +257,12 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clReleaseSampler, (cl_sampler sampler))
|
||||
{
|
||||
if (!is_valid(sampler)) {
|
||||
return CL_INVALID_SAMPLER;
|
||||
}
|
||||
as_amd(sampler)->release();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clReleaseSampler, (cl_sampler sampler)) {
|
||||
if (!is_valid(sampler)) {
|
||||
return CL_INVALID_SAMPLER;
|
||||
}
|
||||
as_amd(sampler)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -302,64 +290,51 @@ RUNTIME_EXIT
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetSamplerInfo, (
|
||||
cl_sampler sampler,
|
||||
cl_sampler_info param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(sampler)) {
|
||||
return CL_INVALID_SAMPLER;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clGetSamplerInfo,
|
||||
(cl_sampler sampler, cl_sampler_info param_name, size_t param_value_size,
|
||||
void* param_value, size_t* param_value_size_ret)) {
|
||||
if (!is_valid(sampler)) {
|
||||
return CL_INVALID_SAMPLER;
|
||||
}
|
||||
|
||||
switch (param_name)
|
||||
{
|
||||
switch (param_name) {
|
||||
case CL_SAMPLER_REFERENCE_COUNT: {
|
||||
cl_uint count = as_amd(sampler)->referenceCount();
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
cl_uint count = as_amd(sampler)->referenceCount();
|
||||
return amd::clGetInfo(count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_SAMPLER_CONTEXT: {
|
||||
cl_context context = as_cl(&as_amd(sampler)->context());
|
||||
return amd::clGetInfo(
|
||||
context, param_value_size, param_value, param_value_size_ret);
|
||||
cl_context context = as_cl(&as_amd(sampler)->context());
|
||||
return amd::clGetInfo(context, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_SAMPLER_ADDRESSING_MODE: {
|
||||
cl_addressing_mode addressing = as_amd(sampler)->addressingMode();
|
||||
return amd::clGetInfo(
|
||||
addressing, param_value_size, param_value, param_value_size_ret);
|
||||
cl_addressing_mode addressing = as_amd(sampler)->addressingMode();
|
||||
return amd::clGetInfo(addressing, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_SAMPLER_FILTER_MODE: {
|
||||
cl_filter_mode filter = as_amd(sampler)->filterMode();
|
||||
return amd::clGetInfo(
|
||||
filter, param_value_size, param_value, param_value_size_ret);
|
||||
cl_filter_mode filter = as_amd(sampler)->filterMode();
|
||||
return amd::clGetInfo(filter, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_SAMPLER_NORMALIZED_COORDS: {
|
||||
cl_bool normalized = as_amd(sampler)->normalizedCoords();
|
||||
return amd::clGetInfo(
|
||||
normalized, param_value_size, param_value, param_value_size_ret);
|
||||
cl_bool normalized = as_amd(sampler)->normalizedCoords();
|
||||
return amd::clGetInfo(normalized, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_SAMPLER_MIP_FILTER_MODE: {
|
||||
cl_filter_mode mipFilter = as_amd(sampler)->mipFilter();
|
||||
return amd::clGetInfo(
|
||||
mipFilter, param_value_size, param_value, param_value_size_ret);
|
||||
cl_filter_mode mipFilter = as_amd(sampler)->mipFilter();
|
||||
return amd::clGetInfo(mipFilter, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_SAMPLER_LOD_MIN: {
|
||||
cl_float minLod = as_amd(sampler)->minLod();
|
||||
return amd::clGetInfo(
|
||||
minLod, param_value_size, param_value, param_value_size_ret);
|
||||
cl_float minLod = as_amd(sampler)->minLod();
|
||||
return amd::clGetInfo(minLod, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_SAMPLER_LOD_MAX: {
|
||||
cl_float maxLod = as_amd(sampler)->maxLod();
|
||||
return amd::clGetInfo(
|
||||
maxLod, param_value_size, param_value, param_value_size_ret);
|
||||
cl_float maxLod = as_amd(sampler)->maxLod();
|
||||
return amd::clGetInfo(maxLod, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
@@ -6,254 +6,216 @@
|
||||
#include <cstring>
|
||||
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWaitSignalAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_mem mem_object,
|
||||
cl_uint value,
|
||||
cl_uint num_events,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) )
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWaitSignalAMD,
|
||||
(cl_command_queue command_queue, cl_mem mem_object, cl_uint value, cl_uint num_events,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if (!is_valid(mem_object)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::Buffer* buffer = as_amd(mem_object)->asBuffer();
|
||||
if (buffer == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (!(buffer->getMemFlags() & CL_MEM_BUS_ADDRESSABLE_AMD)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
if (hostQueue.context() != buffer->getContext()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err =
|
||||
amd::clSetEventWaitList(eventWaitList, hostQueue.context(), num_events, event_wait_list);
|
||||
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::SignalCommand* command =
|
||||
new amd::SignalCommand(hostQueue, CL_COMMAND_WAIT_SIGNAL_AMD, eventWaitList, *buffer, value);
|
||||
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWriteSignalAMD,
|
||||
(cl_command_queue command_queue, cl_mem mem_object, cl_uint value, cl_ulong offset,
|
||||
cl_uint num_events, const cl_event* event_wait_list, cl_event* event))
|
||||
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if (!is_valid(mem_object)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::Buffer* buffer = as_amd(mem_object)->asBuffer();
|
||||
if (buffer == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (!(buffer->getMemFlags() & CL_MEM_EXTERNAL_PHYSICAL_AMD)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if ((offset + sizeof(value)) > (buffer->getSize() + amd::Os::pageSize())) {
|
||||
return CL_INVALID_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
if (hostQueue.context() != buffer->getContext()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err =
|
||||
amd::clSetEventWaitList(eventWaitList, hostQueue.context(), num_events, event_wait_list);
|
||||
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::SignalCommand* command = new amd::SignalCommand(hostQueue, CL_COMMAND_WRITE_SIGNAL_AMD,
|
||||
eventWaitList, *buffer, value, offset);
|
||||
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueMakeBuffersResidentAMD,
|
||||
(cl_command_queue command_queue, cl_uint num_mem_objs, cl_mem* mem_objects,
|
||||
cl_bool blocking_make_resident, cl_bus_address_amd* bus_addresses,
|
||||
cl_uint num_events, const cl_event* event_wait_list, cl_event* event)) {
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if (mem_objects == 0) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (bus_addresses == 0 || num_mem_objs == 0) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
memset(bus_addresses, 0, sizeof(cl_bus_address_amd) * num_mem_objs);
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
std::vector<amd::Memory*> memObjects;
|
||||
for (unsigned int i = 0; i < num_mem_objs; ++i) {
|
||||
if (!is_valid(mem_objects[i])) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (!is_valid(mem_object)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::Buffer* buffer = as_amd(mem_object)->asBuffer();
|
||||
amd::Buffer* buffer = as_amd(mem_objects[i])->asBuffer();
|
||||
if (buffer == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (!(buffer->getMemFlags() & CL_MEM_BUS_ADDRESSABLE_AMD)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
if (hostQueue.context() != buffer->getContext()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList( eventWaitList,
|
||||
hostQueue.context(),
|
||||
num_events,
|
||||
event_wait_list);
|
||||
memObjects.push_back(buffer);
|
||||
}
|
||||
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err =
|
||||
amd::clSetEventWaitList(eventWaitList, hostQueue.context(), num_events, event_wait_list);
|
||||
|
||||
amd::SignalCommand * command = new amd::SignalCommand (
|
||||
hostQueue,
|
||||
CL_COMMAND_WAIT_SIGNAL_AMD,
|
||||
eventWaitList,
|
||||
*buffer,
|
||||
value);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
amd::MakeBuffersResidentCommand* command = new amd::MakeBuffersResidentCommand(
|
||||
hostQueue, CL_COMMAND_MAKE_BUFFERS_RESIDENT_AMD, eventWaitList, memObjects, bus_addresses);
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
command->enqueue();
|
||||
|
||||
return CL_SUCCESS;
|
||||
if (blocking_make_resident) {
|
||||
command->awaitCompletion();
|
||||
}
|
||||
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueWriteSignalAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_mem mem_object,
|
||||
cl_uint value,
|
||||
cl_ulong offset,
|
||||
cl_uint num_events,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event))
|
||||
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if (!is_valid(mem_object)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::Buffer* buffer = as_amd(mem_object)->asBuffer();
|
||||
if (buffer == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (!(buffer->getMemFlags() & CL_MEM_EXTERNAL_PHYSICAL_AMD)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if ((offset + sizeof(value)) > (buffer->getSize()+ amd::Os::pageSize())) {
|
||||
return CL_INVALID_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
if (hostQueue.context() != buffer->getContext()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList( eventWaitList,
|
||||
hostQueue.context(),
|
||||
num_events,
|
||||
event_wait_list);
|
||||
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::SignalCommand * command = new amd::SignalCommand (
|
||||
hostQueue,
|
||||
CL_COMMAND_WRITE_SIGNAL_AMD,
|
||||
eventWaitList,
|
||||
*buffer,
|
||||
value,
|
||||
offset);
|
||||
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueMakeBuffersResidentAMD, (
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_mem_objs,
|
||||
cl_mem * mem_objects,
|
||||
cl_bool blocking_make_resident,
|
||||
cl_bus_address_amd * bus_addresses,
|
||||
cl_uint num_events,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event))
|
||||
{
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
if (mem_objects == 0) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (bus_addresses == 0 || num_mem_objs == 0) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
memset(bus_addresses,0, sizeof(cl_bus_address_amd)*num_mem_objs);
|
||||
|
||||
amd::HostQueue* queue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == queue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue& hostQueue = *queue;
|
||||
|
||||
std::vector<amd::Memory*> memObjects;
|
||||
for (unsigned int i = 0; i < num_mem_objs; ++i) {
|
||||
|
||||
if (!is_valid(mem_objects[i])) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::Buffer* buffer = as_amd(mem_objects[i])->asBuffer();
|
||||
if (buffer == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (!(buffer->getMemFlags() & CL_MEM_BUS_ADDRESSABLE_AMD)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
if (hostQueue.context() != buffer->getContext()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
|
||||
memObjects.push_back(buffer);
|
||||
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList( eventWaitList,
|
||||
hostQueue.context(),
|
||||
num_events,
|
||||
event_wait_list);
|
||||
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amd::MakeBuffersResidentCommand * command =
|
||||
new amd::MakeBuffersResidentCommand ( hostQueue,
|
||||
CL_COMMAND_MAKE_BUFFERS_RESIDENT_AMD,
|
||||
eventWaitList,
|
||||
memObjects,
|
||||
bus_addresses);
|
||||
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
command->enqueue();
|
||||
|
||||
if (blocking_make_resident) {
|
||||
command->awaitCompletion();
|
||||
}
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
@@ -8,37 +8,20 @@ extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueWaitSignalAMD(
|
||||
cl_command_queue command_queue,
|
||||
cl_mem mem_object,
|
||||
cl_uint value,
|
||||
cl_uint num_events,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueWaitSignalAMD(
|
||||
cl_command_queue command_queue, cl_mem mem_object, cl_uint value, cl_uint num_events,
|
||||
const cl_event* event_wait_list, cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueWriteSignalAMD(
|
||||
cl_command_queue command_queue,
|
||||
cl_mem mem_object,
|
||||
cl_uint value,
|
||||
cl_ulong offset,
|
||||
cl_uint num_events,
|
||||
const cl_event * event_list,
|
||||
cl_event * event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueWriteSignalAMD(
|
||||
cl_command_queue command_queue, cl_mem mem_object, cl_uint value, cl_ulong offset,
|
||||
cl_uint num_events, const cl_event* event_list, cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueMakeBuffersResidentAMD(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_mem_objs,
|
||||
cl_mem * mem_objects,
|
||||
cl_bool blocking_make_resident,
|
||||
cl_bus_address_amd * bus_addresses,
|
||||
cl_uint num_events,
|
||||
const cl_event * event_list,
|
||||
cl_event * event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueMakeBuffersResidentAMD(
|
||||
cl_command_queue command_queue, cl_uint num_mem_objs, cl_mem* mem_objects,
|
||||
cl_bool blocking_make_resident, cl_bus_address_amd* bus_addresses, cl_uint num_events,
|
||||
const cl_event* event_list, cl_event* event) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -102,12 +102,12 @@ jurisdiction and venue of these courts.
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* cl_device_info */
|
||||
#define CL_DEVICE_MAX_SEMAPHORES_AMD 0xF050
|
||||
#define CL_DEVICE_MAX_SEMAPHORE_SIZE_AMD 0xF051
|
||||
/* cl_device_info */
|
||||
#define CL_DEVICE_MAX_SEMAPHORES_AMD 0xF050
|
||||
#define CL_DEVICE_MAX_SEMAPHORE_SIZE_AMD 0xF051
|
||||
|
||||
/* cl_kernel_work_group_info */
|
||||
#define CL_KERNEL_MAX_SEMAPHORE_SIZE_AMD 0xF052
|
||||
/* cl_kernel_work_group_info */
|
||||
#define CL_KERNEL_MAX_SEMAPHORE_SIZE_AMD 0xF052
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Plik diff jest za duży
Load Diff
@@ -31,27 +31,24 @@
|
||||
*
|
||||
* \return Created cl_threadtrace_amd object
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_threadtrace_amd, clCreateThreadTraceAMD, (
|
||||
cl_device_id device,
|
||||
cl_int* errcode_ret))
|
||||
{
|
||||
// Make sure we have a valid device object
|
||||
if (!is_valid(device)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
return NULL;
|
||||
}
|
||||
RUNTIME_ENTRY_RET(cl_threadtrace_amd, clCreateThreadTraceAMD,
|
||||
(cl_device_id device, cl_int* errcode_ret)) {
|
||||
// Make sure we have a valid device object
|
||||
if (!is_valid(device)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Create the device thread trace object
|
||||
amd::ThreadTrace* threadTrace =
|
||||
new amd::ThreadTrace(*as_amd(device));
|
||||
// Create the device thread trace object
|
||||
amd::ThreadTrace* threadTrace = new amd::ThreadTrace(*as_amd(device));
|
||||
|
||||
if (threadTrace == NULL) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
return NULL;
|
||||
}
|
||||
if (threadTrace == NULL) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(threadTrace);
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(threadTrace);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -63,14 +60,12 @@ RUNTIME_EXIT
|
||||
// * - CL_SUCCESS if the function is executed successfully.
|
||||
// * - CL_INVALID_OPERATION if we failed to release the object
|
||||
// */
|
||||
RUNTIME_ENTRY(cl_int, clReleaseThreadTraceAMD, (
|
||||
cl_threadtrace_amd threadTrace))
|
||||
{
|
||||
if (!is_valid(threadTrace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
as_amd(threadTrace)->release();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clReleaseThreadTraceAMD, (cl_threadtrace_amd threadTrace)) {
|
||||
if (!is_valid(threadTrace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
as_amd(threadTrace)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
//
|
||||
@@ -82,14 +77,12 @@ RUNTIME_EXIT
|
||||
// * - CL_SUCCESS if the function is executed successfully.
|
||||
// * - CL_INVALID_OPERATION if we failed to release the object
|
||||
// */
|
||||
RUNTIME_ENTRY(cl_int, clRetainThreadTraceAMD, (
|
||||
cl_threadtrace_amd threadTrace))
|
||||
{
|
||||
if (!is_valid(threadTrace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
as_amd(threadTrace)->retain();
|
||||
return CL_SUCCESS;
|
||||
RUNTIME_ENTRY(cl_int, clRetainThreadTraceAMD, (cl_threadtrace_amd threadTrace)) {
|
||||
if (!is_valid(threadTrace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
as_amd(threadTrace)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -105,70 +98,71 @@ RUNTIME_EXIT
|
||||
// * \return A non zero value if OpenCL failed to set threadTrace buffer parameter
|
||||
// * - CL_INVALID_VALUE if the thread_trace is invalid thread trace object.
|
||||
// * - CL_INVALID_VALUE if the invalid config_param or param_value enum values , are used.
|
||||
// * - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or event_wait_list is not NULL and num_events_in_wait_list is 0,
|
||||
// * - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or
|
||||
// event_wait_list is not NULL and num_events_in_wait_list is 0,
|
||||
// * - or if event objects in event_wait_list are not valid events.
|
||||
// * - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL implementation on the device.
|
||||
// * - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL
|
||||
// implementation on the device.
|
||||
// * - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the
|
||||
// OpenCL implementation on the host.
|
||||
// */
|
||||
RUNTIME_ENTRY(cl_int, clSetThreadTraceParamAMD,(cl_threadtrace_amd thread_trace ,
|
||||
cl_thread_trace_param config_param ,
|
||||
cl_uint param_value ))
|
||||
{
|
||||
if (!is_valid(thread_trace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
switch (config_param) {
|
||||
RUNTIME_ENTRY(cl_int, clSetThreadTraceParamAMD,
|
||||
(cl_threadtrace_amd thread_trace, cl_thread_trace_param config_param,
|
||||
cl_uint param_value)) {
|
||||
if (!is_valid(thread_trace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
switch (config_param) {
|
||||
case CL_THREAD_TRACE_PARAM_TOKEN_MASK:
|
||||
if (param_value > CL_THREAD_TRACE_TOKEN_MASK_ALL_SI) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setTokenMask(param_value);
|
||||
break;
|
||||
if (param_value > CL_THREAD_TRACE_TOKEN_MASK_ALL_SI) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setTokenMask(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_REG_MASK:
|
||||
if (param_value > CL_THREAD_TRACE_REG_MASK_ALL_SI) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setRegMask(param_value);
|
||||
break;
|
||||
if (param_value > CL_THREAD_TRACE_REG_MASK_ALL_SI) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setRegMask(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_VM_ID_MASK:
|
||||
if (param_value > CL_THREAD_TRACE_VM_ID_MASK_SINGLE_DETAIL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setVmIdMask(param_value);
|
||||
break;
|
||||
if (param_value > CL_THREAD_TRACE_VM_ID_MASK_SINGLE_DETAIL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setVmIdMask(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_INSTRUCTION_MASK:
|
||||
if (param_value > CL_THREAD_TRACE_INST_MASK_IMMEDIATE_CI) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setInstMask(param_value);
|
||||
break;
|
||||
if (param_value > CL_THREAD_TRACE_INST_MASK_IMMEDIATE_CI) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setInstMask(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_COMPUTE_UNIT_TARGET:
|
||||
as_amd(thread_trace)->setCU(param_value);
|
||||
break;
|
||||
as_amd(thread_trace)->setCU(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_SHADER_ARRAY_TARGET:
|
||||
as_amd(thread_trace)->setSH(param_value);
|
||||
break;
|
||||
as_amd(thread_trace)->setSH(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_SIMD_MASK:
|
||||
as_amd(thread_trace)->setSIMD(param_value);
|
||||
break;
|
||||
as_amd(thread_trace)->setSIMD(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_USER_DATA:
|
||||
as_amd(thread_trace)->setUserData(param_value);
|
||||
break;
|
||||
as_amd(thread_trace)->setUserData(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_CAPTURE_MODE:
|
||||
if (param_value > CL_THREAD_TRACE_CAPTURE_SELECT_DETAIL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setCaptureMode(param_value);
|
||||
break;
|
||||
if (param_value > CL_THREAD_TRACE_CAPTURE_SELECT_DETAIL) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
as_amd(thread_trace)->setCaptureMode(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_IS_WRAPPED:
|
||||
as_amd(thread_trace)->setIsWrapped(true);
|
||||
break;
|
||||
as_amd(thread_trace)->setIsWrapped(true);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_RANDOM_SEED:
|
||||
as_amd(thread_trace)->setRandomSeed(param_value);
|
||||
break;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
as_amd(thread_trace)->setRandomSeed(param_value);
|
||||
break;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -195,66 +189,59 @@ RUNTIME_EXIT
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
*
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetThreadTraceInfoAMD, (
|
||||
cl_threadtrace_amd thread_trace /* threadTrace */,
|
||||
cl_threadtrace_info thread_trace_info_param,
|
||||
size_t param_value_size,
|
||||
void* param_value,
|
||||
size_t* param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(thread_trace)) {
|
||||
RUNTIME_ENTRY(cl_int, clGetThreadTraceInfoAMD,
|
||||
(cl_threadtrace_amd thread_trace /* threadTrace */,
|
||||
cl_threadtrace_info thread_trace_info_param, size_t param_value_size,
|
||||
void* param_value, size_t* param_value_size_ret)) {
|
||||
if (!is_valid(thread_trace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// Find the thread trace object, associated with the specified device
|
||||
const device::ThreadTrace* devThreadTrace = as_amd(thread_trace)->getDeviceThreadTrace();
|
||||
|
||||
const size_t seNum = as_amd(thread_trace)->deviceSeNumThreadTrace();
|
||||
switch (thread_trace_info_param) {
|
||||
case CL_THREAD_TRACE_SE: {
|
||||
return amd::clGetInfo(seNum, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_THREAD_TRACE_BUFFERS_SIZE: {
|
||||
// Make sure we found a valid thread trace object
|
||||
if (devThreadTrace == NULL) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
}
|
||||
|
||||
// Find the thread trace object, associated with the specified device
|
||||
const device::ThreadTrace* devThreadTrace =
|
||||
as_amd(thread_trace)->getDeviceThreadTrace();
|
||||
std::unique_ptr<uint> bufSize2Se(new uint[seNum]);
|
||||
|
||||
const size_t seNum = as_amd(thread_trace)->deviceSeNumThreadTrace();
|
||||
switch (thread_trace_info_param) {
|
||||
case CL_THREAD_TRACE_SE:
|
||||
{
|
||||
return amd::clGetInfo(seNum,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
if (bufSize2Se.get() == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
if (!devThreadTrace->info(thread_trace_info_param, bufSize2Se.get(), seNum)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
const size_t valueSize = seNum * sizeof(unsigned int);
|
||||
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
|
||||
if (param_value != NULL) {
|
||||
::memcpy(param_value, bufSize2Se.get(), valueSize);
|
||||
if (param_value_size > valueSize) {
|
||||
::memset(static_cast<address>(param_value) + valueSize, '\0',
|
||||
param_value_size - valueSize);
|
||||
}
|
||||
case CL_THREAD_TRACE_BUFFERS_SIZE:
|
||||
{
|
||||
// Make sure we found a valid thread trace object
|
||||
if (devThreadTrace == NULL) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<uint> bufSize2Se(new uint[seNum]);
|
||||
|
||||
if (bufSize2Se.get() == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
if (!devThreadTrace->info(thread_trace_info_param, bufSize2Se.get(), seNum)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
const size_t valueSize = seNum * sizeof(unsigned int);
|
||||
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
|
||||
if (param_value != NULL) {
|
||||
::memcpy(param_value, bufSize2Se.get(), valueSize);
|
||||
if (param_value_size > valueSize) {
|
||||
::memset(static_cast<address>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
@@ -284,112 +271,122 @@ RUNTIME_EXIT
|
||||
* wait for this command to complete.
|
||||
* \return A non zero value if OpenCL failed to release threadTrace
|
||||
* - CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue.
|
||||
* - CL_INVALID_CONTEXT if the context associated with command_queue and events in event_wait_list are not the same.
|
||||
* - CL_INVALID_CONTEXT if the context associated with command_queue and events in event_wait_list
|
||||
* are not the same.
|
||||
* - CL_INVALID_VALUE if the thread_trace is invalid thread trace object .
|
||||
* - CL_INVALID_VALUE if the invalid command name enum value , not described in the cl_threadtrace_command_name_amd, is used.
|
||||
* - CL_INVALID_VALUE if the invalid command name enum value , not described in the
|
||||
* cl_threadtrace_command_name_amd, is used.
|
||||
* - CL_INVALID_OPERATION if the command enqueue failed. It can happen in the following cases:
|
||||
* o BEGIN_COMMAND is queued for thread trace object for which memory object/s was/were not bound..
|
||||
* o BEGIN_COMMAND is queued for thread trace object for which memory object/s was/were not
|
||||
* bound..
|
||||
* o END_COMMAND is queued for thread trace object, for which BEGIN_COMMAND was not queued.
|
||||
* o PAUSE_COMMAND is queued for thread trace object, for which BEGIN_COMMAND was not queued.
|
||||
* o RESUME_COMMAND is queued for thread trace object, for which PAUSE_COMMAND was not queued.
|
||||
* - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or event_wait_list is not NULL and num_events_in_wait_list is 0, or if event objects in event_wait_list are not valid events.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL implementation on the device.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host.
|
||||
* o PAUSE_COMMAND is queued for thread trace object, for which BEGIN_COMMAND was not
|
||||
* queued.
|
||||
* o RESUME_COMMAND is queued for thread trace object, for which PAUSE_COMMAND was not
|
||||
* queued.
|
||||
* - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or
|
||||
* event_wait_list is not NULL and num_events_in_wait_list is 0, or if event objects in
|
||||
* event_wait_list are not valid events.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL
|
||||
* implementation on the device.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL
|
||||
* implementation on the host.
|
||||
*/
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueThreadTraceCommandAMD ,(
|
||||
cl_command_queue command_queue ,
|
||||
cl_threadtrace_amd thread_trace ,
|
||||
cl_threadtrace_command_name_amd command_name ,
|
||||
cl_uint num_events_in_wait_list ,
|
||||
const cl_event* event_wait_list ,
|
||||
cl_event* event ))
|
||||
{
|
||||
// Check if command queue is valid
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueThreadTraceCommandAMD,
|
||||
(cl_command_queue command_queue, cl_threadtrace_amd thread_trace,
|
||||
cl_threadtrace_command_name_amd command_name, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
// Check if command queue is valid
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
// Check if thread trace is valid
|
||||
if (!is_valid(thread_trace)) {
|
||||
// Check if thread trace is valid
|
||||
if (!is_valid(thread_trace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
amd::ThreadTrace* amdThreadTrace = as_amd(thread_trace);
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
// Check that device associated with the command queue is the same as with thread trace
|
||||
if (&hostQueue->device() != &amdThreadTrace->device()) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue->context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
// Create a new command for the threadTraces
|
||||
amd::ThreadTraceCommand* command = NULL;
|
||||
switch (command_name) {
|
||||
case CL_THREAD_TRACE_BEGIN_COMMAND:
|
||||
if ((amdThreadTrace->getState() != amd::ThreadTrace::MemoryBound) &&
|
||||
(amdThreadTrace->getState() != amd::ThreadTrace::End)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::Begin);
|
||||
command = new amd::ThreadTraceCommand(
|
||||
*hostQueue, eventWaitList, static_cast<const void*>(&amdThreadTrace->threadTraceConfig()),
|
||||
*amdThreadTrace, amd::ThreadTraceCommand::Begin, CL_COMMAND_THREAD_TRACE);
|
||||
break;
|
||||
case CL_THREAD_TRACE_END_COMMAND:
|
||||
if ((amdThreadTrace->getState() != amd::ThreadTrace::Begin) &&
|
||||
(amdThreadTrace->getState() != amd::ThreadTrace::Pause)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::End);
|
||||
command = new amd::ThreadTraceCommand(*hostQueue, eventWaitList,
|
||||
&amdThreadTrace->threadTraceConfig(), *amdThreadTrace,
|
||||
amd::ThreadTraceCommand::End, CL_COMMAND_THREAD_TRACE);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PAUSE_COMMAND:
|
||||
if (amdThreadTrace->getState() != amd::ThreadTrace::Begin) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::Pause);
|
||||
command = new amd::ThreadTraceCommand(
|
||||
*hostQueue, eventWaitList, &amdThreadTrace->threadTraceConfig(), *amdThreadTrace,
|
||||
amd::ThreadTraceCommand::Pause, CL_COMMAND_THREAD_TRACE);
|
||||
break;
|
||||
case CL_THREAD_TRACE_RESUME_COMMAND:
|
||||
if (amdThreadTrace->getState() != amd::ThreadTrace::Pause) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::Begin);
|
||||
command = new amd::ThreadTraceCommand(
|
||||
*hostQueue, eventWaitList, &amdThreadTrace->threadTraceConfig(), *amdThreadTrace,
|
||||
amd::ThreadTraceCommand::Resume, CL_COMMAND_THREAD_TRACE);
|
||||
break;
|
||||
}
|
||||
|
||||
amd::ThreadTrace* amdThreadTrace = as_amd(thread_trace);
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Check that device associated with the command queue is the same as with thread trace
|
||||
if (&hostQueue->device() != &amdThreadTrace->device()) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
// Submit the command to the device
|
||||
command->enqueue();
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue->context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS){
|
||||
return err;
|
||||
}
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
// Create a new command for the threadTraces
|
||||
amd::ThreadTraceCommand* command = NULL;
|
||||
switch (command_name) {
|
||||
case CL_THREAD_TRACE_BEGIN_COMMAND :
|
||||
if ((amdThreadTrace->getState() != amd::ThreadTrace::MemoryBound)
|
||||
&&(amdThreadTrace->getState() != amd::ThreadTrace::End)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::Begin);
|
||||
command = new amd::ThreadTraceCommand(*hostQueue, eventWaitList,static_cast<const void*>(&amdThreadTrace->threadTraceConfig()),
|
||||
*amdThreadTrace,amd::ThreadTraceCommand::Begin,CL_COMMAND_THREAD_TRACE);
|
||||
break;
|
||||
case CL_THREAD_TRACE_END_COMMAND :
|
||||
if ((amdThreadTrace->getState() != amd::ThreadTrace::Begin)
|
||||
&&(amdThreadTrace->getState() != amd::ThreadTrace::Pause)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::End);
|
||||
command = new amd::ThreadTraceCommand(*hostQueue, eventWaitList,&amdThreadTrace->threadTraceConfig(),
|
||||
*amdThreadTrace,amd::ThreadTraceCommand::End,CL_COMMAND_THREAD_TRACE);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PAUSE_COMMAND :
|
||||
if (amdThreadTrace->getState() != amd::ThreadTrace::Begin) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::Pause);
|
||||
command = new amd::ThreadTraceCommand(*hostQueue, eventWaitList,&amdThreadTrace->threadTraceConfig(),
|
||||
*amdThreadTrace,amd::ThreadTraceCommand::Pause,CL_COMMAND_THREAD_TRACE);
|
||||
break;
|
||||
case CL_THREAD_TRACE_RESUME_COMMAND :
|
||||
if (amdThreadTrace->getState() != amd::ThreadTrace::Pause) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::Begin);
|
||||
command = new amd::ThreadTraceCommand(*hostQueue, eventWaitList,&amdThreadTrace->threadTraceConfig(),
|
||||
*amdThreadTrace,amd::ThreadTraceCommand::Resume,CL_COMMAND_THREAD_TRACE);
|
||||
break;
|
||||
}
|
||||
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Submit the command to the device
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
//
|
||||
///*! \brief Enqueues the binding command to bind cl_threadtrace_amd to cl_mem object for trace recording..
|
||||
///*! \brief Enqueues the binding command to bind cl_threadtrace_amd to cl_mem object for trace
|
||||
///recording..
|
||||
// *
|
||||
// * \param command_queue must be a valid OpenCL command queue.
|
||||
// *
|
||||
@@ -421,95 +418,97 @@ RUNTIME_EXIT
|
||||
// * wait for this command to complete.
|
||||
// * \return A non zero value if OpenCL failed to set threadTrace buffer parameter
|
||||
// * - CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue.
|
||||
// * - CL_INVALID_CONTEXT if the context associated with command_queue and events in event_wait_list are not the same.
|
||||
// * - CL_INVALID_CONTEXT if the context associated with command_queue and events in
|
||||
// event_wait_list are not the same.
|
||||
// * - CL_INVALID_VALUE if the thread_trace is invalid thread trace object.
|
||||
// * - CL_INVALID_VALUE if the buffer_size is negative or zero.
|
||||
// * - CL_INVALID_VALUE if the sub_buffers_num I less than 1.
|
||||
// * - CL_INVALID_OPERATION if the mem_objects_num is not equal to the number of Shader Engines of the [GPU] device.
|
||||
// * - CL_INVALID_MEM_OBJECT if one on memory objects in the mem_objects array is not a valid memory object or memory_objects is NULL.
|
||||
// * - CL_MEM_OBJECT_ALLOCATION_FAILURE if there is a failure to allocate memory for the data store associated from the memory objects of the mem_objects array.
|
||||
// * - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or event_wait_list is not NULL and num_events_in_wait_list is 0, or if event objects in event_wait_list are not valid events.
|
||||
// * - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL implementation on the device.
|
||||
// * - CL_INVALID_OPERATION if the mem_objects_num is not equal to the number of Shader Engines of
|
||||
// the [GPU] device.
|
||||
// * - CL_INVALID_MEM_OBJECT if one on memory objects in the mem_objects array is not a valid
|
||||
// memory object or memory_objects is NULL.
|
||||
// * - CL_MEM_OBJECT_ALLOCATION_FAILURE if there is a failure to allocate memory for the data store
|
||||
// associated from the memory objects of the mem_objects array.
|
||||
// * - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or
|
||||
// event_wait_list is not NULL and num_events_in_wait_list is 0, or if event objects in
|
||||
// event_wait_list are not valid events.
|
||||
// * - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL
|
||||
// implementation on the device.
|
||||
// * - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the
|
||||
// * OpenCL implementation on the host.
|
||||
// */
|
||||
RUNTIME_ENTRY(cl_int,clEnqueueBindThreadTraceBufferAMD ,(cl_command_queue command_queue ,
|
||||
cl_threadtrace_amd thread_trace ,
|
||||
cl_mem* mem_objects ,
|
||||
cl_uint mem_objects_num ,
|
||||
cl_uint buffer_size ,
|
||||
cl_uint num_events_in_wait_list ,
|
||||
const cl_event* event_wait_list ,
|
||||
cl_event* event ))
|
||||
{
|
||||
// Check if command queue is valid
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueBindThreadTraceBufferAMD,
|
||||
(cl_command_queue command_queue, cl_threadtrace_amd thread_trace, cl_mem* mem_objects,
|
||||
cl_uint mem_objects_num, cl_uint buffer_size, cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list, cl_event* event)) {
|
||||
// Check if command queue is valid
|
||||
if (!is_valid(command_queue)) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
// Check if thread trace is valid
|
||||
if (!is_valid(thread_trace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
// Check if thread trace is valid
|
||||
if (!is_valid(thread_trace)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
// Check if input values are valid
|
||||
if ((mem_objects == NULL)
|
||||
|| (buffer_size <= 0)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
// Check if input values are valid
|
||||
if ((mem_objects == NULL) || (buffer_size <= 0)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
amd::ThreadTrace* amdThreadTrace = as_amd(thread_trace);
|
||||
amd::ThreadTrace* amdThreadTrace = as_amd(thread_trace);
|
||||
|
||||
// Check if the number of bound memory objects is the same as the number of SEs
|
||||
if (amdThreadTrace->deviceSeNumThreadTrace() != mem_objects_num) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
// Check if memory objects ,bound the thread trace,are valid
|
||||
for (size_t i = 0; i < mem_objects_num; ++i) {
|
||||
cl_mem obj = mem_objects[i];
|
||||
if (!is_valid(obj)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
// Check if the number of bound memory objects is the same as the number of SEs
|
||||
if (amdThreadTrace->deviceSeNumThreadTrace() != mem_objects_num) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
// Check if memory objects ,bound the thread trace,are valid
|
||||
for (size_t i = 0; i < mem_objects_num; ++i) {
|
||||
cl_mem obj = mem_objects[i];
|
||||
if (!is_valid(obj)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
}
|
||||
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
amd::HostQueue* hostQueue = as_amd(command_queue)->asHostQueue();
|
||||
if (NULL == hostQueue) {
|
||||
return CL_INVALID_COMMAND_QUEUE;
|
||||
}
|
||||
|
||||
// Check that device associated with the command queue is the same as with thread trace
|
||||
if (&hostQueue->device() != &amdThreadTrace->device()) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
// Check that device associated with the command queue is the same as with thread trace
|
||||
if (&hostQueue->device() != &amdThreadTrace->device()) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
hostQueue->context(), num_events_in_wait_list, event_wait_list);
|
||||
if (err != CL_SUCCESS){
|
||||
return err;
|
||||
}
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, hostQueue->context(), num_events_in_wait_list,
|
||||
event_wait_list);
|
||||
if (err != CL_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
|
||||
amdThreadTrace->setState(amd::ThreadTrace::MemoryBound);
|
||||
// Create a new ThreadTraceMemObjectsCommand command
|
||||
amd::ThreadTraceMemObjectsCommand* command =
|
||||
new amd::ThreadTraceMemObjectsCommand(*hostQueue, eventWaitList, mem_objects_num,mem_objects,buffer_size,*amdThreadTrace,CL_COMMAND_THREAD_TRACE_MEM);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
amdThreadTrace->setState(amd::ThreadTrace::MemoryBound);
|
||||
// Create a new ThreadTraceMemObjectsCommand command
|
||||
amd::ThreadTraceMemObjectsCommand* command = new amd::ThreadTraceMemObjectsCommand(
|
||||
*hostQueue, eventWaitList, mem_objects_num, mem_objects, buffer_size, *amdThreadTrace,
|
||||
CL_COMMAND_THREAD_TRACE_MEM);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
// Submit the command to the device
|
||||
command->enqueue();
|
||||
// Make sure we have memory for the command execution
|
||||
if (!command->validateMemory()) {
|
||||
delete command;
|
||||
return CL_OUT_OF_RESOURCES;
|
||||
}
|
||||
// Submit the command to the device
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
@@ -99,140 +99,136 @@ jurisdiction and venue of these courts.
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
typedef struct _cl_threadtrace_amd * cl_threadtrace_amd;
|
||||
typedef struct _cl_threadtrace_amd* cl_threadtrace_amd;
|
||||
typedef cl_uint cl_thread_trace_param;
|
||||
typedef cl_uint cl_threadtrace_info;
|
||||
|
||||
/* cl_command_type */
|
||||
#define CL_COMMAND_THREAD_TRACE_MEM 0x4500
|
||||
#define CL_COMMAND_THREAD_TRACE 0x4501
|
||||
#define CL_COMMAND_THREAD_TRACE 0x4501
|
||||
|
||||
/* cl_threadtrace_command_name_amd enumeration */
|
||||
typedef enum _cl_threadtrace_command_name_amd {
|
||||
CL_THREAD_TRACE_BEGIN_COMMAND,
|
||||
CL_THREAD_TRACE_END_COMMAND,
|
||||
CL_THREAD_TRACE_PAUSE_COMMAND,
|
||||
CL_THREAD_TRACE_RESUME_COMMAND
|
||||
typedef enum _cl_threadtrace_command_name_amd {
|
||||
CL_THREAD_TRACE_BEGIN_COMMAND,
|
||||
CL_THREAD_TRACE_END_COMMAND,
|
||||
CL_THREAD_TRACE_PAUSE_COMMAND,
|
||||
CL_THREAD_TRACE_RESUME_COMMAND
|
||||
} cl_threadtrace_command_name_amd;
|
||||
|
||||
// Thread trace parameters
|
||||
enum ThreadTraceParameter
|
||||
{
|
||||
CL_THREAD_TRACE_PARAM_TOKEN_MASK,
|
||||
CL_THREAD_TRACE_PARAM_REG_MASK,
|
||||
CL_THREAD_TRACE_PARAM_COMPUTE_UNIT_TARGET,
|
||||
CL_THREAD_TRACE_PARAM_SHADER_ARRAY_TARGET,
|
||||
CL_THREAD_TRACE_PARAM_SIMD_MASK,
|
||||
CL_THREAD_TRACE_PARAM_VM_ID_MASK,
|
||||
CL_THREAD_TRACE_PARAM_RANDOM_SEED,
|
||||
CL_THREAD_TRACE_PARAM_CAPTURE_MODE,
|
||||
CL_THREAD_TRACE_PARAM_INSTRUCTION_MASK,
|
||||
CL_THREAD_TRACE_PARAM_USER_DATA,
|
||||
CL_THREAD_TRACE_PARAM_IS_WRAPPED
|
||||
enum ThreadTraceParameter {
|
||||
CL_THREAD_TRACE_PARAM_TOKEN_MASK,
|
||||
CL_THREAD_TRACE_PARAM_REG_MASK,
|
||||
CL_THREAD_TRACE_PARAM_COMPUTE_UNIT_TARGET,
|
||||
CL_THREAD_TRACE_PARAM_SHADER_ARRAY_TARGET,
|
||||
CL_THREAD_TRACE_PARAM_SIMD_MASK,
|
||||
CL_THREAD_TRACE_PARAM_VM_ID_MASK,
|
||||
CL_THREAD_TRACE_PARAM_RANDOM_SEED,
|
||||
CL_THREAD_TRACE_PARAM_CAPTURE_MODE,
|
||||
CL_THREAD_TRACE_PARAM_INSTRUCTION_MASK,
|
||||
CL_THREAD_TRACE_PARAM_USER_DATA,
|
||||
CL_THREAD_TRACE_PARAM_IS_WRAPPED
|
||||
};
|
||||
|
||||
// CL_THREAD_TRACE_PARAM_TOKEN_MASK data selects for SI
|
||||
enum CL_THREAD_TRACE_TOKEN_MASK
|
||||
{
|
||||
//Time passed
|
||||
CL_THREAD_TRACE_TOKEN_MASK_TIME_SI = 0x00000001,
|
||||
//Resync the timestamp
|
||||
CL_THREAD_TRACE_TOKEN_MASK_TIMESTAMP_SI = 0x00000002,
|
||||
//A register write has occurred
|
||||
CL_THREAD_TRACE_TOKEN_MASK_REG_SI = 0x00000004,
|
||||
//A wavefront has started
|
||||
CL_THREAD_TRACE_TOKEN_MASK_WAVE_START_SI = 0x00000008,
|
||||
//Output space has been allocated for color/Z [Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_TOKEN_MASK_WAVE_PS_ALLOC_SI = 0x00000010,
|
||||
//Output space has been allocated for vertex position [Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_TOKEN_MASK_WAVE_VS_ALLOC_SI = 0x00000020,
|
||||
//Wavefront completion
|
||||
CL_THREAD_TRACE_TOKEN_MASK_WAVE_END_SI = 0x00000040,
|
||||
//An event has reached the top of a shader stage. In-order with WAVE_START
|
||||
CL_THREAD_TRACE_TOKEN_MASK_EVENT_SI = 0x00000080,
|
||||
//An event has reached the top of a compute shader stage. In-order with WAVE_START
|
||||
CL_THREAD_TRACE_TOKEN_MASK_EVENT_CS_SI = 0x00000100,
|
||||
//An event has reached the top of a shader stage for the second GFX pipe. In-order with WAVE_START.
|
||||
//[Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_TOKEN_MASK_EVENT_GFX_SI = 0x00000200,
|
||||
//The kernel has executed an instruction
|
||||
CL_THREAD_TRACE_TOKEN_MASK_INST_SI = 0x00000400,
|
||||
//The kernel has explicitly written the PC value
|
||||
CL_THREAD_TRACE_TOKEN_MASK_INST_PC_SI = 0x00000800,
|
||||
//The kernel has written user data into the thread trace buffer
|
||||
CL_THREAD_TRACE_TOKEN_MASK_INST_USERDATA_SI = 0x00001000,
|
||||
//Provides information about instruction scheduling
|
||||
CL_THREAD_TRACE_TOKEN_MASK_ISSUE_SI = 0x00002000,
|
||||
//The performance counter delta has been updated
|
||||
CL_THREAD_TRACE_TOKEN_MASK_PERF_SI = 0x00004000,
|
||||
//A miscellaneous event has been sent
|
||||
CL_THREAD_TRACE_TOKEN_MASK_MISC_SI = 0x00008000,
|
||||
//All possible tokens
|
||||
CL_THREAD_TRACE_TOKEN_MASK_ALL_SI = 0x0000ffff,
|
||||
enum CL_THREAD_TRACE_TOKEN_MASK {
|
||||
// Time passed
|
||||
CL_THREAD_TRACE_TOKEN_MASK_TIME_SI = 0x00000001,
|
||||
// Resync the timestamp
|
||||
CL_THREAD_TRACE_TOKEN_MASK_TIMESTAMP_SI = 0x00000002,
|
||||
// A register write has occurred
|
||||
CL_THREAD_TRACE_TOKEN_MASK_REG_SI = 0x00000004,
|
||||
// A wavefront has started
|
||||
CL_THREAD_TRACE_TOKEN_MASK_WAVE_START_SI = 0x00000008,
|
||||
// Output space has been allocated for color/Z [Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_TOKEN_MASK_WAVE_PS_ALLOC_SI = 0x00000010,
|
||||
// Output space has been allocated for vertex position [Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_TOKEN_MASK_WAVE_VS_ALLOC_SI = 0x00000020,
|
||||
// Wavefront completion
|
||||
CL_THREAD_TRACE_TOKEN_MASK_WAVE_END_SI = 0x00000040,
|
||||
// An event has reached the top of a shader stage. In-order with WAVE_START
|
||||
CL_THREAD_TRACE_TOKEN_MASK_EVENT_SI = 0x00000080,
|
||||
// An event has reached the top of a compute shader stage. In-order with WAVE_START
|
||||
CL_THREAD_TRACE_TOKEN_MASK_EVENT_CS_SI = 0x00000100,
|
||||
// An event has reached the top of a shader stage for the second GFX pipe. In-order with
|
||||
// WAVE_START.
|
||||
//[Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_TOKEN_MASK_EVENT_GFX_SI = 0x00000200,
|
||||
// The kernel has executed an instruction
|
||||
CL_THREAD_TRACE_TOKEN_MASK_INST_SI = 0x00000400,
|
||||
// The kernel has explicitly written the PC value
|
||||
CL_THREAD_TRACE_TOKEN_MASK_INST_PC_SI = 0x00000800,
|
||||
// The kernel has written user data into the thread trace buffer
|
||||
CL_THREAD_TRACE_TOKEN_MASK_INST_USERDATA_SI = 0x00001000,
|
||||
// Provides information about instruction scheduling
|
||||
CL_THREAD_TRACE_TOKEN_MASK_ISSUE_SI = 0x00002000,
|
||||
// The performance counter delta has been updated
|
||||
CL_THREAD_TRACE_TOKEN_MASK_PERF_SI = 0x00004000,
|
||||
// A miscellaneous event has been sent
|
||||
CL_THREAD_TRACE_TOKEN_MASK_MISC_SI = 0x00008000,
|
||||
// All possible tokens
|
||||
CL_THREAD_TRACE_TOKEN_MASK_ALL_SI = 0x0000ffff,
|
||||
};
|
||||
|
||||
//CL_THREAD_TRACE_PARAM_REG_MASK data selects
|
||||
enum CL_THREAD_TRACE_REG_MASK
|
||||
{
|
||||
//Event initiator
|
||||
CL_THREAD_TRACE_REG_MASK_EVENT_SI = 0x00000001,
|
||||
//Draw initiator [Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_REG_MASK_DRAW_SI = 0x00000002,
|
||||
//Dispatch initiator
|
||||
CL_THREAD_TRACE_REG_MASK_DISPATCH_SI = 0x00000004,
|
||||
//User data from host
|
||||
CL_THREAD_TRACE_REG_MASK_USERDATA_SI = 0x00000008,
|
||||
//GFXDEC register (8-state) [Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_REG_MASK_GFXDEC_SI = 0x00000020,
|
||||
//SHDEC register (many state)
|
||||
CL_THREAD_TRACE_REG_MASK_SHDEC_SI = 0x00000040,
|
||||
//Other registers
|
||||
CL_THREAD_TRACE_REG_MASK_OTHER_SI = 0x00000080,
|
||||
//All possible registers types
|
||||
CL_THREAD_TRACE_REG_MASK_ALL_SI = 0x000000ff,
|
||||
// CL_THREAD_TRACE_PARAM_REG_MASK data selects
|
||||
enum CL_THREAD_TRACE_REG_MASK {
|
||||
// Event initiator
|
||||
CL_THREAD_TRACE_REG_MASK_EVENT_SI = 0x00000001,
|
||||
// Draw initiator [Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_REG_MASK_DRAW_SI = 0x00000002,
|
||||
// Dispatch initiator
|
||||
CL_THREAD_TRACE_REG_MASK_DISPATCH_SI = 0x00000004,
|
||||
// User data from host
|
||||
CL_THREAD_TRACE_REG_MASK_USERDATA_SI = 0x00000008,
|
||||
// GFXDEC register (8-state) [Should be used for cl-gl]
|
||||
CL_THREAD_TRACE_REG_MASK_GFXDEC_SI = 0x00000020,
|
||||
// SHDEC register (many state)
|
||||
CL_THREAD_TRACE_REG_MASK_SHDEC_SI = 0x00000040,
|
||||
// Other registers
|
||||
CL_THREAD_TRACE_REG_MASK_OTHER_SI = 0x00000080,
|
||||
// All possible registers types
|
||||
CL_THREAD_TRACE_REG_MASK_ALL_SI = 0x000000ff,
|
||||
};
|
||||
|
||||
//CL_THREAD_TRACE_PARAM_VM_ID_MASK data selects
|
||||
enum CL_THREAD_TRACE_VM_ID_MASK
|
||||
{
|
||||
//Capture only data from the VM_ID used to write {SQTT}_BASE
|
||||
CL_THREAD_TRACE_VM_ID_MASK_SINGLE = 0,
|
||||
//Capture all data from all VM_IDs
|
||||
CL_THREAD_TRACE_VM_ID_MASK_ALL = 1,
|
||||
//Capture all data but only get target (a.k.a. detail) data from VM_ID used to write {SQTT}_BASE
|
||||
CL_THREAD_TRACE_VM_ID_MASK_SINGLE_DETAIL = 2
|
||||
// CL_THREAD_TRACE_PARAM_VM_ID_MASK data selects
|
||||
enum CL_THREAD_TRACE_VM_ID_MASK {
|
||||
// Capture only data from the VM_ID used to write {SQTT}_BASE
|
||||
CL_THREAD_TRACE_VM_ID_MASK_SINGLE = 0,
|
||||
// Capture all data from all VM_IDs
|
||||
CL_THREAD_TRACE_VM_ID_MASK_ALL = 1,
|
||||
// Capture all data but only get target (a.k.a. detail) data from VM_ID used to write {SQTT}_BASE
|
||||
CL_THREAD_TRACE_VM_ID_MASK_SINGLE_DETAIL = 2
|
||||
};
|
||||
|
||||
//CL_THREAD_TRACE_PARAM_CAPTURE_MODE data
|
||||
enum CL_THREAD_TRACE_CAPTURE_MODE
|
||||
{
|
||||
//Capture all data in the thread trace buffer
|
||||
CL_THREAD_TRACE_CAPTURE_ALL = 0,
|
||||
//Capture only data between THREAD_TRACE_START and THREAD_TRACE_STOP events
|
||||
CL_THREAD_TRACE_CAPTURE_SELECT = 1,
|
||||
//Capture data between THREAD_TRACE_START and THREAD_TRACE_/STOP events,
|
||||
//and global/reference data at all times
|
||||
CL_THREAD_TRACE_CAPTURE_SELECT_DETAIL = 2
|
||||
// CL_THREAD_TRACE_PARAM_CAPTURE_MODE data
|
||||
enum CL_THREAD_TRACE_CAPTURE_MODE {
|
||||
// Capture all data in the thread trace buffer
|
||||
CL_THREAD_TRACE_CAPTURE_ALL = 0,
|
||||
// Capture only data between THREAD_TRACE_START and THREAD_TRACE_STOP events
|
||||
CL_THREAD_TRACE_CAPTURE_SELECT = 1,
|
||||
// Capture data between THREAD_TRACE_START and THREAD_TRACE_/STOP events,
|
||||
// and global/reference data at all times
|
||||
CL_THREAD_TRACE_CAPTURE_SELECT_DETAIL = 2
|
||||
};
|
||||
|
||||
//CL_THREAD_TRACE_PARAM_INSTRUCTION_MASK data selects
|
||||
enum CL_THREAD_TRACE_INSTRUCTION_MASK
|
||||
{
|
||||
//Generate {SQTT}_TOKEN_INST tokens for all instructions
|
||||
CL_THREAD_TRACE_INST_MASK_ALL,
|
||||
//Generate {SQTT}_TOKEN_INST tokens for stalled instructions only
|
||||
CL_THREAD_TRACE_INST_MASK_STALLED,
|
||||
//Generate {SQTT}_TOKEN_INST messages for stalled and other (no op/wait/set prio/etc) instructions
|
||||
CL_THREAD_TRACE_INST_MASK_STALLED_AND_IMMEDIATE,
|
||||
//Generate {SQTT}_TOKEN_INST messages for immediate instructions only only [ Should be used only for CI]
|
||||
CL_THREAD_TRACE_INST_MASK_IMMEDIATE_CI,
|
||||
// CL_THREAD_TRACE_PARAM_INSTRUCTION_MASK data selects
|
||||
enum CL_THREAD_TRACE_INSTRUCTION_MASK {
|
||||
// Generate {SQTT}_TOKEN_INST tokens for all instructions
|
||||
CL_THREAD_TRACE_INST_MASK_ALL,
|
||||
// Generate {SQTT}_TOKEN_INST tokens for stalled instructions only
|
||||
CL_THREAD_TRACE_INST_MASK_STALLED,
|
||||
// Generate {SQTT}_TOKEN_INST messages for stalled and other (no op/wait/set prio/etc)
|
||||
// instructions
|
||||
CL_THREAD_TRACE_INST_MASK_STALLED_AND_IMMEDIATE,
|
||||
// Generate {SQTT}_TOKEN_INST messages for immediate instructions only only [ Should be used only
|
||||
// for CI]
|
||||
CL_THREAD_TRACE_INST_MASK_IMMEDIATE_CI,
|
||||
};
|
||||
|
||||
enum ThreadTraceInfo
|
||||
{
|
||||
CL_THREAD_TRACE_SE,
|
||||
CL_THREAD_TRACE_BUFFERS_FILLED,
|
||||
CL_THREAD_TRACE_BUFFERS_SIZE
|
||||
enum ThreadTraceInfo {
|
||||
CL_THREAD_TRACE_SE,
|
||||
CL_THREAD_TRACE_BUFFERS_FILLED,
|
||||
CL_THREAD_TRACE_BUFFERS_SIZE
|
||||
};
|
||||
|
||||
|
||||
@@ -251,27 +247,24 @@ enum ThreadTraceInfo
|
||||
*
|
||||
* \return the created threadTrace object
|
||||
*/
|
||||
extern CL_API_ENTRY cl_threadtrace_amd CL_API_CALL
|
||||
clCreateThreadTraceAMD(
|
||||
cl_device_id /* device */,
|
||||
cl_int* /* errcode_ret */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_threadtrace_amd CL_API_CALL clCreateThreadTraceAMD(
|
||||
cl_device_id /* device */, cl_int* /* errcode_ret */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Destroys a cl_threadtrace_amd object.
|
||||
*
|
||||
* \param threadTrace the cl_threadtrace_amd object for release
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to release threadTrace
|
||||
* -CL_INVALID_VALUE if the thread_trace is not a valid OpenCL thread trace object (cl_threadtrace_amd) .
|
||||
* -CL_INVALID_VALUE if the thread_trace is not a valid OpenCL thread trace object
|
||||
(cl_threadtrace_amd) .
|
||||
* -CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the
|
||||
* OpenCL implementation on the device.
|
||||
* -CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the
|
||||
OpenCL implementation on the host.
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clReleaseThreadTraceAMD(
|
||||
cl_threadtrace_amd /* threadTrace */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clReleaseThreadTraceAMD(cl_threadtrace_amd /* threadTrace */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Increments the cl_threadtrace_amd object reference count.
|
||||
*
|
||||
@@ -284,36 +277,36 @@ clReleaseThreadTraceAMD(
|
||||
* -CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the
|
||||
OpenCL implementation on the host.
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clRetainThreadTraceAMD(
|
||||
cl_threadtrace_amd /* threadTrace */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clRetainThreadTraceAMD(cl_threadtrace_amd /* threadTrace */
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Sets the cl_threadtrace_amd object configuration parameter.
|
||||
*
|
||||
* \param thread_trace the cl_threadtrace_amd object to set configuration parameter
|
||||
* \param thread_trace the cl_threadtrace_amd object to set configuration parameter
|
||||
*
|
||||
* \param config_param the cl_thread_trace_param
|
||||
* \param config_param the cl_thread_trace_param
|
||||
*
|
||||
* \param param_value corresponding to configParam
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to set threadTrace buffer parameter
|
||||
* - CL_INVALID_VALUE if the thread_trace is invalid thread trace object.
|
||||
* - CL_INVALID_VALUE if the invalid config_param or param_value enum values , are used.
|
||||
* - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or event_wait_list is not NULL and num_events_in_wait_list is 0,
|
||||
* - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or
|
||||
event_wait_list is not NULL and num_events_in_wait_list is 0,
|
||||
* - or if event objects in event_wait_list are not valid events.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL implementation on the device.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL
|
||||
implementation on the device.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the
|
||||
OpenCL implementation on the host.
|
||||
*/
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clSetThreadTraceParamAMD(cl_threadtrace_amd /*thread_trace*/ ,
|
||||
cl_thread_trace_param /*config_param*/ ,
|
||||
cl_uint /*param_value*/
|
||||
)CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clSetThreadTraceParamAMD(
|
||||
cl_threadtrace_amd /*thread_trace*/, cl_thread_trace_param /*config_param*/,
|
||||
cl_uint /*param_value*/
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* \brief Enqueues the binding command to bind cl_threadtrace_amd to cl_mem object for trace recording..
|
||||
/* \brief Enqueues the binding command to bind cl_threadtrace_amd to cl_mem object for trace
|
||||
* recording..
|
||||
*
|
||||
* \param command_queue must be a valid OpenCL command queue.
|
||||
*
|
||||
@@ -345,28 +338,30 @@ clSetThreadTraceParamAMD(cl_threadtrace_amd /*thread_trace*/ ,
|
||||
* wait for this command to complete.
|
||||
* \return A non zero value if OpenCL failed to set threadTrace buffer parameter
|
||||
* - CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue.
|
||||
* - CL_INVALID_CONTEXT if the context associated with command_queue and events in event_wait_list are not the same.
|
||||
* - CL_INVALID_CONTEXT if the context associated with command_queue and events in event_wait_list
|
||||
* are not the same.
|
||||
* - CL_INVALID_VALUE if the thread_trace is invalid thread trace object.
|
||||
* - CL_INVALID_VALUE if the buffer_size is negative or zero.
|
||||
* - CL_INVALID_VALUE if the sub_buffers_num I less than 1.
|
||||
* - CL_INVALID_OPERATION if the mem_objects_num is not equal to the number of Shader Engines of the [GPU] device.
|
||||
* - CL_INVALID_MEM_OBJECT if one on memory objects in the mem_objects array is not a valid memory object or memory_objects is NULL.
|
||||
* - CL_MEM_OBJECT_ALLOCATION_FAILURE if there is a failure to allocate memory for the data store associated from the memory objects of the mem_objects array.
|
||||
* - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or event_wait_list is not NULL and num_events_in_wait_list is 0, or if event objects in event_wait_list are not valid events.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL implementation on the device.
|
||||
* - CL_INVALID_OPERATION if the mem_objects_num is not equal to the number of Shader Engines of
|
||||
* the [GPU] device.
|
||||
* - CL_INVALID_MEM_OBJECT if one on memory objects in the mem_objects array is not a valid memory
|
||||
* object or memory_objects is NULL.
|
||||
* - CL_MEM_OBJECT_ALLOCATION_FAILURE if there is a failure to allocate memory for the data store
|
||||
* associated from the memory objects of the mem_objects array.
|
||||
* - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or
|
||||
* event_wait_list is not NULL and num_events_in_wait_list is 0, or if event objects in
|
||||
* event_wait_list are not valid events.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL
|
||||
* implementation on the device.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the
|
||||
* OpenCL implementation on the host.
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueBindThreadTraceBufferAMD(cl_command_queue command_queue ,
|
||||
cl_threadtrace_amd /*thread_trace*/ ,
|
||||
cl_mem* /*mem_objects*/ ,
|
||||
cl_uint /*mem_objects_num*/ ,
|
||||
cl_uint /*buffer_size*/ ,
|
||||
cl_uint /*num_events_in_wait_list*/ ,
|
||||
const cl_event* /*event_wait_list*/ ,
|
||||
cl_event* /*event*/
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueBindThreadTraceBufferAMD(
|
||||
cl_command_queue command_queue, cl_threadtrace_amd /*thread_trace*/, cl_mem* /*mem_objects*/,
|
||||
cl_uint /*mem_objects_num*/, cl_uint /*buffer_size*/, cl_uint /*num_events_in_wait_list*/,
|
||||
const cl_event* /*event_wait_list*/, cl_event* /*event*/
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Get specific information about the OpenCL Thread Trace.
|
||||
*
|
||||
@@ -392,14 +387,10 @@ clEnqueueBindThreadTraceBufferAMD(cl_command_queue command_queue ,
|
||||
* OpenCL implementation on the host.
|
||||
* CL_SUCCESS if the function is executed successfully.
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetThreadTraceInfoAMD(
|
||||
cl_threadtrace_amd /* thread_trace */,
|
||||
cl_threadtrace_info /*thread_trace_info_param*/,
|
||||
size_t /*param_value_size*/,
|
||||
void* /*param_value*/,
|
||||
size_t* /*param_value_size_ret*/
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clGetThreadTraceInfoAMD(
|
||||
cl_threadtrace_amd /* thread_trace */, cl_threadtrace_info /*thread_trace_info_param*/,
|
||||
size_t /*param_value_size*/, void* /*param_value*/, size_t* /*param_value_size_ret*/
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/*! \brief Enqueues the thread trace command for the specified thread trace object.
|
||||
*
|
||||
@@ -409,31 +400,36 @@ clGetThreadTraceInfoAMD(
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to release threadTrace
|
||||
* - CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue.
|
||||
* - CL_INVALID_CONTEXT if the context associated with command_queue and events in event_wait_list are not the same.
|
||||
* - CL_INVALID_CONTEXT if the context associated with command_queue and events in event_wait_list
|
||||
* are not the same.
|
||||
* - CL_INVALID_VALUE if the thread_trace is invalid thread trace object .
|
||||
* - CL_INVALID_VALUE if the invalid command name enum value , not described in the cl_threadtrace_command_name_amd, is used.
|
||||
* - CL_INVALID_VALUE if the invalid command name enum value , not described in the
|
||||
* cl_threadtrace_command_name_amd, is used.
|
||||
* - CL_INVALID_OPERATION if the command enqueue failed. It can happen in the following cases:
|
||||
* o BEGIN_COMMAND is queued for thread trace object for which memory object/s was/were not bound..
|
||||
* o BEGIN_COMMAND is queued for thread trace object for which memory object/s was/were not
|
||||
* bound..
|
||||
* o END_COMMAND is queued for thread trace object, for which BEGIN_COMMAND was not queued.
|
||||
* o PAUSE_COMMAND is queued for thread trace object, for which BEGIN_COMMAND was not queued.
|
||||
* o RESUME_COMMAND is queued for thread trace object, for which PAUSE_COMMAND was not queued.
|
||||
* - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or event_wait_list is not NULL and num_events_in_wait_list is 0, or if event objects in event_wait_list are not valid events.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL implementation on the device.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL implementation on the host.
|
||||
* o PAUSE_COMMAND is queued for thread trace object, for which BEGIN_COMMAND was not
|
||||
* queued.
|
||||
* o RESUME_COMMAND is queued for thread trace object, for which PAUSE_COMMAND was not
|
||||
* queued.
|
||||
* - CL_INVALID_EVENT_WAIT_LIST if event_wait_list is NULL and num_events_in_wait_list > 0, or
|
||||
* event_wait_list is not NULL and num_events_in_wait_list is 0, or if event objects in
|
||||
* event_wait_list are not valid events.
|
||||
* - CL_OUT_OF_RESOURCES if there is a failure to allocate resources required by the OpenCL
|
||||
* implementation on the device.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the OpenCL
|
||||
* implementation on the host.
|
||||
*/
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueThreadTraceCommandAMD(
|
||||
cl_command_queue /*command_queue*/ ,
|
||||
cl_threadtrace_amd /*thread_trace*/ ,
|
||||
cl_threadtrace_command_name_amd /*command_name*/ ,
|
||||
cl_uint /*num_events_in_wait_list*/ ,
|
||||
const cl_event* /*event_wait_list*/,
|
||||
cl_event* /*event*/
|
||||
)CL_API_SUFFIX__VERSION_1_0;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clEnqueueThreadTraceCommandAMD(
|
||||
cl_command_queue /*command_queue*/, cl_threadtrace_amd /*thread_trace*/,
|
||||
cl_threadtrace_command_name_amd /*command_name*/, cl_uint /*num_events_in_wait_list*/,
|
||||
const cl_event* /*event_wait_list*/, cl_event* /*event*/
|
||||
) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*__CL_THREAD_TRACE_AMD_H*/
|
||||
#endif /*__CL_THREAD_TRACE_AMD_H*/
|
||||
|
||||
Reference in New Issue
Block a user