initial commit
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
EXPORTS
|
||||
clBuildProgram
|
||||
clCreateBuffer
|
||||
clCreateCommandQueue
|
||||
clCreateContext
|
||||
clCreateContextFromType
|
||||
clCreateFromGLBuffer
|
||||
clCreateFromGLRenderbuffer
|
||||
clCreateFromGLTexture2D
|
||||
clCreateFromGLTexture3D
|
||||
clCreateImage2D
|
||||
clCreateImage3D
|
||||
clCreateKernel
|
||||
clCreateKernelsInProgram
|
||||
clCreateProgramWithBinary
|
||||
clCreateProgramWithSource
|
||||
clCreateSampler
|
||||
clEnqueueAcquireGLObjects
|
||||
clEnqueueBarrier
|
||||
clEnqueueCopyBuffer
|
||||
clEnqueueCopyBufferToImage
|
||||
clEnqueueCopyImage
|
||||
clEnqueueCopyImageToBuffer
|
||||
clEnqueueMapBuffer
|
||||
clEnqueueMapImage
|
||||
clEnqueueMarker
|
||||
clEnqueueNDRangeKernel
|
||||
clEnqueueNativeKernel
|
||||
clEnqueueReadBuffer
|
||||
clEnqueueReadImage
|
||||
clEnqueueReleaseGLObjects
|
||||
clEnqueueTask
|
||||
clEnqueueUnmapMemObject
|
||||
clEnqueueWaitForEvents
|
||||
clEnqueueWriteBuffer
|
||||
clEnqueueWriteImage
|
||||
clFinish
|
||||
clFlush
|
||||
clGetCommandQueueInfo
|
||||
clGetContextInfo
|
||||
clGetDeviceIDs
|
||||
clGetDeviceInfo
|
||||
clGetEventInfo
|
||||
clGetEventProfilingInfo
|
||||
clGetExtensionFunctionAddress
|
||||
clGetGLObjectInfo
|
||||
clGetGLTextureInfo
|
||||
clGetImageInfo
|
||||
clGetKernelInfo
|
||||
clGetKernelWorkGroupInfo
|
||||
clGetMemObjectInfo
|
||||
clGetPlatformIDs
|
||||
clGetPlatformInfo
|
||||
clGetProgramBuildInfo
|
||||
clGetProgramInfo
|
||||
clGetSamplerInfo
|
||||
clGetSupportedImageFormats
|
||||
clReleaseCommandQueue
|
||||
clReleaseContext
|
||||
clReleaseEvent
|
||||
clReleaseKernel
|
||||
clReleaseMemObject
|
||||
clReleaseProgram
|
||||
clReleaseSampler
|
||||
clRetainCommandQueue
|
||||
clRetainContext
|
||||
clRetainEvent
|
||||
clRetainKernel
|
||||
clRetainMemObject
|
||||
clRetainProgram
|
||||
clRetainSampler
|
||||
clSetCommandQueueProperty
|
||||
clSetKernelArg
|
||||
clUnloadCompiler
|
||||
clWaitForEvents
|
||||
clIcdGetPlatformIDsKHR
|
||||
clCreateUserEvent
|
||||
clSetUserEventStatus
|
||||
clSetEventCallback
|
||||
clSetMemObjectDestructorCallback
|
||||
clCreateSubBuffer
|
||||
clEnqueueReadBufferRect
|
||||
clEnqueueWriteBufferRect
|
||||
clEnqueueCopyBufferRect
|
||||
|
||||
#if (OPENCL_MAJOR > 1) || (OPENCL_MAJOR == 1 && OPENCL_MINOR >= 2)
|
||||
clCompileProgram
|
||||
clCreateFromGLTexture
|
||||
clCreateImage
|
||||
clCreateProgramWithBuiltInKernels
|
||||
clCreateSubDevices
|
||||
clEnqueueBarrierWithWaitList
|
||||
clEnqueueFillBuffer
|
||||
clEnqueueFillImage
|
||||
clEnqueueMarkerWithWaitList
|
||||
clEnqueueMigrateMemObjects
|
||||
clGetExtensionFunctionAddressForPlatform
|
||||
clGetKernelArgInfo
|
||||
clLinkProgram
|
||||
clReleaseDevice
|
||||
clRetainDevice
|
||||
clUnloadPlatformCompiler
|
||||
#endif
|
||||
|
||||
#if (OPENCL_MAJOR >= 2)
|
||||
clCreateCommandQueueWithProperties
|
||||
clCreateSamplerWithProperties
|
||||
clCreatePipe
|
||||
clGetPipeInfo
|
||||
clSVMAlloc
|
||||
clSVMFree
|
||||
clSetKernelArgSVMPointer
|
||||
clSetKernelExecInfo
|
||||
clEnqueueSVMFree
|
||||
clEnqueueSVMMemcpy
|
||||
clEnqueueSVMMemFill
|
||||
clEnqueueSVMMap
|
||||
clEnqueueSVMUnmap
|
||||
#endif
|
||||
|
||||
aclCompilerInit
|
||||
aclCompilerFini
|
||||
aclCompilerVersion
|
||||
aclVersionSize
|
||||
aclGetErrorString
|
||||
aclGetArchInfo
|
||||
aclGetDeviceInfo
|
||||
aclGetTargetInfo
|
||||
aclGetArchitecture
|
||||
aclGetFamily
|
||||
aclGetChip
|
||||
aclBinaryInit
|
||||
aclBinaryFini
|
||||
aclReadFromFile
|
||||
aclReadFromMem
|
||||
aclWriteToFile
|
||||
aclWriteToMem
|
||||
aclCreateFromBinary
|
||||
aclBinaryVersion
|
||||
aclInsertSection
|
||||
aclRemoveSection
|
||||
aclExtractSection
|
||||
aclInsertSymbol
|
||||
aclRemoveSymbol
|
||||
aclExtractSymbol
|
||||
aclDbgAddArgument
|
||||
aclDbgRemoveArgument
|
||||
aclQueryInfo
|
||||
aclCompile
|
||||
aclLink
|
||||
aclGetCompilerLog
|
||||
aclRetrieveType
|
||||
aclSetType
|
||||
aclConvertType
|
||||
aclDisassemble
|
||||
aclGetDeviceBinary
|
||||
aclDumpBinary
|
||||
|
||||
oclCompilerInit
|
||||
oclCompilerFini
|
||||
oclCompilerVersion
|
||||
oclVersionSize
|
||||
oclCompileSource
|
||||
oclCompileSourceToIR
|
||||
oclCompileIRToIL
|
||||
oclCompileILToISA
|
||||
oclCompileBinary
|
||||
oclGetCompilerLog
|
||||
oclGetArchInfo
|
||||
oclGetFamilyInfo
|
||||
oclGetDeviceInfo
|
||||
oclGetAsicInfo
|
||||
oclGetTargetInfo
|
||||
oclGetArchitecture
|
||||
oclGetFamily
|
||||
oclGetChip
|
||||
oclGetAsic
|
||||
elfInsertSection
|
||||
elfExtractSection
|
||||
elfInsertSymbol
|
||||
elfExtractSymbol
|
||||
oclirSetType
|
||||
oclirRetrieveType
|
||||
oclirLink
|
||||
oclhsaCompileSource
|
||||
oclhsaCompileBinary
|
||||
oclhsaSetType
|
||||
oclhsaRetrieveType
|
||||
oclhsaConvertType
|
||||
oclilCompileSource
|
||||
oclilCompileBinary
|
||||
oclilSetType
|
||||
oclilRetrieveType
|
||||
oclilConvertType
|
||||
oclisaDisassemble
|
||||
oclisaGetBinaryBlob
|
||||
constructOclElf
|
||||
destructOclElf
|
||||
readOclElfFromFile
|
||||
readOclElfFromMem
|
||||
writeOclElfToFile
|
||||
writeOclElfToMem
|
||||
createElfFromElf
|
||||
getBIFVersion
|
||||
rtGetInfo
|
||||
|
||||
#if !defined(OPENCL_MAINLINE)
|
||||
#endif
|
||||
@@ -0,0 +1,245 @@
|
||||
OPENCL_1.0 {
|
||||
global:
|
||||
clBuildProgram;
|
||||
clCreateBuffer;
|
||||
clCreateCommandQueue;
|
||||
clCreateContext;
|
||||
clCreateContextFromType;
|
||||
clCreateFromD3D10Buffer;
|
||||
clCreateFromGLBuffer;
|
||||
clCreateFromGLRenderbuffer;
|
||||
clCreateFromGLTexture2D;
|
||||
clCreateFromGLTexture3D;
|
||||
clCreateImage2D;
|
||||
clCreateImage3D;
|
||||
clCreateImageFromD3D10Resource;
|
||||
clCreateKernel;
|
||||
clCreateKernelsInProgram;
|
||||
clCreateProgramWithBinary;
|
||||
clCreateProgramWithSource;
|
||||
clCreateSampler;
|
||||
clEnqueueAcquireExternalObjects;
|
||||
clEnqueueAcquireGLObjects;
|
||||
clEnqueueBarrier;
|
||||
clEnqueueCopyBuffer;
|
||||
clEnqueueCopyBufferToImage;
|
||||
clEnqueueCopyImage;
|
||||
clEnqueueCopyImageToBuffer;
|
||||
clEnqueueMapBuffer;
|
||||
clEnqueueMapImage;
|
||||
clEnqueueMarker;
|
||||
clEnqueueNDRangeKernel;
|
||||
clEnqueueNativeKernel;
|
||||
clEnqueueReadBuffer;
|
||||
clEnqueueReadImage;
|
||||
clEnqueueReleaseExternalObjects;
|
||||
clEnqueueReleaseGLObjects;
|
||||
clEnqueueTask;
|
||||
clEnqueueUnmapMemObject;
|
||||
clEnqueueWaitForEvents;
|
||||
clEnqueueWriteBuffer;
|
||||
clEnqueueWriteImage;
|
||||
clFinish;
|
||||
clFlush;
|
||||
clGetCommandQueueInfo;
|
||||
clGetContextInfo;
|
||||
clGetDeviceIDs;
|
||||
clGetDeviceInfo;
|
||||
clGetEventInfo;
|
||||
clGetEventProfilingInfo;
|
||||
clGetExtensionFunctionAddress;
|
||||
clGetGLObjectInfo;
|
||||
clGetGLTextureInfo;
|
||||
clGetImageInfo;
|
||||
clGetKernelInfo;
|
||||
clGetKernelWorkGroupInfo;
|
||||
clGetMemObjectInfo;
|
||||
clGetPlatformIDs;
|
||||
clGetPlatformInfo;
|
||||
clGetProgramBuildInfo;
|
||||
clGetProgramInfo;
|
||||
clGetSamplerInfo;
|
||||
clGetSupportedImageFormats;
|
||||
clReleaseCommandQueue;
|
||||
clReleaseContext;
|
||||
clReleaseEvent;
|
||||
clReleaseKernel;
|
||||
clReleaseMemObject;
|
||||
clReleaseProgram;
|
||||
clReleaseSampler;
|
||||
clRetainCommandQueue;
|
||||
clRetainContext;
|
||||
clRetainEvent;
|
||||
clRetainKernel;
|
||||
clRetainMemObject;
|
||||
clRetainProgram;
|
||||
clRetainSampler;
|
||||
clSetCommandQueueProperty;
|
||||
clSetKernelArg;
|
||||
clUnloadCompiler;
|
||||
clWaitForEvents;
|
||||
clIcdGetPlatformIDsKHR;
|
||||
#if defined(OPENCL_MAINLINE)
|
||||
local:
|
||||
*;
|
||||
#endif
|
||||
};
|
||||
|
||||
#if (OPENCL_MAJOR > 1) || (OPENCL_MAJOR == 1 && OPENCL_MINOR >= 1)
|
||||
OPENCL_1.1 {
|
||||
global:
|
||||
clCreateUserEvent;
|
||||
clSetUserEventStatus;
|
||||
clSetEventCallback;
|
||||
clSetMemObjectDestructorCallback;
|
||||
clCreateSubBuffer;
|
||||
clEnqueueReadBufferRect;
|
||||
clEnqueueWriteBufferRect;
|
||||
clEnqueueCopyBufferRect;
|
||||
|
||||
aclGetTargetInfo;
|
||||
aclCompilerInit;
|
||||
aclCompilerFini;
|
||||
aclReadFromMem;
|
||||
aclReadFromFile;
|
||||
aclBinaryInit;
|
||||
aclBinaryFini;
|
||||
aclWriteToMem;
|
||||
aclInsertSection;
|
||||
aclExtractSection;
|
||||
aclRemoveSection;
|
||||
aclQueryInfo;
|
||||
aclDbgAddArgument;
|
||||
aclExtractSymbol;
|
||||
aclInsertSymbol;
|
||||
aclRemoveSymbol;
|
||||
aclCompile;
|
||||
aclDisassemble;
|
||||
} OPENCL_1.0;
|
||||
#endif
|
||||
|
||||
#if (OPENCL_MAJOR > 1) || (OPENCL_MAJOR == 1 && OPENCL_MINOR >= 2)
|
||||
OPENCL_1.2 {
|
||||
global:
|
||||
clCompileProgram;
|
||||
clCreateFromGLTexture;
|
||||
clCreateImage;
|
||||
clCreateProgramWithBuiltInKernels;
|
||||
clCreateSubDevices;
|
||||
clEnqueueBarrierWithWaitList;
|
||||
clEnqueueFillBuffer;
|
||||
clEnqueueFillImage;
|
||||
clEnqueueMarkerWithWaitList;
|
||||
clEnqueueMigrateMemObjects;
|
||||
clGetExtensionFunctionAddressForPlatform;
|
||||
clGetKernelArgInfo;
|
||||
clLinkProgram;
|
||||
clReleaseDevice;
|
||||
clRetainDevice;
|
||||
clUnloadPlatformCompiler;
|
||||
} OPENCL_1.1;
|
||||
#endif
|
||||
|
||||
#if (OPENCL_MAJOR >= 2)
|
||||
OPENCL_2.0 {
|
||||
global:
|
||||
clCreateCommandQueueWithProperties;
|
||||
clCreateSamplerWithProperties;
|
||||
clCreatePipe;
|
||||
clGetPipeInfo;
|
||||
clSVMAlloc;
|
||||
clSVMFree;
|
||||
clSetKernelArgSVMPointer;
|
||||
clSetKernelExecInfo;
|
||||
clEnqueueSVMFree;
|
||||
clEnqueueSVMMemcpy;
|
||||
clEnqueueSVMMemFill;
|
||||
clEnqueueSVMMap;
|
||||
clEnqueueSVMUnmap;
|
||||
} OPENCL_1.2;
|
||||
#endif
|
||||
|
||||
ACL_0.8 {
|
||||
global:
|
||||
oclCompilerInit;
|
||||
oclCompilerFini;
|
||||
oclCompilerVersion;
|
||||
oclVersionSize;
|
||||
oclCompileSource;
|
||||
oclCompileSourceToIR;
|
||||
oclCompileIRToIL;
|
||||
oclCompileILToISA;
|
||||
oclCompileBinary;
|
||||
oclGetCompilerLog;
|
||||
oclGetArchInfo;
|
||||
oclGetDeviceInfo;
|
||||
oclGetTargetInfo;
|
||||
oclGetArchitecture;
|
||||
oclGetFamily;
|
||||
oclGetChip;
|
||||
readOclElfFromFile;
|
||||
readOclElfFromMem;
|
||||
writeOclElfToFile;
|
||||
writeOclElfToMem;
|
||||
createElfFromElf;
|
||||
getBIFVersion;
|
||||
constructOclElf;
|
||||
destructOclElf;
|
||||
elfInsertSection;
|
||||
elfExtractSection;
|
||||
elfInsertSymbol;
|
||||
elfExtractSymbol;
|
||||
oclirSetType;
|
||||
oclirRetrieveType;
|
||||
oclirLink;
|
||||
oclhsaCompileSource;
|
||||
oclhsaCompileBinary;
|
||||
oclhsaSetType;
|
||||
oclhsaRetrieveType;
|
||||
oclhsaConvertType;
|
||||
oclilCompileSource;
|
||||
oclilCompileBinary;
|
||||
oclilSetType;
|
||||
oclilRetrieveType;
|
||||
oclilConvertType;
|
||||
oclisaDisassemble;
|
||||
oclisaGetBinaryBlob;
|
||||
rtGetInfo;
|
||||
aclCompilerInit;
|
||||
aclCompilerFini;
|
||||
aclCompilerVersion;
|
||||
aclVersionSize;
|
||||
aclGetErrorString;
|
||||
aclGetArchInfo;
|
||||
aclGetDeviceInfo;
|
||||
aclGetTargetInfo;
|
||||
aclGetArchitecture;
|
||||
aclGetFamily;
|
||||
aclGetChip;
|
||||
aclBinaryInit;
|
||||
aclBinaryFini;
|
||||
aclReadFromFile;
|
||||
aclReadFromMem;
|
||||
aclWriteToFile;
|
||||
aclWriteToMem;
|
||||
aclCreateFromBinary;
|
||||
aclBinaryVersion;
|
||||
aclInsertSection;
|
||||
aclRemoveSection;
|
||||
aclExtractSection;
|
||||
aclInsertSymbol;
|
||||
aclRemoveSymbol;
|
||||
aclExtractSymbol;
|
||||
aclDbgAddArgument;
|
||||
aclDbgRemoveArgument;
|
||||
aclQueryInfo;
|
||||
aclCompile;
|
||||
aclLink;
|
||||
aclGetCompilerLog;
|
||||
aclRetrieveType;
|
||||
aclSetType;
|
||||
aclConvertType;
|
||||
aclDisassemble;
|
||||
aclGetDeviceBinary;
|
||||
aclDumpBinary;
|
||||
};
|
||||
@@ -0,0 +1,75 @@
|
||||
#define STR(__macro__) #__macro__
|
||||
#define XSTR(__macro__) STR(__macro__)
|
||||
|
||||
#if defined(_DEBUG)
|
||||
#define DEBUG_ONLY(x) x
|
||||
#else
|
||||
#define DEBUG_ONLY(x)
|
||||
#endif
|
||||
|
||||
#define VERSION_PREFIX_MAJOR 1
|
||||
#define VERSION_PREFIX_MINOR 2
|
||||
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "winresrc.h"
|
||||
#include "utils/versions.hpp"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 10,0,AMD_PLATFORM_BUILD_NUMBER,AMD_PLATFORM_REVISION_NUMBER
|
||||
PRODUCTVERSION 10,0,AMD_PLATFORM_BUILD_NUMBER,AMD_PLATFORM_REVISION_NUMBER
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", " \0"
|
||||
VALUE "CompanyName", "Advanced Micro Devices Inc.\0"
|
||||
VALUE "FileDescription", AMD_PLATFORM_NAME " OpenCL " XSTR(VERSION_PREFIX_MAJOR) "." XSTR(VERSION_PREFIX_MINOR) " Runtime\0"
|
||||
VALUE "FileVersion", "10, 0, " XSTR(AMD_PLATFORM_BUILD_NUMBER) ", " XSTR(AMD_PLATFORM_REVISION_NUMBER)
|
||||
VALUE "InternalName", "OpenCL"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2011 Advanced Micro Devices Inc.\0"
|
||||
VALUE "OriginalFilename", "OpenCL.dll"
|
||||
VALUE "ProductName", "OpenCL " XSTR(VERSION_PREFIX_MAJOR) "." XSTR(VERSION_PREFIX_MINOR) " " AMD_PLATFORM_INFO "\0"
|
||||
VALUE "ProductVersion", "10, 0, " XSTR(AMD_PLATFORM_BUILD_NUMBER) ", " XSTR(AMD_PLATFORM_REVISION_NUMBER)
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@@ -0,0 +1,312 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
|
||||
#ifndef __OPENCL_CL_AGENT_AMD_H
|
||||
#define __OPENCL_CL_AGENT_AMD_H
|
||||
|
||||
#include <CL/cl.h>
|
||||
#include "cl_icd_amd.h"
|
||||
|
||||
#define cl_amd_agent 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef const struct _cl_agent cl_agent;
|
||||
|
||||
#define CL_AGENT_VERSION_1_0 100
|
||||
|
||||
/* Context Callbacks */
|
||||
|
||||
typedef void (CL_CALLBACK * acContextCreate_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 * 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 * 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 */);
|
||||
|
||||
/* Memory Object Callbacks */
|
||||
|
||||
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 * 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 * 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 * acProgramFree_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 * 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 struct _cl_agent_callbacks
|
||||
{
|
||||
/* Context Callbacks */
|
||||
acContextCreate_fn ContextCreate;
|
||||
acContextFree_fn ContextFree;
|
||||
|
||||
/* Command Queue Callbacks */
|
||||
acCommandQueueCreate_fn CommandQueueCreate;
|
||||
acCommandQueueFree_fn CommandQueueFree;
|
||||
|
||||
/* Event Callbacks */
|
||||
acEventCreate_fn EventCreate;
|
||||
acEventFree_fn EventFree;
|
||||
acEventStatusChanged_fn EventStatusChanged;
|
||||
|
||||
/* Memory Object Callbacks */
|
||||
acMemObjectCreate_fn MemObjectCreate;
|
||||
acMemObjectFree_fn MemObjectFree;
|
||||
acMemObjectAcquired_fn MemObjectAcquired;
|
||||
|
||||
/* Sampler Callbacks */
|
||||
acSamplerCreate_fn SamplerCreate;
|
||||
acSamplerFree_fn SamplerFree;
|
||||
|
||||
/* Program Callbacks */
|
||||
acProgramCreate_fn ProgramCreate;
|
||||
acProgramFree_fn ProgramFree;
|
||||
acProgramBuild_fn ProgramBuild;
|
||||
|
||||
/* 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_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;
|
||||
|
||||
} cl_agent_capabilities;
|
||||
|
||||
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 * 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 * 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 * 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 * SetICDDispatchTable)(
|
||||
cl_agent * /* agent */,
|
||||
const cl_icd_dispatch_table * /* table */,
|
||||
size_t /* size */);
|
||||
|
||||
/* add Kernel/Program helper functions, etc... */
|
||||
};
|
||||
|
||||
extern cl_int CL_CALLBACK
|
||||
clAgent_OnLoad(cl_agent * /* agent */);
|
||||
|
||||
extern void CL_CALLBACK
|
||||
clAgent_OnUnload(cl_agent * /* agent */);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __OPENCL_CL_AGENT_AMD_H */
|
||||
@@ -0,0 +1,356 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
|
||||
#include "platform/object.hpp"
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/command.hpp"
|
||||
#include "platform/agent.hpp"
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup CL_Queues
|
||||
*
|
||||
* OpenCL objects such as memory objects, program and kernel objects are
|
||||
* created using a context. Operations on these objects are performed using
|
||||
* a command-queue. The command-queue can be used to queue a set of operations
|
||||
* (referred to as commands) in order. Having multiple command-queues allows
|
||||
* applications to queue multiple independent commands without requiring
|
||||
* synchronization. Note that this should work as long as these objects are
|
||||
* not being shared. Sharing of objects across multiple command-queues will
|
||||
* require the application to perform appropriate synchronization.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief Create a command-queue on a specific device.
|
||||
*
|
||||
* \param context must be a valid OpenCL context.
|
||||
*
|
||||
* \param device must be a device associated with context. It can either be
|
||||
* in the list of devices specified when context is created using
|
||||
* clCreateContext or have the same device type as device type specified wheni
|
||||
* context is created using clCreateContextFromType.
|
||||
*
|
||||
* \param properties specifies a list of properties for the command-queue.
|
||||
*
|
||||
* \param errcode_ret will return an appropriate error code. If \a errcode_ret
|
||||
* is NULL, no error code is returned.
|
||||
*
|
||||
* \return A valid non-zero command-queue and \a errcode_ret is set to
|
||||
* CL_SUCCESS if the command-queue is created successfully or a NULL value
|
||||
* with one of the following error values returned \a in errcode_ret:
|
||||
* - CL_INVALID_CONTEXT if context is not a valid.
|
||||
* - CL_INVALID_DEVICE if device is not a valid device or is not associated
|
||||
* with context
|
||||
* - CL_INVALID_VALUE if values specified in properties are not valid.
|
||||
* - CL_INVALID_QUEUE_PROPERTIES if values specified in properties are valid
|
||||
* but are not supported by the device.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
|
||||
* required by the runtime.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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_;
|
||||
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;
|
||||
case CL_QUEUE_SIZE: // Unimplemented
|
||||
queueSize = p->value.size;
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_QUEUE_PROPERTIES;
|
||||
LogWarning("invalid property name");
|
||||
return (cl_command_queue) 0;
|
||||
}
|
||||
++p;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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 retunr it
|
||||
if (NULL != queue) {
|
||||
queue->retain();
|
||||
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);
|
||||
}
|
||||
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_EXIT
|
||||
|
||||
/*! \brief Increment the \a command_queue reference count.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_COMMAND_QUEUE if \a command_queue is not a valid
|
||||
* command-queue.
|
||||
*
|
||||
* clCreateCommandQueue performs an implicit retain. This is very helpful for
|
||||
* 3rd party libraries, which typically get a command-queue passed to them
|
||||
* by the application. However, it is possible that the application may delete
|
||||
* the command-queue without informing the library. Allowing functions to
|
||||
* attach to (i.e. retain) and release a command-queue solves the problem of a
|
||||
* command-queue being used by a library no longer being valid.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Decrement the \a command_queue reference count.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_COMMAND_QUEUE if \a command_queue is not a valid
|
||||
* command-queue.
|
||||
*
|
||||
* After the command_queue reference count becomes zero and all commands queued
|
||||
* to \a command_queue have finished (eg. kernel executions, memory object
|
||||
* updates etc.), the command-queue is deleted.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Query information about a command-queue.
|
||||
*
|
||||
* \param command_queue specifies the command-queue being queried.
|
||||
*
|
||||
* \param param_name specifies the information to query.
|
||||
*
|
||||
* \param param_value is a pointer to memory where the appropriate result
|
||||
* being queried is returned. If \a param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size is used to specify the size in bytes of memory
|
||||
* pointed to by \a param_value. This size must be >= size of return type.
|
||||
* If param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data being
|
||||
* queried by \a param_value. If \a param_value_size_ret is NULL,
|
||||
* it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_COMMAND_QUEUE if \a command_queue is not a valid
|
||||
* command-queue.
|
||||
* - CL_INVALID_VALUE if \a param_name is not one of the supported
|
||||
* values or if size in bytes specified by \a param_value_size is < size of
|
||||
* return type and \a param_value is not a NULL value.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Enable or disable the properties of a command-queue.
|
||||
*
|
||||
* \param command_queue specifies the command-queue being queried.
|
||||
*
|
||||
* \param properties specifies the new command-queue properties to be applied
|
||||
* to \a command_queue .
|
||||
*
|
||||
* \param enable determines whether the values specified by properties are
|
||||
* enabled (if enable is CL_TRUE) or disabled (if enable is CL_FALSE) for the
|
||||
* command-queue .
|
||||
*
|
||||
* \param old_properties returns the command-queue properties before they were
|
||||
* changed by clSetCommandQueueProperty. If \a old_properties is NULL,
|
||||
* it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the command-queue properties are successfully updated.
|
||||
* - CL_INVALID_COMMAND_QUEUE if command_queue is not a valid command-queue.
|
||||
* - CL_INVALID_VALUE if the values specified in properties are not valid.
|
||||
* - CL_INVALID_QUEUE_PROPERTIES if values specified in properties are
|
||||
* not supported by the device.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
*not_null(old_properties)
|
||||
= as_amd(command_queue)->properties().value_;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
return success ? CL_SUCCESS : CL_INVALID_QUEUE_PROPERTIES;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,402 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef CL_COMMON_HPP_
|
||||
#define CL_COMMON_HPP_
|
||||
|
||||
#include "top.hpp"
|
||||
#include "platform/runtime.hpp"
|
||||
#include "platform/command.hpp"
|
||||
#include "platform/memory.hpp"
|
||||
#include "platform/video_session.hpp"
|
||||
#include "thread/thread.hpp"
|
||||
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
|
||||
//! \cond ignore
|
||||
namespace amd {
|
||||
|
||||
template <typename T>
|
||||
class NotNullWrapper
|
||||
{
|
||||
private:
|
||||
T* const ptrOrNull_;
|
||||
|
||||
protected:
|
||||
explicit NotNullWrapper(T* ptrOrNull)
|
||||
: ptrOrNull_(ptrOrNull)
|
||||
{ }
|
||||
|
||||
public:
|
||||
void operator = (T value) const
|
||||
{
|
||||
if (ptrOrNull_ != NULL) {
|
||||
*ptrOrNull_ = value;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class NotNullReference : protected NotNullWrapper<T>
|
||||
{
|
||||
public:
|
||||
explicit NotNullReference(T* ptrOrNull)
|
||||
: NotNullWrapper<T>(ptrOrNull)
|
||||
{ }
|
||||
|
||||
const NotNullWrapper<T>& operator * () const { return *this; }
|
||||
};
|
||||
|
||||
} // namespace amd
|
||||
|
||||
template <typename T>
|
||||
inline amd::NotNullReference<T>
|
||||
not_null(T* ptrOrNull)
|
||||
{
|
||||
return amd::NotNullReference<T>(ptrOrNull);
|
||||
}
|
||||
|
||||
#define CL_CHECK_THREAD(thread) \
|
||||
(thread != NULL || ((thread = new amd::HostThread()) != NULL \
|
||||
&& thread == amd::Thread::current()))
|
||||
|
||||
#define RUNTIME_ENTRY_RET(ret, func, args) \
|
||||
CL_API_ENTRY ret CL_API_CALL \
|
||||
func args \
|
||||
{ \
|
||||
amd::Thread* thread = amd::Thread::current(); \
|
||||
if (!CL_CHECK_THREAD(thread)) { \
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY; \
|
||||
return (ret) 0; \
|
||||
}
|
||||
|
||||
#define RUNTIME_ENTRY_RET_NOERRCODE(ret, func, args) \
|
||||
CL_API_ENTRY ret CL_API_CALL \
|
||||
func args \
|
||||
{ \
|
||||
amd::Thread* thread = amd::Thread::current(); \
|
||||
if (!CL_CHECK_THREAD(thread)) { \
|
||||
return (ret) 0; \
|
||||
}
|
||||
|
||||
#define RUNTIME_ENTRY(ret, func, args) \
|
||||
CL_API_ENTRY ret CL_API_CALL \
|
||||
func args \
|
||||
{ \
|
||||
amd::Thread* thread = amd::Thread::current(); \
|
||||
if (!CL_CHECK_THREAD(thread)) { \
|
||||
return CL_OUT_OF_HOST_MEMORY; \
|
||||
}
|
||||
|
||||
#define RUNTIME_ENTRY_VOID(ret, func, args) \
|
||||
CL_API_ENTRY ret CL_API_CALL \
|
||||
func args \
|
||||
{ \
|
||||
amd::Thread* thread = amd::Thread::current(); \
|
||||
if (!CL_CHECK_THREAD(thread)) { \
|
||||
return; \
|
||||
}
|
||||
|
||||
#define RUNTIME_EXIT \
|
||||
/* FIXME_lmoriche: we should check to thread->lastError here! */ \
|
||||
}
|
||||
|
||||
//! Helper function to check "properties" parameter in various functions
|
||||
int checkContextProperties(
|
||||
const cl_context_properties *properties,
|
||||
bool* offlineDevices);
|
||||
|
||||
namespace amd {
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename T>
|
||||
struct ParamInfo
|
||||
{
|
||||
static inline std::pair<const void*, size_t> get(const T& param) {
|
||||
return std::pair<const void*, size_t>(¶m, sizeof(T));
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ParamInfo<const char*>
|
||||
{
|
||||
static inline std::pair<const void*, size_t> get(const char* param) {
|
||||
return std::pair<const void*, size_t>(param, strlen(param) + 1);
|
||||
}
|
||||
};
|
||||
|
||||
template <int N>
|
||||
struct ParamInfo<char[N]>
|
||||
{
|
||||
static inline std::pair<const void*, size_t> get(const char* param) {
|
||||
return std::pair<const void*, size_t>(param, strlen(param) + 1);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace detail
|
||||
|
||||
template <typename T>
|
||||
static inline cl_int
|
||||
clGetInfo(
|
||||
T& field,
|
||||
size_t param_value_size,
|
||||
void* param_value,
|
||||
size_t* param_value_size_ret)
|
||||
{
|
||||
const void *valuePtr;
|
||||
size_t valueSize;
|
||||
|
||||
std::tie(valuePtr, valueSize)
|
||||
= detail::ParamInfo<typename std::remove_const<T>::type>::get(field);
|
||||
|
||||
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, valuePtr, valueSize);
|
||||
if (param_value_size > valueSize) {
|
||||
::memset(static_cast<address>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
static inline cl_int
|
||||
clSetEventWaitList(
|
||||
Command::EventWaitList& eventWaitList,
|
||||
const Context& context,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list)
|
||||
{
|
||||
if ((num_events_in_wait_list == 0 && event_wait_list != NULL)
|
||||
|| (num_events_in_wait_list != 0 && event_wait_list == NULL)) {
|
||||
return CL_INVALID_EVENT_WAIT_LIST;
|
||||
}
|
||||
|
||||
while (num_events_in_wait_list-- > 0) {
|
||||
cl_event event = *event_wait_list++;
|
||||
Event* amdEvent = as_amd(event);
|
||||
if (!is_valid(event)) {
|
||||
return CL_INVALID_EVENT_WAIT_LIST;
|
||||
}
|
||||
if (&context != &amdEvent->context()) {
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
eventWaitList.push_back(amdEvent);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
//! Common function declarations for CL-external graphics API interop
|
||||
cl_int clEnqueueAcquireExtObjectsAMD(cl_command_queue command_queue,
|
||||
cl_uint num_objects, const cl_mem* mem_objects,
|
||||
cl_uint num_events_in_wait_list, const cl_event* event_wait_list,
|
||||
cl_event* event, cl_command_type cmd_type);
|
||||
cl_int clEnqueueReleaseExtObjectsAMD(cl_command_queue command_queue,
|
||||
cl_uint num_objects, const cl_mem* mem_objects,
|
||||
cl_uint num_events_in_wait_list, const cl_event* event_wait_list,
|
||||
cl_event* event, cl_command_type cmd_type);
|
||||
|
||||
// This may need moving somewhere tidier...
|
||||
|
||||
struct PlatformIDS { const struct KHRicdVendorDispatchRec* dispatch_; };
|
||||
class PlatformID {
|
||||
public:
|
||||
static PlatformIDS Platform;
|
||||
};
|
||||
#define AMD_PLATFORM (reinterpret_cast<cl_platform_id>(&amd::PlatformID::Platform))
|
||||
|
||||
#if cl_amd_open_video
|
||||
cl_int clEnqueueVideoDecodeAMD(
|
||||
VideoSession& session,
|
||||
cl_video_decode_data_amd* video_data,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list,
|
||||
cl_event* event);
|
||||
|
||||
cl_int clEnqueueVideoEncodeAMD(
|
||||
VideoSession& session,
|
||||
cl_video_encode_data_amd* video_data,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list,
|
||||
cl_event* event);
|
||||
|
||||
#endif // cl_amd_open_video
|
||||
|
||||
} // namespace amd
|
||||
|
||||
extern "C" {
|
||||
|
||||
#ifdef cl_ext_device_fission
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clCreateSubDevicesEXT(
|
||||
cl_device_id in_device,
|
||||
const cl_device_partition_property_ext * partition_properties,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * out_devices,
|
||||
cl_uint * num_devices);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clRetainDeviceEXT(cl_device_id device);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clReleaseDeviceEXT(cl_device_id device);
|
||||
|
||||
#else // cl_ext_device_fission
|
||||
|
||||
#define clCreateSubDevicesEXT ((void (*)(void))0)
|
||||
#define clRetainDeviceEXT ((void (*)(void))0)
|
||||
#define clReleaseDeviceEXT ((void (*)(void))0)
|
||||
|
||||
#endif // cl_ext_device_fission
|
||||
|
||||
extern CL_API_ENTRY cl_key_amd CL_API_CALL
|
||||
clCreateKeyAMD(
|
||||
cl_platform_id platform,
|
||||
void (CL_CALLBACK * destructor)( void * ),
|
||||
cl_int * errcode_ret);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clObjectGetValueForKeyAMD(
|
||||
void * object,
|
||||
cl_key_amd key,
|
||||
void ** ret_val);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clObjectSetValueForKeyAMD(
|
||||
void * object,
|
||||
cl_key_amd key,
|
||||
void * value);
|
||||
|
||||
#if defined(CL_VERSION_1_1)
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clSetCommandQueueProperty(
|
||||
cl_command_queue command_queue,
|
||||
cl_command_queue_properties properties,
|
||||
cl_bool enable,
|
||||
cl_command_queue_properties *old_properties) CL_API_SUFFIX__VERSION_1_0;
|
||||
#endif // CL_VERSION_1_1
|
||||
|
||||
#if cl_amd_open_video
|
||||
extern CL_API_ENTRY cl_video_session_amd CL_API_CALL
|
||||
clCreateVideoSessionAMD(
|
||||
cl_context context,
|
||||
cl_device_id device,
|
||||
cl_video_session_flags_amd flags,
|
||||
cl_video_config_type_amd config_buffer_type,
|
||||
cl_uint config_buffer_size,
|
||||
void* config_buffer,
|
||||
cl_int* errcode_ret);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clRetainVideoSessionAMD(
|
||||
cl_video_session_amd video_session);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clReleaseVideoSessionAMD(
|
||||
cl_video_session_amd video_session);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetVideoSessionInfoAMD(
|
||||
cl_video_session_amd video_session,
|
||||
cl_video_session_info_amd param_name,
|
||||
size_t param_value_size,
|
||||
void* param_value,
|
||||
size_t* param_value_size_ret);
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_video_session_amd CL_API_CALL
|
||||
clCreateVideoEncSessionAMD(
|
||||
cl_context context,
|
||||
cl_device_id device,
|
||||
cl_video_session_flags_amd flags,
|
||||
cl_video_config_type_amd config_buffer_type,
|
||||
cl_uint config_buffer_size,
|
||||
void* config_buffer,
|
||||
cl_int* errcode_ret);
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clDestroyVideoEncSessionAMD(
|
||||
cl_video_session_amd video_session);
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetVideoSessionEncInfoAMD(
|
||||
cl_video_session_amd video_session,
|
||||
cl_video_session_enc_info_amd param_name,
|
||||
size_t param_value_size,
|
||||
void* param_value,
|
||||
size_t* param_value_size_ret);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clSendEncodeConfigInfoAMD(
|
||||
cl_video_session_amd video_session,
|
||||
size_t numBuffers,
|
||||
void* pConfigBuffers);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueRunVideoProgramAMD(
|
||||
cl_video_session_amd video_session,
|
||||
void* video_data_struct,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list,
|
||||
cl_event* event);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEncodeGetDeviceCapAMD(
|
||||
cl_device_id device_id,
|
||||
cl_uint encode_mode,
|
||||
cl_uint encode_cap_total_size,
|
||||
cl_uint* num_encode_cap,
|
||||
void* pEncodeCAP);
|
||||
|
||||
#if 1
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEncodePictureAMD(
|
||||
cl_video_session_amd video_session,
|
||||
cl_uint number_of_encode_task_input_buffers,
|
||||
void* encode_task_input_buffer_list,
|
||||
void* picture_parameter,
|
||||
cl_uint* pTaskID);
|
||||
#endif
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEncodeQueryTaskDescriptionAMD(
|
||||
cl_video_session_amd session,
|
||||
cl_uint num_of_task_description_request,
|
||||
cl_uint* num_of_task_description_return,
|
||||
void * task_description_list);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEncodeReleaseOutputResourceAMD(
|
||||
cl_video_session_amd session,
|
||||
cl_uint task_id);
|
||||
|
||||
#endif // cl_amd_open_video
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clConvertImageAMD(
|
||||
cl_context context,
|
||||
cl_mem image,
|
||||
const cl_image_format * image_format,
|
||||
cl_int * errcode_ret);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateBufferFromImageAMD(
|
||||
cl_context context,
|
||||
cl_mem image,
|
||||
cl_int * errcode_ret);
|
||||
|
||||
} // extern "C"
|
||||
|
||||
//! \endcond
|
||||
|
||||
#endif /*CL_COMMON_HPP_*/
|
||||
@@ -0,0 +1,612 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
|
||||
#include "platform/context.hpp"
|
||||
#include "device/device.hpp"
|
||||
#include "platform/runtime.hpp"
|
||||
#include "platform/agent.hpp"
|
||||
#ifdef _WIN32
|
||||
#include <d3d10_1.h>
|
||||
#include "CL/cl_d3d10.h"
|
||||
#include "CL/cl_d3d11.h"
|
||||
#include "cl_d3d9_amd.hpp"
|
||||
#include "cl_d3d10_amd.hpp"
|
||||
#include "cl_d3d11_amd.hpp"
|
||||
#endif // _WIN32
|
||||
#include "cl_kernel_info_amd.h"
|
||||
#include "cl_profile_amd.h"
|
||||
#include "cl_platform_amd.h"
|
||||
#include "cl_sdi_amd.h"
|
||||
#include "cl_thread_trace_amd.h"
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glext.h>
|
||||
#include "CL/cl_gl.h"
|
||||
|
||||
#ifndef WITH_GPU_DEVICE
|
||||
# undef cl_amd_open_video
|
||||
#endif // WITH_GPU_DEVICE
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup CL_Contexts
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief Create an OpenCL context.
|
||||
*
|
||||
* An OpenCL context is created with one or more devices. Contexts are used by
|
||||
* the OpenCL runtime for managing objects such as command-queues, memory,
|
||||
* program and kernel objects and for executing kernels on one or more devices
|
||||
* specified in the context.
|
||||
*
|
||||
* \param properties is reserved and must be zero.
|
||||
*
|
||||
* \param num_devices is the number of devices specified in the \a devices
|
||||
* argument.
|
||||
*
|
||||
* \param devices is a pointer to a list of unique devices returned by
|
||||
* clGetDevices. If more than one device is specified in devices,
|
||||
* a selection criteria may be applied to determine if the list of devices
|
||||
* specified can be used together to create a context.
|
||||
*
|
||||
* \param pfn_notify is a callback function that can be registered by the
|
||||
* application. This callback function will be used by the runtime to report
|
||||
* information on errors that occur in this context. This callback function
|
||||
* may be called asynchronously by the runtime. If \a pfn_notify is NULL,
|
||||
* no callback function is registered.
|
||||
*
|
||||
* \param user_data will be passed as the user_data argument when \a pfn_notify
|
||||
* is called. \a user_data can be NULL.
|
||||
*
|
||||
* \param errcode_ret will return an appropriate error code. If \a errcode_ret
|
||||
* is NULL, no error code is returned.
|
||||
*
|
||||
* \return A valid non-zero context and errcode_ret is set to CL_SUCCESS
|
||||
* if the context is created successfully or NULL with the following
|
||||
* error values stored in \a errcode_ret:
|
||||
* - CL_INVALID_VALUE if \a properties is not zero.
|
||||
* - CL_INVALID_VALUE if \a devices is NULL.
|
||||
* - CL_INVALID_VALUE if \a num_devices is equal to zero.
|
||||
* - CL_INVALID_DEVICE if \a devices contains an invalid device.
|
||||
* - CL_INVALID_DEVICE_LIST if more than one device is specified in
|
||||
* \a devices and the list of devices specified cannot be used together
|
||||
* to create a context.
|
||||
* - CL_DEVICE_NOT_AVAILABLE if a device in \a devices is currently not
|
||||
* available even though the device was returned by clGetDevices.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
|
||||
* required by the runtime.
|
||||
*
|
||||
* \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;
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Create an OpenCL context from a device type that identifies the
|
||||
* specific device(s) to use.
|
||||
*
|
||||
* \param properties is reserved and must be zero.
|
||||
*
|
||||
* \param device_type is a bit-field that identifies the type of device.
|
||||
*
|
||||
* \param pfn_notify described in clCreateContext.
|
||||
*
|
||||
* \param user_data described in clCreateContext.
|
||||
*
|
||||
* \param errcode_ret will return an appropriate error code. If \a errcode_ret
|
||||
* is NULL, no error code is returned.
|
||||
*
|
||||
* \return A valid non-zero context and errcode_ret is set to CL_SUCCESS
|
||||
* if the context is created successfully or NULL with the following error
|
||||
* values stored in errcode_ret:
|
||||
* - CL_INVALID_VALUE if \a properties is not zero.
|
||||
* - CL_INVALID_DEVICE_TYPE if \a device_type is not a valid value.
|
||||
* - CL_DEVICE_NOT_AVAILABLE if no devices that match \a device_type
|
||||
* are currently available.
|
||||
* - CL_DEVICE_NOT_FOUND if no devices that match \a device_type were found.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
|
||||
* required by the runtime.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
if (device_type & CL_HSA_ENABLED_AMD &&
|
||||
device_type & CL_HSA_DISABLED_AMD) {
|
||||
device_type ^= (CL_HSA_ENABLED_AMD | CL_HSA_DISABLED_AMD);
|
||||
}
|
||||
|
||||
// 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));
|
||||
|
||||
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);
|
||||
|
||||
return context;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Increment the context reference count.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_INVALID_CONTEXT if context is not a valid OpenCL context.
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
*
|
||||
* clCreateContext and clCreateContextFromType perform an implicit retain.
|
||||
* This is very helpful for 3rd party libraries, which typically get a context
|
||||
* passed to them by the application.
|
||||
* However, it is possible that the application may delete the context without
|
||||
* informing the library. Allowing functions to attach to (i.e. retain) and
|
||||
* release a context solves the problem of a context being used by a library
|
||||
* no longer being valid.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Decrement the context reference count.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_INVALID_CONTEXT if context is not a valid OpenCL context.
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
*
|
||||
* After the context reference count becomes zero and all the objects attached
|
||||
* to context (such as memory objects, command-queues) are released,
|
||||
* the context is deleted.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Query information about a context.
|
||||
*
|
||||
* \param context specifies the OpenCL context being queried.
|
||||
*
|
||||
* \param param_name is an enum that specifies the information to query.
|
||||
*
|
||||
* \param param_value is a pointer to memory where the appropriate result being
|
||||
* queried is returned. If \a param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size specifies the size in bytes of memory pointed to by
|
||||
* \a param_value. This size must be greater than or equal to the size of
|
||||
* return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data being
|
||||
* queried by \a param_value. If \a param_value_size_ret is NULL,
|
||||
* it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_INVALID_CONTEXT if context is not a valid context.
|
||||
* - CL_INVALID_VALUE if \a param_name is not one of the supported values
|
||||
* or if size in bytes specified by \a param_value_size is < size of return
|
||||
* type and \a param_value is not a NULL value.
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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*);
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_CONTEXT_PROPERTIES: {
|
||||
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;
|
||||
}
|
||||
#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_);
|
||||
}
|
||||
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;
|
||||
}
|
||||
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_);
|
||||
}
|
||||
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;
|
||||
}
|
||||
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_);
|
||||
}
|
||||
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_);
|
||||
}
|
||||
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_);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
#endif //_WIN32
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief returns the address of the extension function named by
|
||||
* funcname for a given platform. The pointer returned should be cast
|
||||
* to a function pointer type matching the extension function’s definition
|
||||
* defined in the appropriate extension specification and header file.
|
||||
* A return value of NULL indicates that the specified function does not
|
||||
* exist for the implementation or platform is not a valid platform.
|
||||
* A non-NULL return value for \a clGetExtensionFunctionAddressForPlatform
|
||||
* does not guarantee that an extension function is actually supported by
|
||||
* the platform. The application must also make a corresponding query using
|
||||
* \a clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, ... ) or
|
||||
* \a clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, ... ) to determine if
|
||||
* an extension is supported by the OpenCL implementation.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
#ifdef _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
|
||||
#if cl_amd_open_video
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateVideoSessionAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateVideoEncSessionAMD);
|
||||
#endif // cl_amd_open_video
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateKeyAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clConvertImageAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clCreateBufferFromImageAMD);
|
||||
break;
|
||||
case 'D':
|
||||
#if cl_amd_open_video
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clDestroyVideoEncSessionAMD);
|
||||
#endif // cl_amd_open_video
|
||||
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);
|
||||
#ifdef _WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueAcquireD3D10ObjectsKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReleaseD3D10ObjectsKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueAcquireDX9MediaSurfacesKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueReleaseDX9MediaSurfacesKHR);
|
||||
#endif //_WIN32
|
||||
#if cl_amd_open_video
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueRunVideoProgramAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEncodeGetDeviceCapAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEncodePictureAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEncodeQueryTaskDescriptionAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEncodeReleaseOutputResourceAMD);
|
||||
#endif // cl_amd_open_video
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueWaitSignalAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueWriteSignalAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clEnqueueMakeBuffersResidentAMD);
|
||||
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);
|
||||
#if cl_amd_open_video
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetVideoSessionInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetVideoSessionEncInfoAMD);
|
||||
#endif // cl_amd_open_video
|
||||
#ifdef _WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetDeviceIDsFromD3D10KHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetDeviceIDsFromDX9MediaAdapterKHR);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetPlaneFromImageAMD);
|
||||
#endif //_WIN32
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clGetKernelSubGroupInfoKHR);
|
||||
break;
|
||||
case 'I':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clIcdGetPlatformIDsKHR);
|
||||
break;
|
||||
case 'O':
|
||||
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);
|
||||
#ifdef cl_ext_device_fission
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainDeviceEXT);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleaseDeviceEXT);
|
||||
#endif // cl_ext_device_fission
|
||||
#if cl_amd_open_video
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clRetainVideoSessionAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clReleaseVideoSessionAMD);
|
||||
#endif // cl_amd_open_video
|
||||
break;
|
||||
case 'S':
|
||||
#if cl_amd_open_video
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clSendEncodeConfigInfoAMD);
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clSetThreadTraceParamAMD);
|
||||
#endif // cl_amd_open_video
|
||||
break;
|
||||
case 'U':
|
||||
CL_EXTENSION_ENTRYPOINT_CHECK(clUnloadPlatformAMD);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clTerminateContextKHR, (cl_context context))
|
||||
{
|
||||
return CL_INVALID_CONTEXT;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,130 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
#include <CL/cl_ext.h>
|
||||
|
||||
#include "platform/object.hpp"
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/command.hpp"
|
||||
#include "platform/counter.hpp"
|
||||
|
||||
#ifdef cl_amd_atomic_counters
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
* \addtogroup CL_Counters
|
||||
*
|
||||
* Counter objects ...
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Increment the counter reference count.
|
||||
*
|
||||
* \return CL_SUCCESS if the function is executed successfully. It returns
|
||||
* CL_INVALID_COUNTER if \a counter is not a valid counter object.
|
||||
*
|
||||
* The OpenCL commands that return a counter perform an implicit retain.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Decrement the counter reference count.
|
||||
*
|
||||
* \return CL_SUCCESS if the function is executed successfully. It returns
|
||||
* CL_INVALID_EVENT if \a counter is not a valid counter object.
|
||||
*
|
||||
* The counter object is deleted once the reference count becomes zero.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif // cl_amd_atomic_counters
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,391 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef CL_D3D10_AMD_HPP_
|
||||
#define CL_D3D10_AMD_HPP_
|
||||
|
||||
#include "CL/cl_d3d10.h"
|
||||
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/memory.hpp"
|
||||
|
||||
#include <utility>
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetDeviceIDsFromD3D10KHR(
|
||||
cl_platform_id /*platform*/,
|
||||
cl_d3d10_device_source_khr /*d3d_device_source*/,
|
||||
void * /*d3d_object*/,
|
||||
cl_d3d10_device_set_khr /*d3d_device_set*/,
|
||||
cl_uint /*num_entries*/,
|
||||
cl_device_id * /*devices*/,
|
||||
cl_uint * /*num_devices*/);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromD3D10BufferKHR(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
ID3D10Buffer * /* buffer */,
|
||||
cl_int * /* errcode_ret */);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromD3D10Texture2DKHR(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
ID3D10Texture2D * /* resource */,
|
||||
UINT /* subresource */,
|
||||
cl_int * /* errcode_ret */);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromD3D10Texture3DKHR(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
ID3D10Texture3D * /* resource */,
|
||||
UINT /* subresource */,
|
||||
cl_int * /* errcode_ret */);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueAcquireD3D10ObjectsKHR(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueReleaseD3D10ObjectsKHR(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */);
|
||||
|
||||
namespace amd
|
||||
{
|
||||
|
||||
typedef struct
|
||||
{
|
||||
union
|
||||
{
|
||||
UINT ByteWidth;
|
||||
UINT Width;
|
||||
};
|
||||
UINT Height;
|
||||
UINT Depth;
|
||||
} D3D10ObjSize_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
D3D10_USAGE d3d10Usage_;
|
||||
UINT bindFlags_;
|
||||
UINT cpuAccessFlags_;
|
||||
UINT miscFlags_;
|
||||
} D3D10Flags_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
D3D10_RESOURCE_DIMENSION objDim_;
|
||||
D3D10ObjSize_t objSize_;
|
||||
D3D10Flags_t objFlags_;
|
||||
UINT mipLevels_;
|
||||
UINT arraySize_;
|
||||
DXGI_FORMAT dxgiFormat_;
|
||||
DXGI_SAMPLE_DESC dxgiSampleDesc_;
|
||||
} D3D10ObjDesc_t;
|
||||
|
||||
const DXGI_SAMPLE_DESC dxgiSampleDescDefault = {1, 0};
|
||||
|
||||
//! Class D3D10Object keeps all the info about the D3D10 object
|
||||
//! from which the CL object is created
|
||||
class D3D10Object : public InteropObject
|
||||
{
|
||||
private:
|
||||
ID3D10Resource* pD3D10Aux_;
|
||||
|
||||
// @todo: TBD: Do we need to sync data after access
|
||||
// or it'll be done by the D3D driver?
|
||||
cl_int cliChecksum_;
|
||||
bool releaseResources_;
|
||||
|
||||
static bool createSharedResource(D3D10Object& obj);
|
||||
static std::vector<std::pair<void*, UINT>> resources_;
|
||||
//! Global lock.
|
||||
static Monitor resLock_;
|
||||
|
||||
protected:
|
||||
ID3D10Resource* pD3D10Res_;
|
||||
ID3D10Resource* pD3D10ResOrig_;
|
||||
ID3D10Query* pQuery_;
|
||||
D3D10ObjDesc_t objDesc_;
|
||||
D3D10ObjDesc_t objDescOrig_;
|
||||
UINT subRes_;
|
||||
|
||||
public:
|
||||
// Default constructor
|
||||
D3D10Object()
|
||||
:pD3D10Aux_(NULL)
|
||||
,cliChecksum_(0)
|
||||
,releaseResources_(false)
|
||||
,pD3D10Res_(NULL)
|
||||
,pD3D10ResOrig_(NULL)
|
||||
,pQuery_(NULL)
|
||||
,subRes_(0)
|
||||
{
|
||||
memset(&objDesc_,0,sizeof(objDesc_));
|
||||
memset(&objDescOrig_,0,sizeof(objDescOrig_));
|
||||
}
|
||||
// Copy constructor
|
||||
D3D10Object(D3D10Object& d3d10obj)
|
||||
: pQuery_(NULL)
|
||||
{
|
||||
*this = d3d10obj;
|
||||
this->releaseResources_ = true;
|
||||
// Add reference to the D3D10 resource to prevent its disappearance
|
||||
if(pD3D10ResOrig_) {
|
||||
pD3D10ResOrig_->AddRef();
|
||||
}
|
||||
else if(pD3D10Res_) {
|
||||
pD3D10Res_->AddRef();
|
||||
}
|
||||
}
|
||||
|
||||
//! Virtual destructor
|
||||
virtual ~D3D10Object()
|
||||
{
|
||||
ScopedLock sl(resLock_);
|
||||
if(releaseResources_) {
|
||||
// Decrement reference to the D3D10 objects
|
||||
if(pD3D10Res_) pD3D10Res_->Release();
|
||||
if(pD3D10Aux_) pD3D10Aux_->Release();
|
||||
if(pD3D10ResOrig_) pD3D10ResOrig_->Release();
|
||||
if(pQuery_) pQuery_->Release();
|
||||
// Check if this resource has already been used for interop
|
||||
std::vector<std::pair<void*, UINT>>::iterator it;
|
||||
if(resources_.size()) {
|
||||
for(it = resources_.begin(); it != resources_.end(); ++it) {
|
||||
if(((pD3D10ResOrig_ && (*it).first == (void*) pD3D10ResOrig_)
|
||||
|| ((*it).first == (void*) pD3D10Res_))
|
||||
&& (*it).second == subRes_) {
|
||||
resources_.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int initD3D10Object(const Context& amdContext, ID3D10Resource* pRes, UINT subresource,
|
||||
D3D10Object& obj);
|
||||
|
||||
D3D10Object* asD3D10Object() { return this; }
|
||||
|
||||
//! D3D10Object query functions to get D3D10 info from member variables
|
||||
ID3D10Resource* getD3D10Resource() const {return pD3D10Res_;}
|
||||
ID3D10Resource* getD3D10ResOrig() const {return pD3D10ResOrig_;}
|
||||
D3D10_USAGE getUsage() const { return objDesc_.objFlags_.d3d10Usage_; }
|
||||
void setD3D10AuxRes(ID3D10Resource* pAux) {pD3D10Aux_ = pAux;}
|
||||
ID3D10Resource* getD3D10AuxRes() const {return pD3D10Aux_;}
|
||||
ID3D10Query* getQuery() const {return pQuery_;}
|
||||
|
||||
UINT getWidth() const {return objDesc_.objSize_.Width;}
|
||||
UINT getHeight() const {return objDesc_.objSize_.Height;}
|
||||
UINT getDepth() const {return objDesc_.objSize_.Depth;}
|
||||
size_t getElementBytes(DXGI_FORMAT dxgiFomat);
|
||||
size_t getElementBytes() {return getElementBytes(objDesc_.dxgiFormat_);}
|
||||
DXGI_FORMAT getDxgiFormat() {return objDesc_.dxgiFormat_;}
|
||||
UINT getSubresource() const {return subRes_;}
|
||||
const D3D10ObjDesc_t* getObjDesc() const { return &objDesc_; }
|
||||
|
||||
//! Returns bytes per pixel > 0 if conversion successful, 0 otherwise;
|
||||
//! if formats are not compatible, cl format channel
|
||||
//! order and type are set to 0
|
||||
cl_image_format getCLFormatFromDXGI(DXGI_FORMAT dxgiFmt);
|
||||
cl_image_format getCLFormatFromDXGI()
|
||||
{
|
||||
return getCLFormatFromDXGI(objDesc_.dxgiFormat_);
|
||||
}
|
||||
size_t getResourceByteSize();
|
||||
|
||||
// On acquire copy data from original resource to shared resource
|
||||
virtual bool copyOrigToShared();
|
||||
// On release copy data from shared copy to the original resource
|
||||
virtual bool copySharedToOrig();
|
||||
};
|
||||
|
||||
//! Class BufferD3D10 is derived from classes Buffer and D3D10Object
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for D3D10 object
|
||||
class BufferD3D10 : public D3D10Object, public Buffer
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after 'BufferD3D10' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! BufferD3D10 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
BufferD3D10(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D10Object& d3d10obj)
|
||||
: // Call base classes constructors
|
||||
D3D10Object(d3d10obj),
|
||||
Buffer(
|
||||
amdContext,
|
||||
clFlags,
|
||||
d3d10obj.getResourceByteSize())
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~BufferD3D10() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
//! Class Image1DD3D10 is derived from classes Image1D and D3D10Object
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for D3D10 object
|
||||
class Image1DD3D10 : public D3D10Object, public Image
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'Image1DD3D10' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! Image1DD3D10 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
Image1DD3D10(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D10Object& d3d10obj)
|
||||
: // Call base classes constructors
|
||||
D3D10Object(d3d10obj),
|
||||
Image(
|
||||
amdContext,
|
||||
CL_MEM_OBJECT_IMAGE1D,
|
||||
clFlags,
|
||||
getCLFormatFromDXGI(d3d10obj.getDxgiFormat()), //format,
|
||||
d3d10obj.getWidth(),
|
||||
1,
|
||||
1,
|
||||
d3d10obj.getWidth() * d3d10obj.getElementBytes(), //rowPitch),
|
||||
0)
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~Image1DD3D10() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
//! Class Image2DD3D10 is derived from classes Image2D and D3D10Object
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for D3D10 object
|
||||
class Image2DD3D10 : public D3D10Object, public Image
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'Image2DD3D10' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! Image2DD3D10 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
Image2DD3D10(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D10Object& d3d10obj)
|
||||
: // Call base classes constructors
|
||||
D3D10Object(d3d10obj),
|
||||
Image(
|
||||
amdContext,
|
||||
CL_MEM_OBJECT_IMAGE2D,
|
||||
clFlags,
|
||||
getCLFormatFromDXGI(d3d10obj.getDxgiFormat()), //format,
|
||||
d3d10obj.getWidth(),
|
||||
d3d10obj.getHeight(),
|
||||
1,
|
||||
d3d10obj.getWidth() * d3d10obj.getElementBytes(), //rowPitch),
|
||||
0)
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~Image2DD3D10() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
//! Class Image3DD3D10 is derived from classes Image3D and D3D10Object
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for D3D10 object
|
||||
class Image3DD3D10 : public D3D10Object, public Image
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'Image3DD3D10' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! Image2DD3D10 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
Image3DD3D10(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D10Object& d3d10obj)
|
||||
: // Call base classes constructors
|
||||
D3D10Object(d3d10obj),
|
||||
Image(
|
||||
amdContext,
|
||||
CL_MEM_OBJECT_IMAGE3D,
|
||||
clFlags,
|
||||
getCLFormatFromDXGI(d3d10obj.getDxgiFormat()), //format,
|
||||
d3d10obj.getWidth(),
|
||||
d3d10obj.getHeight(),
|
||||
d3d10obj.getDepth(),
|
||||
d3d10obj.getWidth() * d3d10obj.getElementBytes(), //rowPitch),
|
||||
d3d10obj.getWidth() * d3d10obj.getHeight() * d3d10obj.getElementBytes())
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~Image3DD3D10() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
//! Functions for executing the D3D10 related stuff
|
||||
cl_mem clCreateBufferFromD3D10ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Resource* pD3DResource,
|
||||
int* errcode_ret);
|
||||
cl_mem clCreateImage1DFromD3D10ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Resource* pD3DResource,
|
||||
UINT subresource,
|
||||
int* errcode_ret);
|
||||
cl_mem clCreateImage2DFromD3D10ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Resource* pD3DResource,
|
||||
UINT subresource,
|
||||
int* errcode_ret);
|
||||
cl_mem clCreateImage3DFromD3D10ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Resource* pD3DResource,
|
||||
UINT subresource,
|
||||
int* errcode_ret);
|
||||
void SyncD3D10Objects(std::vector<amd::Memory*>& memObjects);
|
||||
} //namespace amd
|
||||
|
||||
#endif //CL_D3D10_AMD_HPP_
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,402 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef CL_D3D11_AMD_HPP_
|
||||
#define CL_D3D11_AMD_HPP_
|
||||
|
||||
#include "CL/cl_d3d11.h"
|
||||
|
||||
#include "cl_d3d10_amd.hpp"
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/memory.hpp"
|
||||
|
||||
#include <utility>
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetDeviceIDsFromD3D11KHR(
|
||||
cl_platform_id /*platform*/,
|
||||
cl_d3d11_device_source_khr /*d3d_device_source*/,
|
||||
void * /*d3d_object*/,
|
||||
cl_d3d11_device_set_khr /*d3d_device_set*/,
|
||||
cl_uint /*num_entries*/,
|
||||
cl_device_id * /*devices*/,
|
||||
cl_uint * /*num_devices*/);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromD3D11BufferKHR(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
ID3D11Buffer * /* buffer */,
|
||||
cl_int * /* errcode_ret */);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromD3D11Texture2DKHR(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
ID3D11Texture2D * /* resource */,
|
||||
UINT /* subresource */,
|
||||
cl_int * /* errcode_ret */);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromD3D11Texture3DKHR(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
ID3D11Texture3D * /* resource */,
|
||||
UINT /* subresource */,
|
||||
cl_int * /* errcode_ret */);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueAcquireD3D11ObjectsKHR(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueReleaseD3D11ObjectsKHR(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clGetPlaneFromImageAMD(
|
||||
cl_context /* context */,
|
||||
cl_mem /* mem */,
|
||||
cl_uint /* plane */,
|
||||
cl_int* /* errcode_ret */);
|
||||
|
||||
namespace amd
|
||||
{
|
||||
|
||||
typedef struct
|
||||
{
|
||||
union
|
||||
{
|
||||
UINT ByteWidth;
|
||||
UINT Width;
|
||||
};
|
||||
UINT Height;
|
||||
UINT Depth;
|
||||
} D3D11ObjSize_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
D3D11_USAGE d3d11Usage_;
|
||||
UINT bindFlags_;
|
||||
UINT cpuAccessFlags_;
|
||||
UINT miscFlags_;
|
||||
UINT structureByteStride_;
|
||||
} D3D11Flags_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
D3D11_RESOURCE_DIMENSION objDim_;
|
||||
D3D11ObjSize_t objSize_;
|
||||
D3D11Flags_t objFlags_;
|
||||
UINT mipLevels_;
|
||||
UINT arraySize_;
|
||||
DXGI_FORMAT dxgiFormat_;
|
||||
DXGI_SAMPLE_DESC dxgiSampleDesc_;
|
||||
} D3D11ObjDesc_t;
|
||||
|
||||
//! Class D3D11Object keeps all the info about the D3D11 object
|
||||
//! from which the CL object is created
|
||||
class D3D11Object : public InteropObject
|
||||
{
|
||||
private:
|
||||
ID3D11Resource* pD3D11Aux_;
|
||||
|
||||
// @todo: TBD: Do we need to sync data after access
|
||||
// or it'll be done by the D3D driver?
|
||||
cl_int cliChecksum_;
|
||||
bool releaseResources_;
|
||||
|
||||
static bool createSharedResource(D3D11Object& obj);
|
||||
static std::vector<std::pair<void*, std::pair<UINT,UINT>>> resources_;
|
||||
protected:
|
||||
//! Global lock.
|
||||
static Monitor resLock_;
|
||||
|
||||
ID3D11Resource* pD3D11Res_;
|
||||
ID3D11Resource* pD3D11ResOrig_;
|
||||
ID3D11Query* pQuery_;
|
||||
D3D11ObjDesc_t objDesc_;
|
||||
UINT subRes_;
|
||||
INT plane_;
|
||||
|
||||
public:
|
||||
// Default constructor
|
||||
D3D11Object()
|
||||
:pD3D11Aux_(NULL)
|
||||
,cliChecksum_(0)
|
||||
,releaseResources_(false)
|
||||
,pD3D11Res_(NULL)
|
||||
,pD3D11ResOrig_(NULL)
|
||||
,pQuery_(NULL)
|
||||
,subRes_(NULL)
|
||||
,plane_(NULL)
|
||||
{
|
||||
memset(&objDesc_,0,sizeof(objDesc_));
|
||||
}
|
||||
// Copy constructor
|
||||
D3D11Object(D3D11Object& d3d11obj)
|
||||
: pQuery_(NULL)
|
||||
{
|
||||
*this = d3d11obj;
|
||||
this->releaseResources_ = true;
|
||||
// Add reference to the D3D11 resource to prevent its disappearance
|
||||
if(pD3D11ResOrig_) {
|
||||
pD3D11ResOrig_->AddRef();
|
||||
}
|
||||
else if(pD3D11Res_) {
|
||||
pD3D11Res_->AddRef();
|
||||
}
|
||||
assert(pD3D11Res_ != pD3D11ResOrig_);
|
||||
}
|
||||
|
||||
//! Virtual destructor
|
||||
virtual ~D3D11Object()
|
||||
{
|
||||
ScopedLock sl(resLock_);
|
||||
if(releaseResources_) {
|
||||
// Decrement reference to the D3D11 objects
|
||||
if(pD3D11Res_) pD3D11Res_->Release();
|
||||
if(pD3D11Aux_) pD3D11Aux_->Release();
|
||||
if(pD3D11ResOrig_) pD3D11ResOrig_->Release();
|
||||
if(pQuery_) pQuery_->Release();
|
||||
// Check if this resource has already been used for interop
|
||||
std::vector<std::pair<void*, std::pair<UINT,UINT>>>::iterator it;
|
||||
if(resources_.size()) {
|
||||
for(it = resources_.begin(); it != resources_.end(); ++it) {
|
||||
if(((pD3D11ResOrig_ && (*it).first == (void*) pD3D11ResOrig_)
|
||||
|| ((*it).first == (void*) pD3D11Res_))
|
||||
&& (*it).second.first == subRes_
|
||||
&& (*it).second.second == plane_) {
|
||||
resources_.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int initD3D11Object(const Context& amdContext, ID3D11Resource* pRes, UINT subresource,
|
||||
D3D11Object& obj, INT plane = -1);
|
||||
|
||||
D3D11Object* asD3D11Object() { return this; }
|
||||
|
||||
//! D3D11Object query functions to get D3D11 info from member variables
|
||||
ID3D11Resource* getD3D11Resource() const {return pD3D11Res_;}
|
||||
ID3D11Resource* getD3D11ResOrig() const {return pD3D11ResOrig_;}
|
||||
D3D11_USAGE getUsage() const { return objDesc_.objFlags_.d3d11Usage_; }
|
||||
void setD3D11AuxRes(ID3D11Resource* pAux) {pD3D11Aux_ = pAux;}
|
||||
ID3D11Resource* getD3D11AuxRes() const {return pD3D11Aux_;}
|
||||
ID3D11Query* getQuery() const {return pQuery_;}
|
||||
Monitor& getResLock() { return resLock_;}
|
||||
UINT getWidth() const {return objDesc_.objSize_.Width;}
|
||||
UINT getHeight() const {return objDesc_.objSize_.Height;}
|
||||
UINT getDepth() const {return objDesc_.objSize_.Depth;}
|
||||
size_t getElementBytes(DXGI_FORMAT dxgiFomat, cl_uint plane);
|
||||
size_t getElementBytes() {return getElementBytes(objDesc_.dxgiFormat_, plane_);}
|
||||
DXGI_FORMAT getDxgiFormat() {return objDesc_.dxgiFormat_;}
|
||||
UINT getSubresource() const {return subRes_;}
|
||||
INT getPlane() const {return plane_;}
|
||||
const D3D11ObjDesc_t* getObjDesc() const { return &objDesc_; }
|
||||
|
||||
cl_uint getMiscFlag(void);
|
||||
//! Returns bytes per pixel > 0 if conversion successful, 0 otherwise;
|
||||
//! if formats are not compatible, cl format channel
|
||||
//! order and type are set to 0
|
||||
cl_image_format getCLFormatFromDXGI(DXGI_FORMAT dxgiFmt, cl_uint plane);
|
||||
cl_image_format getCLFormatFromDXGI()
|
||||
{
|
||||
return getCLFormatFromDXGI(objDesc_.dxgiFormat_, plane_);
|
||||
}
|
||||
size_t getResourceByteSize();
|
||||
|
||||
// On acquire copy data from original resource to shared resource
|
||||
virtual bool copyOrigToShared();
|
||||
// On release copy data from shared copy to the original resource
|
||||
virtual bool copySharedToOrig();
|
||||
};
|
||||
|
||||
//! Class BufferD3D11 is derived from classes Buffer and D3D11Object
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for D3D11 object
|
||||
class BufferD3D11 : public D3D11Object, public Buffer
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'BufferD3D11' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! BufferD3D11 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
BufferD3D11(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D11Object& d3d11obj)
|
||||
: // Call base classes constructors
|
||||
D3D11Object(d3d11obj),
|
||||
Buffer(
|
||||
amdContext,
|
||||
clFlags,
|
||||
d3d11obj.getResourceByteSize())
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~BufferD3D11() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
//! Class Image1DD3D11 is derived from classes Image1D and D3D11Object
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for D3D11 object
|
||||
class Image1DD3D11 : public D3D11Object, public Image
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'Image1DD3D11' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! Image1DD3D11 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
Image1DD3D11(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D11Object& d3d11obj)
|
||||
: // Call base classes constructors
|
||||
D3D11Object(d3d11obj),
|
||||
Image(
|
||||
amdContext,
|
||||
CL_MEM_OBJECT_IMAGE1D,
|
||||
clFlags,
|
||||
getCLFormatFromDXGI(d3d11obj.getDxgiFormat(), d3d11obj.getPlane()), //format,
|
||||
d3d11obj.getWidth(),
|
||||
1,
|
||||
1,
|
||||
d3d11obj.getWidth() * d3d11obj.getElementBytes(), //rowPitch),
|
||||
0)
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~Image1DD3D11() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
//! Class Image2DD3D11 is derived from classes Image2D and D3D11Object
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for D3D11 object
|
||||
class Image2DD3D11 : public Image, public D3D11Object
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'Image2DD3D11' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! Image2DD3D11 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
Image2DD3D11(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D11Object& d3d11obj)
|
||||
: // Call base classes constructors
|
||||
D3D11Object(d3d11obj),
|
||||
Image(
|
||||
amdContext,
|
||||
CL_MEM_OBJECT_IMAGE2D,
|
||||
clFlags,
|
||||
getCLFormatFromDXGI(d3d11obj.getDxgiFormat(), d3d11obj.getPlane()), //format,
|
||||
d3d11obj.getWidth(),
|
||||
d3d11obj.getHeight(),
|
||||
1,
|
||||
d3d11obj.getWidth() * d3d11obj.getElementBytes(), //rowPitch),
|
||||
0)
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~Image2DD3D11() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
//! Class Image3DD3D11 is derived from classes Image3D and D3D11Object
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for D3D11 object
|
||||
class Image3DD3D11 : public D3D11Object, public Image
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'Image3DD3D11' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! Image2DD3D11 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
Image3DD3D11(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D11Object& d3d11obj)
|
||||
: // Call base classes constructors
|
||||
D3D11Object(d3d11obj),
|
||||
Image(
|
||||
amdContext,
|
||||
CL_MEM_OBJECT_IMAGE3D,
|
||||
clFlags,
|
||||
getCLFormatFromDXGI(d3d11obj.getDxgiFormat(), d3d11obj.getPlane()), //format,
|
||||
d3d11obj.getWidth(),
|
||||
d3d11obj.getHeight(),
|
||||
d3d11obj.getDepth(),
|
||||
d3d11obj.getWidth() * d3d11obj.getElementBytes(), //rowPitch),
|
||||
d3d11obj.getWidth() * d3d11obj.getHeight() * d3d11obj.getElementBytes())
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~Image3DD3D11() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
//! Functions for executing the D3D11 related stuff
|
||||
cl_mem clCreateBufferFromD3D11ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Resource* pD3DResource,
|
||||
int* errcode_ret);
|
||||
cl_mem clCreateImage1DFromD3D11ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Resource* pD3DResource,
|
||||
UINT subresource,
|
||||
int* errcode_ret);
|
||||
cl_mem clCreateImage2DFromD3D11ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Resource* pD3DResource,
|
||||
UINT subresource,
|
||||
int* errcode_ret);
|
||||
cl_mem clCreateImage3DFromD3D11ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Resource* pD3DResource,
|
||||
UINT subresource,
|
||||
int* errcode_ret);
|
||||
void SyncD3D11Objects(std::vector<amd::Memory*>& memObjects);
|
||||
} //namespace amd
|
||||
|
||||
#endif //CL_D3D11_AMD_HPP_
|
||||
@@ -0,0 +1,927 @@
|
||||
//
|
||||
// Copyright (c) 2012 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include <d3d9.h>
|
||||
#include "cl_common.hpp"
|
||||
#include "cl_d3d9_amd.hpp"
|
||||
#include "runtime/platform/command.hpp"
|
||||
|
||||
#include <cstring>
|
||||
#include <utility>
|
||||
|
||||
#define D3DFMT_NV_12 static_cast<D3DFORMAT>(MAKEFOURCC('N', 'V', '1', '2'))
|
||||
#define D3DFMT_YV_12 static_cast<D3DFORMAT>(MAKEFOURCC('Y', 'V', '1', '2'))
|
||||
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clGetDeviceIDsFromDX9MediaAdapterKHR, (
|
||||
cl_platform_id platform,
|
||||
cl_uint num_media_adapters,
|
||||
cl_dx9_media_adapter_type_khr * media_adapters_type,
|
||||
void * media_adapters,
|
||||
cl_dx9_media_adapter_set_khr media_adapter_set,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * devices,
|
||||
cl_uint * num_devices))
|
||||
{
|
||||
cl_int errcode;
|
||||
//Accept an array of DX9 devices here as the spec mention of array of num_media_adapters size.
|
||||
IDirect3DDevice9Ex** d3d9_device = static_cast<IDirect3DDevice9Ex**>(media_adapters);
|
||||
cl_device_id* gpu_devices = NULL;
|
||||
cl_uint num_gpu_devices = 0;
|
||||
static const bool VALIDATE_ONLY = true;
|
||||
|
||||
if (platform != NULL && platform != AMD_PLATFORM) {
|
||||
LogWarning("\"platrform\" is not a valid AMD platform");
|
||||
return CL_INVALID_PLATFORM;
|
||||
}
|
||||
//check if input parameter are correct
|
||||
if ( (num_media_adapters == 0)
|
||||
||(media_adapters_type == NULL)
|
||||
||(media_adapters == NULL)
|
||||
||(media_adapter_set != CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR && media_adapter_set != CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR)
|
||||
||(num_entries == 0 && devices != NULL)
|
||||
) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
// Get GPU devices
|
||||
errcode = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_GPU, 0, NULL, &num_gpu_devices);
|
||||
if (errcode != CL_SUCCESS && errcode != CL_DEVICE_NOT_FOUND) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
if (!num_gpu_devices) {
|
||||
*not_null(num_devices) = 0;
|
||||
return CL_DEVICE_NOT_FOUND;
|
||||
}
|
||||
|
||||
switch(media_adapter_set) {
|
||||
case CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR:
|
||||
case CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR: {
|
||||
gpu_devices = new cl_device_id[num_gpu_devices];
|
||||
errcode = clGetDeviceIDs(NULL, CL_DEVICE_TYPE_GPU, num_gpu_devices, gpu_devices, NULL);
|
||||
if (errcode != CL_SUCCESS) {
|
||||
break;
|
||||
}
|
||||
|
||||
std::vector<amd::Device*> compatible_devices;
|
||||
for (cl_uint i = 0; i < num_gpu_devices; ++i) {
|
||||
cl_device_id device = gpu_devices[i];
|
||||
intptr_t context_type;
|
||||
switch (media_adapters_type[i]) {
|
||||
case CL_ADAPTER_D3D9_KHR:
|
||||
context_type = CL_CONTEXT_ADAPTER_D3D9_KHR;
|
||||
break;
|
||||
case CL_ADAPTER_D3D9EX_KHR:
|
||||
context_type = CL_CONTEXT_ADAPTER_D3D9EX_KHR;
|
||||
break;
|
||||
case CL_ADAPTER_DXVA_KHR:
|
||||
context_type = CL_CONTEXT_ADAPTER_DXVA_KHR;
|
||||
break;
|
||||
}
|
||||
|
||||
for (cl_uint j = 0; j < num_media_adapters; ++j) {
|
||||
//Since there can be multiple DX9 adapters passed in the array we need to validate interopability with each.
|
||||
if (is_valid(device) && (media_adapters_type[j] == CL_ADAPTER_D3D9EX_KHR) &&
|
||||
as_amd(device)->bindExternalDevice(context_type,
|
||||
d3d9_device[j], NULL, VALIDATE_ONLY)) {
|
||||
compatible_devices.push_back(as_amd(device));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (compatible_devices.size() == 0) {
|
||||
*not_null(num_devices) = 0;
|
||||
errcode = CL_DEVICE_NOT_FOUND;
|
||||
break;
|
||||
}
|
||||
|
||||
std::vector<amd::Device*>::iterator it = compatible_devices.begin();
|
||||
cl_uint compatible_count = std::min(num_entries, (cl_uint)compatible_devices.size());
|
||||
|
||||
while (compatible_count--) {
|
||||
*devices++ = as_cl(*it++);
|
||||
--num_entries;
|
||||
}
|
||||
while (num_entries--) {
|
||||
*devices++ = (cl_device_id) 0;
|
||||
}
|
||||
|
||||
*not_null(num_devices) = (cl_uint)compatible_devices.size();
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
LogWarning("\"d3d9_device_set\" is invalid");
|
||||
errcode = CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
delete[] gpu_devices;
|
||||
return errcode;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
CL_API_ENTRY cl_mem CL_API_CALL \
|
||||
clCreateFromDX9MediaSurfaceKHR(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
cl_dx9_media_adapter_type_khr adapter_type,
|
||||
void * surface_info,
|
||||
cl_uint plane,
|
||||
cl_int * errcode_ret)
|
||||
{
|
||||
cl_mem clMemObj = NULL;
|
||||
|
||||
cl_dx9_surface_info_khr * cl_surf_info = NULL;
|
||||
|
||||
if(!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
LogWarning("invalid parameter \"context\"");
|
||||
return clMemObj;
|
||||
}
|
||||
|
||||
if(!flags) flags = CL_MEM_READ_WRITE;
|
||||
if(!(((flags & CL_MEM_READ_ONLY) == CL_MEM_READ_ONLY)
|
||||
|| ((flags & CL_MEM_WRITE_ONLY) == CL_MEM_WRITE_ONLY)
|
||||
|| ((flags & CL_MEM_READ_WRITE) == CL_MEM_READ_WRITE))) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid parameter \"flags\"");
|
||||
return clMemObj;
|
||||
}
|
||||
|
||||
if ((adapter_type != CL_ADAPTER_D3D9_KHR)
|
||||
&& (adapter_type != CL_ADAPTER_D3D9EX_KHR)
|
||||
&& (adapter_type != CL_ADAPTER_DXVA_KHR)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
return clMemObj;
|
||||
}
|
||||
|
||||
if (!surface_info) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("parameter \"pD3DResource\" is a NULL pointer");
|
||||
return clMemObj;
|
||||
}
|
||||
|
||||
cl_surf_info = (cl_dx9_surface_info_khr *) surface_info;
|
||||
IDirect3DSurface9 * pD3D9Resource = cl_surf_info->resource;
|
||||
HANDLE shared_handle = cl_surf_info->shared_handle;
|
||||
|
||||
if (!pD3D9Resource) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("parameter \"surface_info\" is a NULL pointer");
|
||||
return clMemObj;
|
||||
}
|
||||
|
||||
D3DSURFACE_DESC Desc;
|
||||
pD3D9Resource->GetDesc(&Desc);
|
||||
|
||||
if ((Desc.Format != D3DFMT_NV_12) && (Desc.Format != D3DFMT_YV_12) &&
|
||||
(plane != 0)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("The plane has to be Zero if the surface format is non-planar !");
|
||||
return clMemObj;
|
||||
}
|
||||
|
||||
// Check for image support
|
||||
const std::vector<amd::Device*>& devices = as_amd(context)->devices();
|
||||
bool supportPass = false;
|
||||
bool sizePass = false;
|
||||
std::vector<amd::Device*>::const_iterator it;
|
||||
for (it = devices.begin(); it != devices.end(); ++it) {
|
||||
if ((*it)->info().imageSupport_) {
|
||||
supportPass = true;
|
||||
}
|
||||
}
|
||||
if (!supportPass) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
LogWarning("there are no devices in context to support images");
|
||||
return (cl_mem) 0;
|
||||
}
|
||||
//Verify the resource is a 2D image
|
||||
return amd::clCreateImage2DFromD3D9ResourceAMD(
|
||||
*as_amd(context),
|
||||
flags,
|
||||
adapter_type,
|
||||
cl_surf_info,
|
||||
plane,
|
||||
errcode_ret);
|
||||
}
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueAcquireDX9MediaSurfacesKHR, (
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event))
|
||||
{
|
||||
return amd::clEnqueueAcquireExtObjectsAMD(command_queue, num_objects,
|
||||
mem_objects, num_events_in_wait_list, event_wait_list, event,
|
||||
CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueReleaseDX9MediaSurfacesKHR, (
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event))
|
||||
{
|
||||
return amd::clEnqueueReleaseExtObjectsAMD(command_queue, num_objects,
|
||||
mem_objects, num_events_in_wait_list, event_wait_list, event,
|
||||
CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
//
|
||||
//
|
||||
// namespace amd
|
||||
//
|
||||
//
|
||||
namespace amd
|
||||
{
|
||||
/*! @}
|
||||
* \addtogroup CL-D3D9 interop helper functions
|
||||
* @{
|
||||
*/
|
||||
//
|
||||
// Class D3D9Object implementation
|
||||
//
|
||||
std::vector<std::pair<TD3D9RESINFO, TD3D9RESINFO>> D3D9Object::resources_;
|
||||
Monitor D3D9Object::resLock_;
|
||||
|
||||
//
|
||||
// clCreateImage2DFromD3D9ResourceAMD
|
||||
//
|
||||
cl_mem clCreateImage2DFromD3D9ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
cl_dx9_media_adapter_type_khr adapter_type,
|
||||
cl_dx9_surface_info_khr* surface_info,
|
||||
cl_uint plane,
|
||||
int* errcode_ret)
|
||||
{
|
||||
cl_dx9_surface_info_khr* cl_surf_info =
|
||||
reinterpret_cast<cl_dx9_surface_info_khr*>(surface_info);
|
||||
IDirect3DSurface9 * pD3D9Resource = cl_surf_info->resource;
|
||||
HANDLE shared_handle = cl_surf_info->shared_handle;
|
||||
|
||||
D3D9Object obj;
|
||||
cl_int errcode = D3D9Object::initD3D9Object(amdContext,
|
||||
adapter_type, surface_info, plane, obj);
|
||||
if (CL_SUCCESS != errcode) {
|
||||
*not_null(errcode_ret) = errcode;
|
||||
return (cl_mem) 0;
|
||||
}
|
||||
|
||||
Image2DD3D9 *pImage2DD3D9 = new (amdContext)
|
||||
Image2DD3D9(amdContext, flags, obj);
|
||||
if (!pImage2DD3D9) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
return (cl_mem) 0;
|
||||
}
|
||||
if (!pImage2DD3D9->create()) {
|
||||
*not_null(errcode_ret) = CL_MEM_OBJECT_ALLOCATION_FAILURE;
|
||||
pImage2DD3D9->release();
|
||||
return (cl_mem) 0;
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl<Memory>(pImage2DD3D9);
|
||||
}
|
||||
|
||||
//
|
||||
// Helper function SyncD3D9Objects
|
||||
//
|
||||
void SyncD3D9Objects(std::vector<amd::Memory*>& memObjects)
|
||||
{
|
||||
Memory*& mem = memObjects.front();
|
||||
if(!mem) {
|
||||
LogWarning("\nNULL memory object\n");
|
||||
return;
|
||||
}
|
||||
InteropObject* interop = mem->getInteropObj();
|
||||
if(!interop) {
|
||||
LogWarning("\nNULL interop object\n");
|
||||
return;
|
||||
}
|
||||
D3D9Object* d3d9Obj = interop->asD3D9Object();
|
||||
if(!d3d9Obj) {
|
||||
LogWarning("\nNULL D3D9 object\n");
|
||||
return;
|
||||
}
|
||||
IDirect3DQuery9* query = d3d9Obj->getQuery();
|
||||
if(!query) {
|
||||
LogWarning("\nNULL IDirect3DQuery9\n");
|
||||
return;
|
||||
}
|
||||
ScopedLock sl(d3d9Obj->getResLock());
|
||||
query->Issue(D3DISSUE_END);
|
||||
BOOL data;
|
||||
while(S_OK != query->GetData(&data, sizeof(BOOL), D3DGETDATA_FLUSH) && data != TRUE)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Class D3D10Object implementation
|
||||
//
|
||||
size_t
|
||||
D3D9Object::getElementBytes(D3DFORMAT d3d9Format, cl_uint plane)
|
||||
{
|
||||
size_t bytesPerPixel;
|
||||
|
||||
switch(d3d9Format) {
|
||||
case D3DFMT_UNKNOWN:
|
||||
case D3DFMT_UYVY:
|
||||
case D3DFMT_YUY2:
|
||||
case D3DFMT_DXT1:
|
||||
case D3DFMT_DXT2:
|
||||
case D3DFMT_DXT3:
|
||||
case D3DFMT_DXT4:
|
||||
case D3DFMT_DXT5:
|
||||
case D3DFMT_VERTEXDATA:
|
||||
case D3DFMT_D32:
|
||||
case D3DFMT_D15S1:
|
||||
case D3DFMT_D24S8:
|
||||
case D3DFMT_D24X8:
|
||||
case D3DFMT_D24X4S4:
|
||||
case D3DFMT_D16:
|
||||
case D3DFMT_INDEX16:
|
||||
case D3DFMT_INDEX32:
|
||||
case D3DFMT_MULTI2_ARGB8:
|
||||
case D3DFMT_CxV8U8:
|
||||
// Less than 1 byte per pixel - needs special consideration
|
||||
bytesPerPixel = 0;
|
||||
break;
|
||||
|
||||
case D3DFMT_R3G3B2:
|
||||
case D3DFMT_P8:
|
||||
case D3DFMT_A8:
|
||||
case D3DFMT_L8:
|
||||
case D3DFMT_A4L4:
|
||||
bytesPerPixel = 1;
|
||||
break;
|
||||
|
||||
case D3DFMT_R16F:
|
||||
case D3DFMT_R5G6B5:
|
||||
case D3DFMT_X1R5G5B5:
|
||||
case D3DFMT_A1R5G5B5:
|
||||
case D3DFMT_A4R4G4B4:
|
||||
case D3DFMT_A8R3G3B2:
|
||||
case D3DFMT_X4R4G4B4:
|
||||
case D3DFMT_A8P8:
|
||||
case D3DFMT_A8L8:
|
||||
case D3DFMT_V8U8:
|
||||
case D3DFMT_L6V5U5:
|
||||
case D3DFMT_D16_LOCKABLE:
|
||||
case D3DFMT_L16:
|
||||
bytesPerPixel = 2;
|
||||
break;
|
||||
|
||||
case D3DFMT_R8G8B8:
|
||||
case D3DFMT_D24FS8:
|
||||
bytesPerPixel = 3;
|
||||
break;
|
||||
|
||||
case D3DFMT_D32F_LOCKABLE:
|
||||
case D3DFMT_A8R8G8B8:
|
||||
case D3DFMT_R32F:
|
||||
case D3DFMT_X8R8G8B8:
|
||||
case D3DFMT_A2B10G10R10:
|
||||
case D3DFMT_A8B8G8R8:
|
||||
case D3DFMT_X8B8G8R8:
|
||||
case D3DFMT_G16R16:
|
||||
case D3DFMT_A2R10G10B10:
|
||||
case D3DFMT_Q8W8V8U8:
|
||||
case D3DFMT_X8L8V8U8:
|
||||
case D3DFMT_V16U16:
|
||||
case D3DFMT_A2W10V10U10:
|
||||
case D3DFMT_R8G8_B8G8:
|
||||
case D3DFMT_G8R8_G8B8:
|
||||
case D3DFMT_G16R16F:
|
||||
bytesPerPixel = 4;
|
||||
break;
|
||||
|
||||
case D3DFMT_G32R32F:
|
||||
case D3DFMT_A16B16G16R16:
|
||||
case D3DFMT_A16B16G16R16F:
|
||||
case D3DFMT_Q16W16V16U16:
|
||||
bytesPerPixel = 8;
|
||||
break;
|
||||
case D3DFMT_A32B32G32R32F:
|
||||
bytesPerPixel = 16;
|
||||
break;
|
||||
//#if !defined(D3D_DISABLE_9EX)
|
||||
//case D3DFMT_D32_LOCKABLE:
|
||||
//case D3DFMT_S8_LOCKABLE:
|
||||
//#endif // !D3D_DISABLE_9EX
|
||||
case D3DFMT_NV_12:
|
||||
if (plane == 0) {
|
||||
bytesPerPixel = 1;
|
||||
}
|
||||
else if(plane == 1) {
|
||||
bytesPerPixel = 2;
|
||||
} //plane != 0 or != 1 shouldn't happen here
|
||||
break;
|
||||
case D3DFMT_YV_12:
|
||||
bytesPerPixel = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
bytesPerPixel = 0;
|
||||
_ASSERT(FALSE);
|
||||
break;
|
||||
}
|
||||
return bytesPerPixel;
|
||||
}
|
||||
|
||||
void setObjDesc(amd::D3D9ObjDesc_t& objDesc, D3DSURFACE_DESC& resDesc, cl_uint plane)
|
||||
{
|
||||
objDesc.d3dPool_ = resDesc.Pool;
|
||||
objDesc.resType_ = resDesc.Type;
|
||||
objDesc.usage_ = resDesc.Usage;
|
||||
objDesc.d3dFormat_ = resDesc.Format;
|
||||
switch (resDesc.Format) {
|
||||
case D3DFMT_NV_12:
|
||||
objDesc.surfRect_.left = 0;
|
||||
objDesc.surfRect_.top = 0;
|
||||
if (plane == 0) {
|
||||
objDesc.objSize_.Height = resDesc.Height;
|
||||
objDesc.objSize_.Width = resDesc.Width;
|
||||
objDesc.surfRect_.right = resDesc.Width; //resDesc.Width/2-1;
|
||||
objDesc.surfRect_.bottom = 3*resDesc.Height/2;; //3*resDesc.Height/2-1;
|
||||
}
|
||||
else if(plane == 1) {
|
||||
objDesc.objSize_.Height = resDesc.Height/2;
|
||||
objDesc.objSize_.Width = resDesc.Width/2;
|
||||
objDesc.surfRect_.right = resDesc.Width; //resDesc.Width/2-1;
|
||||
objDesc.surfRect_.bottom = 3*resDesc.Height/2;; //3*resDesc.Height/2-1;
|
||||
} //plane != 0 or != 1 shouldn't happen here
|
||||
break;
|
||||
case D3DFMT_YV_12:
|
||||
objDesc.surfRect_.left = 0;
|
||||
if (plane == 0) {
|
||||
objDesc.objSize_.Height = resDesc.Height;
|
||||
objDesc.objSize_.Width = resDesc.Width;
|
||||
objDesc.surfRect_.top = 0;
|
||||
objDesc.surfRect_.right = resDesc.Width-1;
|
||||
objDesc.surfRect_.bottom = resDesc.Height-1;
|
||||
}
|
||||
else if(plane == 1) {
|
||||
objDesc.objSize_.Height = resDesc.Height/2;
|
||||
objDesc.objSize_.Width = resDesc.Width/2;
|
||||
objDesc.surfRect_.top = resDesc.Height;
|
||||
objDesc.surfRect_.right = resDesc.Width/2-1;
|
||||
objDesc.surfRect_.bottom = 3*resDesc.Height/2-1;
|
||||
}
|
||||
else if(plane == 2) {
|
||||
objDesc.objSize_.Height = resDesc.Height/2;
|
||||
objDesc.objSize_.Width = resDesc.Width/2;
|
||||
objDesc.surfRect_.top = 3*resDesc.Height/2;
|
||||
objDesc.surfRect_.right = resDesc.Width/2-1;
|
||||
objDesc.surfRect_.bottom = 2*resDesc.Height-1;
|
||||
} //plane > 0 or > 2 shouldn't happen here
|
||||
break;
|
||||
default:
|
||||
objDesc.objSize_.Height = resDesc.Height;
|
||||
objDesc.objSize_.Width = resDesc.Width;
|
||||
objDesc.surfRect_.left = 0;
|
||||
objDesc.surfRect_.top = 0;
|
||||
objDesc.surfRect_.right = resDesc.Width-1;
|
||||
objDesc.surfRect_.bottom = resDesc.Height-1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
D3D9Object::initD3D9Object(const Context& amdContext, cl_dx9_media_adapter_type_khr adapter_type,
|
||||
cl_dx9_surface_info_khr* cl_surf_info,
|
||||
cl_uint plane, D3D9Object& obj)
|
||||
{
|
||||
ScopedLock sl(resLock_);
|
||||
|
||||
IDirect3DDevice9Ex* pDev9Ex = NULL;
|
||||
cl_int errcode = CL_SUCCESS;
|
||||
|
||||
// Check if this ressource has already been used for interop
|
||||
IDirect3DSurface9 * pD3D9res = cl_surf_info->resource;
|
||||
HANDLE shared_handle = cl_surf_info->shared_handle;
|
||||
|
||||
if ((adapter_type == CL_ADAPTER_D3D9_KHR) ||
|
||||
(adapter_type == CL_ADAPTER_DXVA_KHR)) {
|
||||
return CL_INVALID_DX9_MEDIA_ADAPTER_KHR; // Not supported yet
|
||||
}
|
||||
|
||||
std::vector<std::pair<TD3D9RESINFO, TD3D9RESINFO>>::iterator it;
|
||||
for(it = resources_.begin(); it != resources_.end(); ++it) {
|
||||
if((*it).first.surfInfo.resource == cl_surf_info->resource && (*it).first.surfPlane == plane) {
|
||||
return CL_INVALID_D3D9_RESOURCE_KHR;
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT hr;
|
||||
D3DQUERYTYPE desc = D3DQUERYTYPE_EVENT;
|
||||
|
||||
D3DSURFACE_DESC resDesc;
|
||||
if (D3D_OK != pD3D9res->GetDesc(&resDesc)) {
|
||||
return CL_INVALID_D3D9_RESOURCE_KHR;
|
||||
}
|
||||
|
||||
hr = pD3D9res->GetContainer(IID_IDirect3DDevice9Ex, (void**)&pDev9Ex);
|
||||
if (hr == D3D_OK) {
|
||||
pDev9Ex->CreateQuery(desc, &(obj.pQuery_));
|
||||
}
|
||||
else {
|
||||
return CL_INVALID_D3D9_RESOURCE_KHR; // d3d9ex should be supported
|
||||
}
|
||||
|
||||
obj.handleShared_ = shared_handle;
|
||||
obj.surfPlane_ = plane;
|
||||
obj.surfInfo_ = *cl_surf_info;
|
||||
obj.adapterType_ = adapter_type;
|
||||
|
||||
// Init defaults
|
||||
setObjDesc(obj.objDescOrig_, resDesc, plane);
|
||||
obj.objDesc_ = obj.objDescOrig_;
|
||||
|
||||
// shared handle cases if the shared_handle is NULL
|
||||
// first check if the format is NV12 or YV12, which we need special handling
|
||||
if (NULL == shared_handle) {
|
||||
bool found = false;
|
||||
std::vector<std::pair<TD3D9RESINFO, TD3D9RESINFO>>::iterator it;
|
||||
for(it = resources_.begin(); it != resources_.end(); ++it) {
|
||||
if((*it).first.surfInfo.resource == cl_surf_info->resource &&
|
||||
(*it).first.surfPlane != plane) {
|
||||
obj.handleShared_ = (*it).second.surfInfo.shared_handle;
|
||||
obj.pD3D9Res_ = (*it).second.surfInfo.resource;
|
||||
obj.pD3D9Res_->AddRef();
|
||||
obj.objDesc_ = obj.objDescOrig_;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
obj.handleShared_ = 0;
|
||||
hr = pDev9Ex->CreateOffscreenPlainSurface(
|
||||
resDesc.Width,
|
||||
resDesc.Height,
|
||||
resDesc.Format,
|
||||
resDesc.Pool,
|
||||
&obj.pD3D9Res_,
|
||||
&obj.handleShared_);
|
||||
|
||||
if (D3D_OK != hr) {
|
||||
errcode = CL_INVALID_D3D9_RESOURCE_KHR;
|
||||
}
|
||||
}
|
||||
|
||||
// put the original info into the obj
|
||||
obj.pD3D9ResOrig_ = pD3D9res;
|
||||
obj.pD3D9ResOrig_->AddRef(); //addRef in case lost the resource
|
||||
}
|
||||
else {
|
||||
// Share the original resource
|
||||
obj.pD3D9ResOrig_ = NULL;
|
||||
obj.pD3D9Res_ = pD3D9res;
|
||||
obj.pD3D9Res_->AddRef();
|
||||
}
|
||||
|
||||
// Release the Ex interface
|
||||
if (pDev9Ex) pDev9Ex->Release();
|
||||
|
||||
// Check for CL format compatibilty
|
||||
if(obj.objDesc_.resType_ == D3DRTYPE_SURFACE) {
|
||||
cl_image_format clFmt =
|
||||
obj.getCLFormatFromD3D9(obj.objDesc_.d3dFormat_, plane);
|
||||
amd::Image::Format imageFormat(clFmt);
|
||||
if(!imageFormat.isSupported(amdContext)) {
|
||||
return CL_INVALID_IMAGE_FORMAT_DESCRIPTOR;
|
||||
}
|
||||
}
|
||||
|
||||
TD3D9RESINFO d3d9ObjOri = {*cl_surf_info, plane};
|
||||
TD3D9RESINFO d3d9ObjShared = {{obj.pD3D9Res_, obj.handleShared_}, plane};
|
||||
|
||||
if (errcode == CL_SUCCESS) {
|
||||
resources_.push_back(std::make_pair(d3d9ObjOri, d3d9ObjShared));
|
||||
}
|
||||
|
||||
return errcode;
|
||||
}
|
||||
cl_uint
|
||||
D3D9Object::getMiscFlag()
|
||||
{
|
||||
switch (objDescOrig_.d3dFormat_) {
|
||||
case D3DFMT_NV_12:
|
||||
return 1;
|
||||
break;
|
||||
case D3DFMT_YV_12:
|
||||
return 2;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cl_image_format
|
||||
D3D9Object::getCLFormatFromD3D9()
|
||||
{
|
||||
return getCLFormatFromD3D9(objDesc_.d3dFormat_, surfPlane_);
|
||||
}
|
||||
|
||||
cl_image_format
|
||||
D3D9Object::getCLFormatFromD3D9(D3DFORMAT d3d9Fmt, cl_uint plane)
|
||||
{
|
||||
cl_image_format fmt;
|
||||
|
||||
fmt.image_channel_order = 0;//CL_RGBA;
|
||||
fmt.image_channel_data_type = 0;//CL_UNSIGNED_INT8;
|
||||
|
||||
switch(d3d9Fmt)
|
||||
{
|
||||
case D3DFMT_R32F:
|
||||
fmt.image_channel_order = CL_R;
|
||||
fmt.image_channel_data_type = CL_FLOAT;
|
||||
break;
|
||||
|
||||
case D3DFMT_R16F:
|
||||
fmt.image_channel_order = CL_R;
|
||||
fmt.image_channel_data_type = CL_HALF_FLOAT;
|
||||
break;
|
||||
|
||||
case D3DFMT_L16:
|
||||
fmt.image_channel_order = CL_R;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT16;
|
||||
break;
|
||||
|
||||
case D3DFMT_A8:
|
||||
fmt.image_channel_order = CL_A;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
break;
|
||||
|
||||
case D3DFMT_L8:
|
||||
fmt.image_channel_order = CL_R;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
break;
|
||||
|
||||
case D3DFMT_G32R32F:
|
||||
fmt.image_channel_order = CL_RG;
|
||||
fmt.image_channel_data_type = CL_FLOAT;
|
||||
break;
|
||||
|
||||
case D3DFMT_G16R16F:
|
||||
fmt.image_channel_order = CL_RG;
|
||||
fmt.image_channel_data_type = CL_HALF_FLOAT;
|
||||
break;
|
||||
|
||||
case D3DFMT_G16R16:
|
||||
fmt.image_channel_order = CL_RG;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT16;
|
||||
break;
|
||||
|
||||
case D3DFMT_A8L8:
|
||||
fmt.image_channel_order = CL_RG;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
break;
|
||||
|
||||
case D3DFMT_A32B32G32R32F:
|
||||
fmt.image_channel_order = CL_RGBA;
|
||||
fmt.image_channel_data_type = CL_FLOAT;
|
||||
break;
|
||||
|
||||
case D3DFMT_A16B16G16R16F:
|
||||
fmt.image_channel_order = CL_RGBA;
|
||||
fmt.image_channel_data_type = CL_HALF_FLOAT;
|
||||
break;
|
||||
|
||||
case D3DFMT_A16B16G16R16:
|
||||
fmt.image_channel_order = CL_RGBA;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT16;
|
||||
break;
|
||||
|
||||
case D3DFMT_A8B8G8R8:
|
||||
fmt.image_channel_order = CL_RGBA;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
break;
|
||||
|
||||
case D3DFMT_X8B8G8R8:
|
||||
fmt.image_channel_order = CL_RGBA;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
break;
|
||||
|
||||
case D3DFMT_A8R8G8B8:
|
||||
fmt.image_channel_order = CL_BGRA;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
break;
|
||||
|
||||
case D3DFMT_X8R8G8B8:
|
||||
fmt.image_channel_order = CL_BGRA;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
break;
|
||||
case D3DFMT_NV_12:
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
if (plane == 0) {
|
||||
fmt.image_channel_order = CL_R;
|
||||
}
|
||||
else if(plane == 1) {
|
||||
fmt.image_channel_order = CL_RG;
|
||||
}
|
||||
break;
|
||||
case D3DFMT_YV_12:
|
||||
fmt.image_channel_order = CL_R;
|
||||
fmt.image_channel_data_type = CL_UNORM_INT8;
|
||||
break;
|
||||
|
||||
case D3DFMT_UNKNOWN:
|
||||
case D3DFMT_R8G8B8:
|
||||
case D3DFMT_R5G6B5:
|
||||
case D3DFMT_X1R5G5B5:
|
||||
case D3DFMT_A1R5G5B5:
|
||||
case D3DFMT_A4R4G4B4:
|
||||
case D3DFMT_R3G3B2:
|
||||
case D3DFMT_A8R3G3B2:
|
||||
case D3DFMT_X4R4G4B4:
|
||||
case D3DFMT_A2B10G10R10:
|
||||
case D3DFMT_A2R10G10B10:
|
||||
case D3DFMT_A8P8:
|
||||
case D3DFMT_P8:
|
||||
case D3DFMT_A4L4:
|
||||
case D3DFMT_V8U8:
|
||||
case D3DFMT_L6V5U5:
|
||||
case D3DFMT_X8L8V8U8:
|
||||
case D3DFMT_Q8W8V8U8:
|
||||
case D3DFMT_V16U16:
|
||||
case D3DFMT_A2W10V10U10:
|
||||
case D3DFMT_UYVY:
|
||||
case D3DFMT_R8G8_B8G8:
|
||||
case D3DFMT_YUY2:
|
||||
case D3DFMT_G8R8_G8B8:
|
||||
case D3DFMT_DXT1:
|
||||
case D3DFMT_DXT2:
|
||||
case D3DFMT_DXT3:
|
||||
case D3DFMT_DXT4:
|
||||
case D3DFMT_DXT5:
|
||||
case D3DFMT_D16_LOCKABLE:
|
||||
case D3DFMT_D32:
|
||||
case D3DFMT_D15S1:
|
||||
case D3DFMT_D24S8:
|
||||
case D3DFMT_D24X8:
|
||||
case D3DFMT_D24X4S4:
|
||||
case D3DFMT_D16:
|
||||
case D3DFMT_D32F_LOCKABLE:
|
||||
case D3DFMT_D24FS8:
|
||||
//#if !defined(D3D_DISABLE_9EX)
|
||||
case D3DFMT_D32_LOCKABLE:
|
||||
case D3DFMT_S8_LOCKABLE:
|
||||
//#endif // !D3D_DISABLE_9EX
|
||||
case D3DFMT_VERTEXDATA:
|
||||
case D3DFMT_INDEX16:
|
||||
case D3DFMT_INDEX32:
|
||||
case D3DFMT_Q16W16V16U16:
|
||||
case D3DFMT_MULTI2_ARGB8:
|
||||
case D3DFMT_CxV8U8:
|
||||
//#if !defined(D3D_DISABLE_9EX)
|
||||
case D3DFMT_A1:
|
||||
case D3DFMT_A2B10G10R10_XR_BIAS:
|
||||
case D3DFMT_BINARYBUFFER:
|
||||
_ASSERT(FALSE); //NOT SURPPORTED
|
||||
break;
|
||||
//#endif // !D3D_DISABLE_9EX
|
||||
default:
|
||||
_ASSERT(FALSE);
|
||||
break;
|
||||
}
|
||||
|
||||
return fmt;
|
||||
}
|
||||
|
||||
bool
|
||||
D3D9Object::copyOrigToShared()
|
||||
{
|
||||
// Don't copy if there is no orig
|
||||
if (NULL == getD3D9ResOrig()) return true;
|
||||
|
||||
IDirect3DDevice9Ex *d3dDev;
|
||||
HRESULT hr;
|
||||
ScopedLock sl(getResLock());
|
||||
|
||||
IDirect3DSurface9* srcSurf = getD3D9ResOrig();
|
||||
IDirect3DSurface9* dstSurf = getD3D9Resource();
|
||||
|
||||
hr = getD3D9Resource()->GetContainer(IID_IDirect3DDevice9Ex, (void**)&d3dDev);
|
||||
if (hr != D3D_OK || !d3dDev) {
|
||||
LogError("\nCannot get D3D9 device from D3D9 surface\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
hr = d3dDev->StretchRect(srcSurf, NULL, dstSurf, NULL, D3DTEXF_NONE);
|
||||
if (hr != D3D_OK ) {
|
||||
LogError("\ncopy original surface to shared surface failed\n");
|
||||
return false;
|
||||
}
|
||||
// Flush D3D queues and make sure D3D stuff is finished
|
||||
pQuery_->Issue(D3DISSUE_END);
|
||||
BOOL data;
|
||||
while ((D3D_OK != pQuery_->GetData(&data, sizeof(BOOL), D3DGETDATA_FLUSH)) &&
|
||||
(data != TRUE)) {
|
||||
}
|
||||
|
||||
if (d3dDev) d3dDev->Release();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
D3D9Object::copySharedToOrig()
|
||||
{
|
||||
// Don't copy if there is no orig
|
||||
if (NULL == getD3D9ResOrig()) return true;
|
||||
|
||||
IDirect3DDevice9Ex *d3dDev;
|
||||
HRESULT hr;
|
||||
ScopedLock sl(getResLock());
|
||||
|
||||
hr = getD3D9Resource()->GetContainer(IID_IDirect3DDevice9Ex, (void**)&d3dDev);
|
||||
if(hr != D3D_OK || !d3dDev) {
|
||||
LogError("\nCannot get D3D9 device from D3D9 surface\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
hr = d3dDev->StretchRect(getD3D9Resource(), NULL, getD3D9ResOrig(), NULL, D3DTEXF_NONE);
|
||||
if(hr != D3D_OK ) {
|
||||
LogError("\ncopy shared surface to original surface failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (d3dDev) d3dDev->Release();
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
Image2DD3D9::initDeviceMemory()
|
||||
{
|
||||
deviceMemories_ = reinterpret_cast<DeviceMemory*>(
|
||||
reinterpret_cast<char*>(this) + sizeof(Image2DD3D9));
|
||||
memset(deviceMemories_, 0,
|
||||
context_().devices().size() * sizeof(DeviceMemory));
|
||||
}
|
||||
|
||||
bool
|
||||
Image2DD3D9::mapExtObjectInCQThread()
|
||||
{
|
||||
void* pCpuMem = NULL;
|
||||
HRESULT hr;
|
||||
DWORD lockFlags = 0;
|
||||
|
||||
if (getMemFlags() & CL_MEM_READ_WRITE) {
|
||||
lockFlags = 0;
|
||||
}
|
||||
else if (getMemFlags() & CL_MEM_READ_ONLY) {
|
||||
lockFlags = D3DLOCK_READONLY;
|
||||
}
|
||||
else if (getMemFlags() & CL_MEM_WRITE_ONLY) {
|
||||
lockFlags = D3DLOCK_DISCARD;
|
||||
}
|
||||
else {
|
||||
// Should not get here, the flags had been checked before
|
||||
LogError("\nInvalid memrory flags");
|
||||
return false;
|
||||
}
|
||||
ScopedLock sl(getResLock());
|
||||
|
||||
D3DLOCKED_RECT lockedRect;
|
||||
hr = getD3D9Resource()->LockRect(
|
||||
&lockedRect,
|
||||
NULL,
|
||||
lockFlags);
|
||||
if ((hr != D3D_OK) || !lockedRect.pBits) {
|
||||
LogError("Cannot lock D3D9 surface for CPU access");
|
||||
return false;
|
||||
}
|
||||
|
||||
setHostMem(lockedRect.pBits);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
Image2DD3D9::unmapExtObjectInCQThread()
|
||||
{
|
||||
HRESULT hr;
|
||||
ScopedLock sl(getResLock());
|
||||
hr = getD3D9Resource()->UnlockRect();
|
||||
if (hr != D3D_OK) {
|
||||
LogError("Cannot unlock D3D9 surface");
|
||||
return false;
|
||||
}
|
||||
|
||||
setHostMem(NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
} //namespace amd
|
||||
|
||||
#endif //_WIN32
|
||||
@@ -0,0 +1,333 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
|
||||
/* $Revision$ on $Date$ */
|
||||
|
||||
#ifndef __OPENCL_CL_D3D9_AMD_H
|
||||
#define __OPENCL_CL_D3D9_AMD_H
|
||||
|
||||
#include "CL/cl_dx9_media_sharing.h"
|
||||
#include <d3d9.h>
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/memory.hpp"
|
||||
|
||||
#include <utility>
|
||||
|
||||
/* cl_amd_d3d9_sharing extension */
|
||||
#define cl_amd_d3d9_sharing 1
|
||||
|
||||
/* cl_amd_d3d9_sharing error codes */
|
||||
#define CL_INVALID_D3D9_DEVICE_KHR -1021
|
||||
#define CL_INVALID_D3D9_RESOURCE_KHR -1022
|
||||
|
||||
/* cl_amd_d3d9_sharing enumerations */
|
||||
#define CL_CONTEXT_D3D9_DEVICE_KHR 0x4039
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetDeviceIDsFromDX9MediaAdapterKHR(
|
||||
cl_platform_id,
|
||||
cl_uint,
|
||||
cl_dx9_media_adapter_type_khr *,
|
||||
void *,
|
||||
cl_dx9_media_adapter_set_khr,
|
||||
cl_uint,
|
||||
cl_device_id *,
|
||||
cl_uint *);
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromDX9MediaSurfaceKHR(
|
||||
cl_context,
|
||||
cl_mem_flags,
|
||||
cl_dx9_media_adapter_type_khr,
|
||||
void *,
|
||||
cl_uint,
|
||||
cl_int *);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueAcquireDX9MediaSurfacesKHR(
|
||||
cl_command_queue,
|
||||
cl_uint,
|
||||
const cl_mem *,
|
||||
cl_uint,
|
||||
const cl_event *,
|
||||
cl_event *);
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueReleaseDX9MediaSurfacesKHR(
|
||||
cl_command_queue,
|
||||
cl_uint,
|
||||
cl_mem *,
|
||||
cl_uint,
|
||||
const cl_event *,
|
||||
cl_event *);
|
||||
|
||||
namespace amd
|
||||
{
|
||||
typedef struct
|
||||
{
|
||||
union
|
||||
{
|
||||
UINT ByteWidth;
|
||||
UINT Width;
|
||||
};
|
||||
UINT Height;
|
||||
UINT Depth;
|
||||
} D3D9ObjSize_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
D3D9ObjSize_t objSize_;
|
||||
D3DFORMAT d3dFormat_;
|
||||
D3DRESOURCETYPE resType_;
|
||||
UINT usage_;
|
||||
D3DPOOL d3dPool_;
|
||||
D3DMULTISAMPLE_TYPE msType_;
|
||||
UINT msQuality_;
|
||||
UINT mipLevels_;
|
||||
UINT fvf_;
|
||||
RECT surfRect_;
|
||||
} D3D9ObjDesc_t;
|
||||
|
||||
typedef struct d3d9ResInfo {
|
||||
cl_dx9_surface_info_khr surfInfo;
|
||||
cl_uint surfPlane;
|
||||
} TD3D9RESINFO;
|
||||
|
||||
|
||||
//typedef std::pair<cl_dx9_surface_info_khr, D3D9Object*> TD3D9OBJINFO;
|
||||
|
||||
//! Class D3D9Object keeps all the info about the D3D9 object
|
||||
//! from which the CL object is created
|
||||
class D3D9Object : public InteropObject
|
||||
{
|
||||
private:
|
||||
IDirect3DSurface9* pD3D9Aux_;
|
||||
cl_int cliChecksum_;
|
||||
bool releaseResources_;
|
||||
static bool createSharedResource(D3D9Object& obj);
|
||||
static std::vector<std::pair<TD3D9RESINFO, TD3D9RESINFO>> resources_;
|
||||
|
||||
//!Global lock
|
||||
static Monitor resLock_;
|
||||
cl_uint surfPlane_;
|
||||
cl_dx9_surface_info_khr surfInfo_;
|
||||
|
||||
protected:
|
||||
IDirect3DSurface9* pD3D9Res_;
|
||||
IDirect3DSurface9* pD3D9ResOrig_;
|
||||
IDirect3DQuery9* pQuery_;
|
||||
D3D9ObjDesc_t objDesc_;
|
||||
D3D9ObjDesc_t objDescOrig_;
|
||||
HANDLE handleOrig_;
|
||||
HANDLE handleShared_;
|
||||
RECT srcSurfRect;
|
||||
RECT SharedSurfRect;
|
||||
cl_dx9_media_adapter_type_khr adapterType_;
|
||||
|
||||
public:
|
||||
//! D3D9Object constructor initializes memeber variables
|
||||
D3D9Object()
|
||||
: releaseResources_(false),
|
||||
pQuery_(NULL)
|
||||
{
|
||||
// @todo Incorrect initialization!!!
|
||||
memset(this, 0, sizeof(D3D9Object));
|
||||
}
|
||||
//copy constructor
|
||||
D3D9Object(D3D9Object& d3d9obj)
|
||||
:pQuery_(NULL)
|
||||
{
|
||||
*this = d3d9obj;
|
||||
this->releaseResources_ = true;
|
||||
}
|
||||
|
||||
//virtual destructor
|
||||
virtual ~D3D9Object()
|
||||
{
|
||||
ScopedLock sl(resLock_);
|
||||
if(releaseResources_) {
|
||||
if(pD3D9ResOrig_) pD3D9ResOrig_->Release();
|
||||
if(pD3D9Res_) pD3D9Res_->Release();
|
||||
if(pD3D9Aux_) pD3D9Aux_->Release();
|
||||
if(pQuery_) pQuery_->Release();
|
||||
//if the resouce is being used
|
||||
std::vector<std::pair<TD3D9RESINFO, TD3D9RESINFO>>::iterator it;
|
||||
if(resources_.size()) {
|
||||
for(it = resources_.begin(); it != resources_.end(); ++it) {
|
||||
if( surfInfo_.resource &&
|
||||
((*it).first.surfInfo.resource == surfInfo_.resource) &&
|
||||
((*it).first.surfPlane == surfPlane_)) {
|
||||
resources_.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
static int initD3D9Object(const Context& amdContext, cl_dx9_media_adapter_type_khr adapter_type,
|
||||
cl_dx9_surface_info_khr* cl_surf_info, cl_uint plane, D3D9Object& obj);
|
||||
cl_uint getMiscFlag(void);
|
||||
|
||||
D3D9Object* asD3D9Object() {return this;}
|
||||
IDirect3DSurface9* getD3D9Resource() const {return pD3D9Res_;}
|
||||
HANDLE getD3D9SharedHandle() const {return handleShared_;}
|
||||
IDirect3DSurface9* getD3D9ResOrig() const {return pD3D9ResOrig_;}
|
||||
RECT* getSrcSurfRect() {return &objDesc_.surfRect_;}
|
||||
RECT* getSharedSurfRect() {return &objDescOrig_.surfRect_;}
|
||||
void setD3D9AuxRes(IDirect3DSurface9* pAux) {pD3D9Aux_ = pAux;}
|
||||
IDirect3DSurface9* getD3D9AuxRes() {return pD3D9Aux_;}
|
||||
IDirect3DQuery9* getQuery() const {return pQuery_;}
|
||||
Monitor & getResLock() { return resLock_;}
|
||||
UINT getWidth() const {return objDesc_.objSize_.Width;}
|
||||
UINT getHeight() const {return objDesc_.objSize_.Height;}
|
||||
cl_uint getPlane() const {return surfPlane_;}
|
||||
cl_dx9_media_adapter_type_khr getAdapterType() const { return adapterType_;};
|
||||
const cl_dx9_surface_info_khr& getSurfInfo() const {return surfInfo_;};
|
||||
size_t getElementBytes(D3DFORMAT d3d9Format, cl_uint plane);
|
||||
size_t getElementBytes() {return getElementBytes(objDesc_.d3dFormat_, surfPlane_);}
|
||||
D3DFORMAT getD3D9Format() {return objDesc_.d3dFormat_;}
|
||||
D3D9ObjDesc_t* getObjDesc() {return &objDesc_;}
|
||||
cl_image_format getCLFormatFromD3D9();
|
||||
cl_image_format getCLFormatFromD3D9(D3DFORMAT d3d9Fmt, cl_uint plane);
|
||||
// On acquire copy data from original resource to shared resource
|
||||
virtual bool copyOrigToShared();
|
||||
// On release copy data from shared copy to the original resource
|
||||
virtual bool copySharedToOrig();
|
||||
};
|
||||
|
||||
class Image2DD3D9 : public D3D9Object , public Image
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'Image2DD3D9' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! Image2DD3D9 constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
Image2DD3D9(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
D3D9Object& d3d9obj)
|
||||
: // Call base classes constructors
|
||||
D3D9Object(d3d9obj),
|
||||
Image(
|
||||
amdContext,
|
||||
CL_MEM_OBJECT_IMAGE2D,
|
||||
clFlags,
|
||||
d3d9obj.getCLFormatFromD3D9(),
|
||||
d3d9obj.getWidth(),
|
||||
d3d9obj.getHeight(),
|
||||
1,
|
||||
d3d9obj.getWidth() * d3d9obj.getElementBytes(), //rowPitch),
|
||||
0)
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~Image2DD3D9() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
cl_mem clCreateImage2DFromD3D9ResourceAMD(
|
||||
Context& amdContext,
|
||||
cl_mem_flags flags,
|
||||
cl_dx9_media_adapter_type_khr adapter_type,
|
||||
cl_dx9_surface_info_khr* surface_info,
|
||||
cl_uint plane,
|
||||
int* errcode_ret);
|
||||
|
||||
void SyncD3D9Objects(std::vector<amd::Memory*>& memObjects);
|
||||
|
||||
} //namespace amd
|
||||
|
||||
#endif /* __OPENCL_CL_D3D9_AMD_H */
|
||||
@@ -0,0 +1,797 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
|
||||
#include "device/device.hpp"
|
||||
#include "platform/runtime.hpp"
|
||||
#include "utils/versions.hpp"
|
||||
#include "cl_semaphore_amd.h"
|
||||
|
||||
#include "CL/cl_ext.h"
|
||||
|
||||
#include <cstdlib> // for alloca
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup CL_PlatformInfo
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief Get the list of available platforms.
|
||||
*
|
||||
* \param num_entries is the number of cl_platform_id entries that can be added
|
||||
* to platforms. If \a platforms is not NULL, the \a num_entries must be greater
|
||||
* than zero.
|
||||
*
|
||||
* \param platforms returns a list of OpenCL platforms found. The cl_platform_id
|
||||
* values returned in \a platforms can be used to identify a specific OpenCL
|
||||
* platform. If \a platforms argument is NULL, this argument is ignored. The
|
||||
* number of OpenCL platforms returned is the mininum of the value specified by
|
||||
* \a num_entries or the number of OpenCL platforms available.
|
||||
*
|
||||
* \param num_platforms returns the number of OpenCL platforms available. If
|
||||
* \a num_platforms is NULL, this argument is ignored.
|
||||
*
|
||||
* \return CL_INVALID_VALUE if num_entries is equal to zero and platforms is not
|
||||
* NULL or if both num_platforms and platforms are NULL, and returns CL_SUCCESS
|
||||
* if the function is executed successfully.
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clGetPlatformIDs, (
|
||||
cl_uint num_entries,
|
||||
cl_platform_id *platforms,
|
||||
cl_uint *num_platforms))
|
||||
{
|
||||
if (!amd::Runtime::initialized()) {
|
||||
amd::Runtime::init();
|
||||
}
|
||||
|
||||
if (((num_entries > 0 || num_platforms == NULL) && platforms == NULL)
|
||||
|| (num_entries == 0 && platforms != NULL)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
if (num_platforms != NULL && platforms == NULL) {
|
||||
*num_platforms = 1;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
assert(platforms != NULL && "check the code above");
|
||||
*platforms = AMD_PLATFORM;
|
||||
|
||||
*not_null(num_platforms) = 1;
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Get specific information about the OpenCL platform.
|
||||
*
|
||||
* \param param_name is an enum that identifies the platform information being
|
||||
* queried.
|
||||
*
|
||||
* \param param_value is a pointer to memory location where appropriate values
|
||||
* for a given \a param_name will be returned. If \a param_value is NULL,
|
||||
* it is ignored.
|
||||
*
|
||||
* \param param_value_size specifies the size in bytes of memory pointed to by
|
||||
* \a param_value. This size in bytes must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data being
|
||||
* queried by param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_INVALID_VALUE if \a param_name is not one of the supported
|
||||
* values or if size in bytes specified by \a param_value_size is < size of
|
||||
* return type and \a param_value is not a NULL value.
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetPlatformInfo, (
|
||||
cl_platform_id platform,
|
||||
cl_platform_info param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret))
|
||||
{
|
||||
if (platform != NULL && platform != AMD_PLATFORM) {
|
||||
return CL_INVALID_PLATFORM;
|
||||
}
|
||||
|
||||
const char* value = NULL;
|
||||
switch (param_name) {
|
||||
case CL_PLATFORM_PROFILE:
|
||||
value = "FULL_PROFILE";
|
||||
break;
|
||||
case CL_PLATFORM_VERSION:
|
||||
value = "OpenCL " XSTR(OPENCL_MAJOR) "." XSTR(OPENCL_MINOR) \
|
||||
" " AMD_PLATFORM_INFO;
|
||||
break;
|
||||
case CL_PLATFORM_NAME:
|
||||
value = AMD_PLATFORM_NAME;
|
||||
break;
|
||||
case CL_PLATFORM_VENDOR:
|
||||
value = "Advanced Micro Devices, Inc.";
|
||||
break;
|
||||
case CL_PLATFORM_EXTENSIONS:
|
||||
value = "cl_khr_icd " NOT_MAINLINE("cl_amd_object_metadata ")
|
||||
#ifdef _WIN32
|
||||
"cl_khr_d3d10_sharing "
|
||||
"cl_khr_d3d11_sharing "
|
||||
"cl_khr_dx9_media_sharing "
|
||||
#endif //_WIN32
|
||||
"cl_amd_event_callback cl_amd_offline_devices ";
|
||||
break;
|
||||
case CL_PLATFORM_ICD_SUFFIX_KHR:
|
||||
value = "AMD";
|
||||
break;
|
||||
case CL_PLATFORM_MAX_KEYS_AMD: {
|
||||
size_t max_keys = OCL_MAX_KEYS;
|
||||
return amd::clGetInfo(
|
||||
max_keys, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (value != NULL) {
|
||||
return amd::clGetInfo(
|
||||
value, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* \addtogroup CL_Devices
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief Get the list of available devices.
|
||||
*
|
||||
* \param device_type is a bitfield that identifies the type of OpenCL device.
|
||||
* The \a device_type can be used to query specific OpenCL devices or all
|
||||
* OpenCL devices available.
|
||||
*
|
||||
* \param num_entries is the number of cl_device_id entries that can be added
|
||||
* to devices. If devices is not NULL, the \a num_entries must be greater than
|
||||
* zero.
|
||||
*
|
||||
* \param devices returns a list of OpenCL devices found. The cl_device_id
|
||||
* values returned in devices can be used to identify a specific OpenCL device.
|
||||
* If \a devices argument is NULL, this argument is ignored. The number of
|
||||
* OpenCL devices returned is the mininum of value specified by \a num_entries
|
||||
* or the number of OpenCL devices whose type matches device_type.
|
||||
*
|
||||
* \param num_devices returns the number of OpenCL devices available that match
|
||||
* device_type. If \a num_devices is NULL, this argument is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_INVALID_DEVICE_TYPE if \a device_type is not a valid value.
|
||||
* - CL_INVALID_VALUE if \a num_entries is equal to zero and devices is
|
||||
* not NULL or if both \a num_devices and \a devices are NULL.
|
||||
* - CL_DEVICE_ NOT_FOUND if no OpenCL devices that matched \a device_type
|
||||
* were found.
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
*
|
||||
* The application can query specific capabilities of the OpenCL device(s)
|
||||
* returned by clGetDeviceIDs. This can be used by the application to
|
||||
* determine which device(s) to use.
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetDeviceIDs, (
|
||||
cl_platform_id platform,
|
||||
cl_device_type device_type,
|
||||
cl_uint num_entries,
|
||||
cl_device_id *devices,
|
||||
cl_uint *num_devices))
|
||||
{
|
||||
if (platform != NULL && platform != AMD_PLATFORM) {
|
||||
return CL_INVALID_PLATFORM;
|
||||
}
|
||||
|
||||
if (((num_entries > 0 || num_devices == NULL) && devices == NULL)
|
||||
|| (num_entries == 0 && devices != NULL)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
if (device_type & CL_HSA_ENABLED_AMD &&
|
||||
device_type & CL_HSA_DISABLED_AMD) {
|
||||
device_type ^= (CL_HSA_ENABLED_AMD | CL_HSA_DISABLED_AMD);
|
||||
}
|
||||
|
||||
// Get all available devices
|
||||
if (!amd::Device::getDeviceIDs(device_type, num_entries,
|
||||
devices, num_devices, false)) {
|
||||
return CL_DEVICE_NOT_FOUND;
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \fn clGetDeviceInfo
|
||||
*
|
||||
* \brief Get specific information about an OpenCL device.
|
||||
*
|
||||
* \param device is a device returned by clGetDeviceIDs.
|
||||
*
|
||||
* \param param_name is an enum that identifies the device information being
|
||||
* queried.
|
||||
*
|
||||
* \param param_value is a pointer to memory location where appropriate values
|
||||
* for a given \a param_name will be returned. If \a param_value is NULL,
|
||||
* it is ignored.
|
||||
*
|
||||
* \param param_value_size specifies the size in bytes of memory pointed to
|
||||
* by \a param_value. This size in bytes must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data being
|
||||
* queried by param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_INVALID_DEVICE if device is not valid.
|
||||
* - CL_INVALID_VALUE if param_name is not one of the supported values
|
||||
* or if size in bytes specified by \a param_value_size is < size of return
|
||||
* type and \a param_value is not a NULL value.
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
*
|
||||
* \version 1.0r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetDeviceInfo, (
|
||||
cl_device_id device,
|
||||
cl_device_info param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
|
||||
#define CASE(param_name, field_name) \
|
||||
case param_name: \
|
||||
return amd::clGetInfo( \
|
||||
as_amd(device)->info().field_name, \
|
||||
param_value_size, \
|
||||
param_value, \
|
||||
param_value_size_ret);
|
||||
|
||||
switch (param_name) {
|
||||
case CL_DEVICE_TYPE: {
|
||||
// For cl_device_type, we need to mask out the default bit.
|
||||
cl_device_type device_type = as_amd(device)->type();
|
||||
return amd::clGetInfo(
|
||||
device_type, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
CASE(CL_DEVICE_VENDOR_ID, vendorId_);
|
||||
CASE(CL_DEVICE_MAX_COMPUTE_UNITS, maxComputeUnits_);
|
||||
CASE(CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, maxWorkItemDimensions_);
|
||||
CASE(CL_DEVICE_MAX_WORK_GROUP_SIZE, maxWorkGroupSize_);
|
||||
CASE(CL_DEVICE_MAX_WORK_ITEM_SIZES, maxWorkItemSizes_);
|
||||
CASE(CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, preferredVectorWidthChar_);
|
||||
CASE(CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, preferredVectorWidthShort_);
|
||||
CASE(CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, preferredVectorWidthInt_);
|
||||
CASE(CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, preferredVectorWidthLong_);
|
||||
CASE(CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, preferredVectorWidthFloat_);
|
||||
CASE(CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, preferredVectorWidthDouble_);
|
||||
CASE(CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, preferredVectorWidthDouble_);
|
||||
CASE(CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, nativeVectorWidthChar_);
|
||||
CASE(CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, nativeVectorWidthShort_);
|
||||
CASE(CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, nativeVectorWidthInt_);
|
||||
CASE(CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, nativeVectorWidthLong_);
|
||||
CASE(CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, nativeVectorWidthFloat_);
|
||||
CASE(CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, nativeVectorWidthDouble_);
|
||||
CASE(CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, nativeVectorWidthDouble_);
|
||||
CASE(CL_DEVICE_MAX_CLOCK_FREQUENCY, maxClockFrequency_);
|
||||
CASE(CL_DEVICE_ADDRESS_BITS, addressBits_);
|
||||
CASE(CL_DEVICE_MAX_READ_IMAGE_ARGS, maxReadImageArgs_);
|
||||
CASE(CL_DEVICE_MAX_WRITE_IMAGE_ARGS, maxWriteImageArgs_);
|
||||
CASE(CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS, maxReadWriteImageArgs_);
|
||||
CASE(CL_DEVICE_MAX_MEM_ALLOC_SIZE, maxMemAllocSize_);
|
||||
CASE(CL_DEVICE_IMAGE2D_MAX_WIDTH, image2DMaxWidth_);
|
||||
CASE(CL_DEVICE_IMAGE2D_MAX_HEIGHT, image2DMaxHeight_);
|
||||
CASE(CL_DEVICE_IMAGE3D_MAX_WIDTH, image3DMaxWidth_);
|
||||
CASE(CL_DEVICE_IMAGE3D_MAX_HEIGHT, image3DMaxHeight_);
|
||||
CASE(CL_DEVICE_IMAGE3D_MAX_DEPTH, image3DMaxDepth_);
|
||||
CASE(CL_DEVICE_IMAGE_SUPPORT, imageSupport_);
|
||||
CASE(CL_DEVICE_MAX_PARAMETER_SIZE, maxParameterSize_);
|
||||
CASE(CL_DEVICE_MAX_SAMPLERS, maxSamplers_);
|
||||
CASE(CL_DEVICE_MEM_BASE_ADDR_ALIGN, memBaseAddrAlign_);
|
||||
CASE(CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, minDataTypeAlignSize_);
|
||||
CASE(CL_DEVICE_HALF_FP_CONFIG, halfFPConfig_);
|
||||
CASE(CL_DEVICE_SINGLE_FP_CONFIG, singleFPConfig_);
|
||||
CASE(CL_DEVICE_DOUBLE_FP_CONFIG, doubleFPConfig_);
|
||||
CASE(CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, globalMemCacheType_);
|
||||
CASE(CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, globalMemCacheLineSize_);
|
||||
CASE(CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, globalMemCacheSize_);
|
||||
CASE(CL_DEVICE_GLOBAL_MEM_SIZE, globalMemSize_);
|
||||
CASE(CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, maxConstantBufferSize_);
|
||||
CASE(CL_DEVICE_MAX_CONSTANT_ARGS, maxConstantArgs_);
|
||||
CASE(CL_DEVICE_LOCAL_MEM_TYPE, localMemType_);
|
||||
CASE(CL_DEVICE_LOCAL_MEM_SIZE, localMemSize_);
|
||||
CASE(CL_DEVICE_ERROR_CORRECTION_SUPPORT, errorCorrectionSupport_);
|
||||
CASE(CL_DEVICE_HOST_UNIFIED_MEMORY, hostUnifiedMemory_);
|
||||
CASE(CL_DEVICE_PROFILING_TIMER_RESOLUTION, profilingTimerResolution_);
|
||||
CASE(CL_DEVICE_PROFILING_TIMER_OFFSET_AMD, profilingTimerOffset_);
|
||||
CASE(CL_DEVICE_ENDIAN_LITTLE, littleEndian_);
|
||||
CASE(CL_DEVICE_AVAILABLE, available_);
|
||||
CASE(CL_DEVICE_COMPILER_AVAILABLE, compilerAvailable_);
|
||||
CASE(CL_DEVICE_EXECUTION_CAPABILITIES, executionCapabilities_);
|
||||
CASE(CL_DEVICE_SVM_CAPABILITIES, svmCapabilities_);
|
||||
CASE(CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT, preferredPlatformAtomicAlignment_);
|
||||
CASE(CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT, preferredGlobalAtomicAlignment_);
|
||||
CASE(CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT, preferredLocalAtomicAlignment_);
|
||||
CASE(CL_DEVICE_QUEUE_ON_HOST_PROPERTIES, queueProperties_);
|
||||
CASE(CL_DEVICE_PLATFORM, platform_);
|
||||
CASE(CL_DEVICE_NAME, name_);
|
||||
CASE(CL_DEVICE_VENDOR, vendor_);
|
||||
CASE(CL_DRIVER_VERSION, driverVersion_);
|
||||
CASE(CL_DEVICE_PROFILE, profile_);
|
||||
CASE(CL_DEVICE_VERSION, version_);
|
||||
CASE(CL_DEVICE_OPENCL_C_VERSION, oclcVersion_);
|
||||
CASE(CL_DEVICE_EXTENSIONS, extensions_);
|
||||
CASE(CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT, maxAtomicCounters_);
|
||||
CASE(CL_DEVICE_TOPOLOGY_AMD, deviceTopology_);
|
||||
CASE(CL_DEVICE_MAX_SEMAPHORE_SIZE_AMD, maxSemaphoreSize_);
|
||||
CASE(CL_DEVICE_BOARD_NAME_AMD, boardName_);
|
||||
CASE(CL_DEVICE_SPIR_VERSIONS, spirVersions_);
|
||||
CASE(CL_DEVICE_MAX_PIPE_ARGS, maxPipeArgs_);
|
||||
CASE(CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS, maxPipeActiveReservations_);
|
||||
CASE(CL_DEVICE_PIPE_MAX_PACKET_SIZE, maxPipePacketSize_);
|
||||
CASE(CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE, maxGlobalVariableSize_);
|
||||
CASE(CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE, globalVariablePreferredTotalSize_);
|
||||
CASE(CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES, queueOnDeviceProperties_);
|
||||
CASE(CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE, queueOnDevicePreferredSize_);
|
||||
CASE(CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE, queueOnDeviceMaxSize_);
|
||||
CASE(CL_DEVICE_MAX_ON_DEVICE_QUEUES, maxOnDeviceQueues_);
|
||||
CASE(CL_DEVICE_MAX_ON_DEVICE_EVENTS, maxOnDeviceEvents_);
|
||||
#ifdef cl_ext_device_fission
|
||||
case CL_DEVICE_AFFINITY_DOMAINS_EXT: {
|
||||
const device::AffinityDomain& affinityDomain =
|
||||
as_amd(device)->info().affinityDomain_;
|
||||
|
||||
size_t valueSize = affinityDomain.getNumSet() *
|
||||
sizeof(cl_device_partition_property_ext);
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if (param_value != NULL) {
|
||||
affinityDomain.toCLExt(
|
||||
reinterpret_cast<cl_device_partition_property_ext*>(param_value));
|
||||
if (param_value_size > valueSize) {
|
||||
::memset(static_cast<char*>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_DEVICE_PARTITION_STYLE_EXT: {
|
||||
const device::PartitionInfo& partitionInfo =
|
||||
as_amd(device)->info().partitionCreateInfo_;
|
||||
size_t valueSize = 0;
|
||||
cl_device_partition_property_ext* properties =
|
||||
reinterpret_cast<cl_device_partition_property_ext*>(param_value);
|
||||
|
||||
switch (partitionInfo.type_.value_) {
|
||||
case device::PartitionType::EQUALLY:
|
||||
valueSize = 3 * sizeof(cl_device_partition_property_ext);
|
||||
if (param_value != NULL) {
|
||||
if (param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
properties[0] = CL_DEVICE_PARTITION_EQUALLY_EXT;
|
||||
properties[1] = (cl_device_partition_property_ext)
|
||||
partitionInfo.equally_.numComputeUnits_;
|
||||
properties[2] = CL_PROPERTIES_LIST_END_EXT;
|
||||
}
|
||||
break;
|
||||
|
||||
case device::PartitionType::BY_COUNTS:
|
||||
valueSize = (partitionInfo.byCounts_.listSize_ + 2) *
|
||||
sizeof(cl_device_partition_property_ext);
|
||||
if (param_value != NULL) {
|
||||
if (param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*properties++ = CL_DEVICE_PARTITION_BY_COUNTS_EXT;
|
||||
for (size_t i = 0; i < partitionInfo.byCounts_.listSize_;
|
||||
++i) {
|
||||
*properties++ = partitionInfo.byCounts_.countsList_[i];
|
||||
}
|
||||
*properties = CL_PROPERTIES_LIST_END_EXT;
|
||||
}
|
||||
break;
|
||||
|
||||
case device::PartitionType::BY_AFFINITY_DOMAIN:
|
||||
valueSize = 3 * sizeof(cl_device_partition_property_ext);
|
||||
if (param_value != NULL) {
|
||||
if (param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
properties[0] = CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT;
|
||||
properties[1] = partitionInfo.byAffinityDomain_.toCLExt();
|
||||
properties[2] = CL_PROPERTIES_LIST_END_EXT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if (param_value != NULL && param_value_size > valueSize) {
|
||||
::memset(static_cast<char*>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_DEVICE_PARTITION_TYPES_EXT: {
|
||||
const device::PartitionType& partitionProperties =
|
||||
as_amd(device)->info().partitionProperties_;
|
||||
size_t valueSize = partitionProperties.getNumSet() *
|
||||
sizeof(cl_device_partition_property_ext);
|
||||
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if (param_value != NULL) {
|
||||
partitionProperties.toCLExt(
|
||||
reinterpret_cast<cl_device_partition_property_ext*>(param_value));
|
||||
if (param_value_size > valueSize) {
|
||||
::memset(static_cast<char*>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_DEVICE_PARENT_DEVICE_EXT: {
|
||||
cl_device_id parent = !as_amd(device)->isRootDevice()
|
||||
? as_cl(as_amd(device)->parent()) : (cl_device_id)0;
|
||||
return amd::clGetInfo(
|
||||
parent, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_DEVICE_REFERENCE_COUNT_EXT: {
|
||||
cl_uint count = as_amd(device)->referenceCount();
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
#endif // cl_ext_device_fission
|
||||
CASE(CL_DEVICE_LINKER_AVAILABLE, linkerAvailable_);
|
||||
CASE(CL_DEVICE_BUILT_IN_KERNELS, builtInKernels_);
|
||||
CASE(CL_DEVICE_IMAGE_MAX_BUFFER_SIZE, imageMaxBufferSize_);
|
||||
CASE(CL_DEVICE_IMAGE_MAX_ARRAY_SIZE, imageMaxArraySize_);
|
||||
case CL_DEVICE_PARENT_DEVICE: {
|
||||
cl_device_id parent = !as_amd(device)->isRootDevice()
|
||||
? as_cl(as_amd(device)->parent()) : (cl_device_id)0;
|
||||
return amd::clGetInfo(
|
||||
parent, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
CASE(CL_DEVICE_PARTITION_MAX_SUB_DEVICES, maxComputeUnits_);
|
||||
case CL_DEVICE_PARTITION_PROPERTIES:
|
||||
{
|
||||
const device::PartitionType& partitionProperties =
|
||||
as_amd(device)->info().partitionProperties_;
|
||||
size_t valueSize = partitionProperties.getNumSet() *
|
||||
sizeof(cl_device_partition_property);
|
||||
|
||||
if (param_value != NULL && param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if (param_value != NULL) {
|
||||
partitionProperties.toCL(
|
||||
reinterpret_cast<cl_device_partition_property*>(param_value));
|
||||
if (param_value_size > valueSize) {
|
||||
::memset(static_cast<char*>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_DEVICE_PARTITION_AFFINITY_DOMAIN: {
|
||||
cl_device_affinity_domain deviceAffinity =
|
||||
as_amd(device)->info().affinityDomain_.toCL();
|
||||
return amd::clGetInfo(
|
||||
deviceAffinity, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_DEVICE_PARTITION_TYPE:
|
||||
{
|
||||
const device::PartitionInfo& partitionInfo =
|
||||
as_amd(device)->info().partitionCreateInfo_;
|
||||
size_t valueSize = 0;
|
||||
cl_device_partition_property* properties =
|
||||
reinterpret_cast<cl_device_partition_property*>(param_value);
|
||||
|
||||
switch (partitionInfo.type_.value_) {
|
||||
case device::PartitionType::EQUALLY:
|
||||
valueSize = 3 * sizeof(cl_device_partition_property);
|
||||
if (param_value != NULL) {
|
||||
if (param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
properties[0] = CL_DEVICE_PARTITION_EQUALLY;
|
||||
properties[1] = (cl_device_partition_property)
|
||||
partitionInfo.equally_.numComputeUnits_;
|
||||
properties[2] = (cl_device_partition_property)0;
|
||||
}
|
||||
break;
|
||||
|
||||
case device::PartitionType::BY_COUNTS:
|
||||
valueSize = (partitionInfo.byCounts_.listSize_ + 2) *
|
||||
sizeof(cl_device_partition_property);
|
||||
if (param_value != NULL) {
|
||||
if (param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
*properties++ = CL_DEVICE_PARTITION_BY_COUNTS;
|
||||
for (size_t i = 0; i < partitionInfo.byCounts_.listSize_;
|
||||
++i) {
|
||||
*properties++ = partitionInfo.byCounts_.countsList_[i];
|
||||
}
|
||||
*properties = (cl_device_partition_property)0;
|
||||
}
|
||||
break;
|
||||
|
||||
case device::PartitionType::BY_AFFINITY_DOMAIN:
|
||||
valueSize = 3 * sizeof(cl_device_partition_property);
|
||||
if (param_value != NULL) {
|
||||
if (param_value_size < valueSize) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
properties[0] = CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN;
|
||||
properties[1] = (cl_device_partition_property)
|
||||
partitionInfo.byAffinityDomain_.toCL();
|
||||
properties[2] = (cl_device_partition_property)0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
*not_null(param_value_size_ret) = valueSize;
|
||||
if (param_value != NULL && param_value_size > valueSize) {
|
||||
::memset(static_cast<char*>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_DEVICE_REFERENCE_COUNT: {
|
||||
cl_uint count = as_amd(device)->referenceCount();
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
CASE(CL_DEVICE_PREFERRED_INTEROP_USER_SYNC, preferredInteropUserSync_);
|
||||
CASE(CL_DEVICE_PRINTF_BUFFER_SIZE, printfBufferSize_);
|
||||
CASE(CL_DEVICE_IMAGE_PITCH_ALIGNMENT, imagePitchAlignment_);
|
||||
CASE(CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT, imageBaseAddressAlignment_);
|
||||
|
||||
#if cl_amd_open_video
|
||||
CASE(CL_DEVICE_MAX_VIDEO_SESSIONS_AMD, maxVideoSessions_);
|
||||
CASE(CL_DEVICE_NUM_VIDEO_ATTRIBS_AMD, numVideoAttribs_);
|
||||
CASE(CL_DEVICE_NUM_VIDEO_ENC_ATTRIBS_AMD, numVideoEncAttribs_);
|
||||
case CL_DEVICE_VIDEO_ATTRIBS_AMD:
|
||||
{
|
||||
size_t valueSize = sizeof(cl_video_attrib_amd)
|
||||
* as_amd(device)->info().numVideoAttribs_;
|
||||
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, as_amd(device)->info().videoAttribs_,
|
||||
valueSize);
|
||||
if (param_value_size > valueSize) {
|
||||
::memset(static_cast<char*>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
case CL_DEVICE_VIDEO_ATTRIBS_ENC_AMD:
|
||||
{
|
||||
size_t valueSize = sizeof(cl_video_attrib_encode_amd) // has profile & format
|
||||
* as_amd(device)->info().numVideoEncAttribs_;
|
||||
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, as_amd(device)->info().videoEncAttribs_, valueSize);
|
||||
// Zero out remaining bytes if encode CAP List + profile is < parameter value size.
|
||||
if (param_value_size > valueSize) {
|
||||
::memset(static_cast<char*>(param_value) + valueSize,
|
||||
'\0', param_value_size - valueSize);
|
||||
}
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
#endif //cl_amd_open_video
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (as_amd(device)->type() == CL_DEVICE_TYPE_GPU) {
|
||||
switch (param_name) {
|
||||
case CL_DEVICE_GLOBAL_FREE_MEMORY_AMD: {
|
||||
size_t freeMemory[2];
|
||||
if (as_amd(device)->globalFreeMemory(freeMemory)) {
|
||||
return amd::clGetInfo(
|
||||
freeMemory, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
else {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
}
|
||||
CASE(CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD, simdPerCU_);
|
||||
CASE(CL_DEVICE_SIMD_WIDTH_AMD, simdWidth_);
|
||||
CASE(CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD, simdInstructionWidth_);
|
||||
CASE(CL_DEVICE_WAVEFRONT_WIDTH_AMD, wavefrontWidth_);
|
||||
CASE(CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD, globalMemChannels_);
|
||||
CASE(CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD, globalMemChannelBanks_);
|
||||
CASE(CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD, globalMemChannelBankWidth_);
|
||||
CASE(CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD, localMemSizePerCU_);
|
||||
CASE(CL_DEVICE_LOCAL_MEM_BANKS_AMD, localMemBanks_);
|
||||
CASE(CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD, threadTraceEnable_);
|
||||
case CL_DEVICE_GFXIP_MAJOR_AMD: {
|
||||
cl_uint major= as_amd(device)->info().gfxipVersion_ / 100;
|
||||
return amd::clGetInfo(
|
||||
major, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
case CL_DEVICE_GFXIP_MINOR_AMD: {
|
||||
cl_uint minor= as_amd(device)->info().gfxipVersion_ % 100;
|
||||
return amd::clGetInfo(
|
||||
minor, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#undef CASE
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
#ifdef cl_ext_device_fission
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clCreateSubDevicesEXT, (
|
||||
cl_device_id in_device,
|
||||
const cl_device_partition_property_ext * partition_properties,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * out_devices,
|
||||
cl_uint * num_devices))
|
||||
{
|
||||
if (!is_valid(in_device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
if (partition_properties == NULL || *partition_properties == 0u) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
if (((num_entries > 0 || num_devices == NULL) && out_devices == NULL)
|
||||
|| (num_entries == 0 && out_devices != NULL)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
device::CreateSubDevicesInfoT<cl_device_partition_property_ext> create_info;
|
||||
switch (*partition_properties) {
|
||||
case CL_DEVICE_PARTITION_EQUALLY_EXT:
|
||||
create_info.p_.type_.value_ = device::PartitionType::EQUALLY;
|
||||
create_info.p_.equally_.numComputeUnits_ =
|
||||
(size_t)partition_properties[1];
|
||||
break;
|
||||
case CL_DEVICE_PARTITION_BY_COUNTS_EXT:
|
||||
create_info.p_.type_.value_ = device::PartitionType::BY_COUNTS;
|
||||
create_info.initCountsList(partition_properties + 1);
|
||||
break;
|
||||
case CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT:
|
||||
create_info.p_.type_.value_ = device::PartitionType::BY_AFFINITY_DOMAIN;
|
||||
create_info.p_.byAffinityDomain_.value_ =
|
||||
(uint)partition_properties[1];
|
||||
break;
|
||||
default:
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
cl_int ret = as_amd(in_device)->createSubDevices(
|
||||
create_info, num_entries, out_devices, num_devices);
|
||||
|
||||
if (ret == CL_DEVICE_PARTITION_FAILED) {
|
||||
return CL_DEVICE_PARTITION_FAILED_EXT;
|
||||
}
|
||||
if (ret == CL_INVALID_DEVICE_PARTITION_COUNT) {
|
||||
return CL_INVALID_PARTITION_COUNT_EXT;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clRetainDeviceEXT, (cl_device_id device))
|
||||
{
|
||||
if (!is_valid(device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
as_amd(device)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clReleaseDeviceEXT, (cl_device_id device))
|
||||
{
|
||||
if (!is_valid(device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
as_amd(device)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
#endif // cl_ext_device_fission
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clCreateSubDevices, (
|
||||
cl_device_id in_device,
|
||||
const cl_device_partition_property * partition_properties,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * out_devices,
|
||||
cl_uint * num_devices))
|
||||
{
|
||||
if (!is_valid(in_device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
if (partition_properties == NULL || *partition_properties == 0u) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
if ((num_devices == NULL && out_devices == NULL) ||
|
||||
(num_entries == 0 && out_devices != NULL)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
device::CreateSubDevicesInfoT<cl_device_partition_property> create_info;
|
||||
switch (*partition_properties) {
|
||||
case CL_DEVICE_PARTITION_EQUALLY:
|
||||
create_info.p_.type_.value_ = device::PartitionType::EQUALLY;
|
||||
create_info.p_.equally_.numComputeUnits_ =
|
||||
(size_t)partition_properties[1];
|
||||
break;
|
||||
case CL_DEVICE_PARTITION_BY_COUNTS:
|
||||
create_info.p_.type_.value_ = device::PartitionType::BY_COUNTS;
|
||||
create_info.initCountsList(partition_properties + 1);
|
||||
break;
|
||||
case CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN:
|
||||
create_info.p_.type_.value_ = device::PartitionType::BY_AFFINITY_DOMAIN;
|
||||
create_info.p_.byAffinityDomain_.value_ =
|
||||
(uint)partition_properties[1];
|
||||
break;
|
||||
default:
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
return as_amd(in_device)->createSubDevices(
|
||||
create_info, num_entries, out_devices, num_devices);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clRetainDevice, (cl_device_id device))
|
||||
{
|
||||
if (!is_valid(device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
as_amd(device)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clReleaseDevice, (cl_device_id device))
|
||||
{
|
||||
if (!is_valid(device)) {
|
||||
return CL_INVALID_DEVICE;
|
||||
}
|
||||
as_amd(device)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,393 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
|
||||
#include "platform/object.hpp"
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/command.hpp"
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
* \addtogroup CL_Events
|
||||
*
|
||||
* Event objects can be used to refer to a kernel execution command:
|
||||
* - clEnqueueNDRangeKernel
|
||||
* - clEnqueueTask
|
||||
* - clEnqueueNativeKernel
|
||||
*
|
||||
* or read, write, map and copy commands on memory objects:
|
||||
* - clEnqueue{Read|Write|Map}{Buffer|Image}
|
||||
* - clEnqueueCopy{Buffer|Image}
|
||||
* - clEnqueueCopyBufferToImage
|
||||
* - clEnqueueCopyImageToBuffer
|
||||
*
|
||||
* An event object can be used to track the execution status of a command.
|
||||
* The execution status of a command at any given point in time can be
|
||||
* CL_QUEUED (is currently in the command queue),
|
||||
* CL_RUNNING (device is currently executing this command),
|
||||
* CL_COMPLETE (command has successfully completed) or the appropriate error
|
||||
* code if the command was abnormally terminated (this may be caused by a bad
|
||||
* memory access etc.). The error code returned by a terminated command is
|
||||
* a negative integer value. A command is considered to be complete if its
|
||||
* execution status is CL_COMPLETE or is a negative integer value.
|
||||
*
|
||||
* If the execution of a command is terminated, the command-queue associated
|
||||
* with this terminated command, and the associated context (and all other
|
||||
* command-queues in this context) may no longer be available. The behavior of
|
||||
* OpenCL API calls that use this context (and command-queues associated with
|
||||
* this context) are now considered to be implementationdefined. The user
|
||||
* registered callback function specified when context is created can be used
|
||||
* to report appropriate error information.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/*! \brief Wait on the host thread for commands identified by event objects in
|
||||
* event_list to complete.
|
||||
*
|
||||
* A command is considered complete if its execution status is CL_COMPLETE or
|
||||
* a negative value. The events specified in event_list act as synchronization
|
||||
* points.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the function was executed successfully.
|
||||
* - CL_INVALID_VALUE if \a num_events is zero
|
||||
* - CL_INVALID_CONTEXT if events specified in \a event_list do not belong to
|
||||
* the same context
|
||||
* - CL_INVALID_EVENT if event objects specified in \a event_list are not valid
|
||||
* event objects.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
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
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
/*! \brief Return information about the event object.
|
||||
*
|
||||
* \param event specifies the event object being queried.
|
||||
*
|
||||
* \param param_name specifies the information to query.
|
||||
*
|
||||
* \param param_value is a pointer to memory where the appropriate result being
|
||||
* queried is returned. If \a param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size is used to specify the size in bytes of memory
|
||||
* pointed to by \a param_value. This size must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data copied
|
||||
* to \a param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* Using clGetEventInfo to determine if a command identified by event has
|
||||
* finished execution (i.e. CL_EVENT_COMMAND_EXECUTION_STATUS returns
|
||||
* CL_COMPLETE) is not a synchronization point i.e. there are no guarantees
|
||||
* that the memory objects being modified by command associated with event will
|
||||
* be visible to other enqueued commands.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the function is executed successfully
|
||||
* - CL_INVALID_VALUE if \a param_name is not valid, or if size in bytes
|
||||
* specified by \a param_value_size is < size of return type and
|
||||
* \a param_value is not NULL
|
||||
* - CL_INVALID_EVENT if \a event is a not a valid event object.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
switch(param_name) {
|
||||
case CL_EVENT_CONTEXT: {
|
||||
cl_context context = as_cl(&as_amd(event)->context());
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Increment the event reference count.
|
||||
*
|
||||
* \return CL_SUCCESS if the function is executed successfully. It returns
|
||||
* CL_INVALID_EVENT if \a event is not a valid event object.
|
||||
*
|
||||
* The OpenCL commands that return an event perform an implicit retain.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Decrement the event reference count.
|
||||
*
|
||||
* \return CL_SUCCESS if the function is executed successfully. It returns
|
||||
* CL_INVALID_EVENT if \a event is not a valid event object.
|
||||
*
|
||||
* The event object is deleted once the reference count becomes zero, the
|
||||
* specific command identified by this event has completed (or terminated) and
|
||||
* there are no commands in the command-queues of a context that require a wait
|
||||
* for this event to complete.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Creates a user event object.
|
||||
*
|
||||
* User events allow applications to enqueue commands that wait on a user event
|
||||
* to finish before the command is executed by the device.
|
||||
*
|
||||
* \return a valid non-zero event object and errcode_ret is set to CL_SUCCESS
|
||||
* if the user event object is created successfully. Otherwise, it returns
|
||||
* a NULL value with one of the following error values returned in errcode_ret:
|
||||
* - CL_INVALID_CONTEXT if context is not a valid context.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
|
||||
* required by the OpenCL implementation on the host.
|
||||
*
|
||||
* The execution status of the user event object created is set to CL_SUBMITTED.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Sets the execution status of a user event object.
|
||||
*
|
||||
* \a event is a user event object created using clCreateUserEvent.
|
||||
* \a execution_status specifies the new execution status to be set and can be
|
||||
* CL_COMPLETE or a negative integer value to indicate an error.
|
||||
* clSetUserEventStatus can only be called once to change the execution status
|
||||
* of event.
|
||||
*
|
||||
* \return CL_SUCCESS if the function was executed successfully. Otherwise,
|
||||
* it returns one of the following errors:
|
||||
* - CL_INVALID_EVENT if event is not a valid user event object.
|
||||
* - CL_INVALID_VALUE if the execution_status is not CL_COMPLETE or
|
||||
* a negative integer value.
|
||||
* - CL_INVALID_OPERATION if the execution_status for event has already been
|
||||
* changed by a previous call to clSetUserEventStatus.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
as_amd(event)->setStatus(execution_status);
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Registers a user callback function for a specific command execution
|
||||
* status.
|
||||
*
|
||||
* The registered callback function will be called when the execution status
|
||||
* of command associated with event changes to the execution status specified
|
||||
* by command_exec_status.
|
||||
*
|
||||
* Each call to clSetEventCallback registers the specified user callback
|
||||
* function on a callback stack associated with event. The order in which the
|
||||
* registered user callback functions are called is undefined.
|
||||
*
|
||||
* \a event is a valid event object.
|
||||
* \a command_exec_callback_type specifies the command execution status for
|
||||
* which the callback is registered. The command execution callback mask
|
||||
* values for which a callback can be registered are: CL_COMPLETE.
|
||||
* There is no guarantee that the callback functions registered for various
|
||||
* execution status values for an event will be called in the exact order
|
||||
* that the execution status of a command changes.
|
||||
* \a pfn_event_notify is the event callback function that can be registered
|
||||
* by the application. This callback function may be called asynchronously
|
||||
* by the OpenCL implementation. It is the application’s responsibility to
|
||||
* ensure that the callback function is thread-safe. The parameters to this
|
||||
* callback function are:
|
||||
* event is the event object for which the callback function is invoked.
|
||||
* event_command_exec_status represents the execution status of command
|
||||
* for which this callback function is invoked. If the callback is called
|
||||
* as the result of the command associated with event being abnormally
|
||||
* terminated, an appropriate error code for the error that caused the
|
||||
* termination will be passed to event_command_exec_status instead.
|
||||
* \a user_data is a pointer to user supplied data. user_data will be passed as
|
||||
* the user_data argument when pfn_notify is called. user_data can be NULL.
|
||||
*
|
||||
* All callbacks registered for an event object must be called. All enqueued
|
||||
* callbacks shall be called before the event object is destroyed. Callbacks
|
||||
* must return promptly. The behavior of calling expensive system routines,
|
||||
* OpenCL API calls to create contexts or command-queues, or blocking OpenCL
|
||||
* operations from the following list below, in a callback is undefined.
|
||||
* clFinish, clWaitForEvents, blocking calls to clEnqueueReadBuffer,
|
||||
* clEnqueueReadBufferRect, clEnqueueWriteBuffer, clEnqueueWriteBufferRect,
|
||||
* blocking calls to clEnqueueReadImage and clEnqueueWriteImage, blocking
|
||||
* calls to clEnqueueMapBuffer and clEnqueueMapImage, blocking calls to
|
||||
* clBuildProgram
|
||||
*
|
||||
* If an application needs to wait for completion of a routine from the above
|
||||
* list in a callback, please use the non-blocking form of the function, and
|
||||
* assign a completion callback to it to do the remainder of your work.
|
||||
* Note that when a callback (or other code) enqueues commands to a
|
||||
* command-queue, the commands are not required to begin execution until the
|
||||
* queue is flushed. In standard usage, blocking enqueue calls serve this role
|
||||
* by implicitly flushing the queue. Since blocking calls are not permitted in
|
||||
* callbacks, those callbacks that enqueue commands on a command queue should
|
||||
* either call clFlush on the queue before returning or arrange for clFlush
|
||||
* to be called later on another thread.
|
||||
*
|
||||
* \return CL_SUCCESS if the function is executed successfully. Otherwise,
|
||||
* it returns one of the following errors:
|
||||
* - CL_INVALID_EVENT if event is not a valid event object or is a user event
|
||||
* object created using clCreateUserEvent.
|
||||
* - CL_INVALID_VALUE if pfn_event_notify is NULL or if
|
||||
* command_exec_callback_type is not a valid command execution status.
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources
|
||||
* required by the OpenCL implementation on the host.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
as_amd(event)->notifyCmdQueue();
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
|
||||
File diff soppresso perché troppo grande
Carica Diff
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,348 @@
|
||||
//
|
||||
// Copyright 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef CL_GL_AMD_HPP_
|
||||
#define CL_GL_AMD_HPP_
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else //!_WIN32
|
||||
#include <dlfcn.h>
|
||||
#endif //!_WIN32
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glext.h>
|
||||
#include "CL/cl_gl.h"
|
||||
#ifndef _WIN32
|
||||
#include <GL/glx.h>
|
||||
#endif //!_WIN32
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/command.hpp"
|
||||
|
||||
namespace amd
|
||||
{
|
||||
|
||||
//! Class GLObject keeps all the info about the GL object
|
||||
//! from which the CL object is created
|
||||
class GLObject : public InteropObject
|
||||
{
|
||||
protected:
|
||||
cl_gl_object_type clGLType_; //!< CL GL object type
|
||||
GLenum glTarget_;
|
||||
GLuint gluiName_;
|
||||
GLint gliMipLevel_;
|
||||
GLenum glInternalFormat_;
|
||||
GLint gliWidth_;
|
||||
GLint gliHeight_;
|
||||
GLint gliDepth_;
|
||||
GLenum glCubemapFace_;
|
||||
GLsizei glNumSamples_;
|
||||
//! Need to pass PBO name from acquire to release
|
||||
GLuint gluiPBO_;
|
||||
|
||||
// @todo: TBD: Do we need to sync data after access
|
||||
// or it'll be done by the GL driver?
|
||||
cl_int cliChecksum_;
|
||||
|
||||
public:
|
||||
//! GLObject constructor initializes member variables
|
||||
GLObject(
|
||||
GLenum glTarget,
|
||||
GLuint gluiName,
|
||||
GLint gliMipLevel,
|
||||
GLenum glInternalFormat,
|
||||
GLint gliWidth,
|
||||
GLint gliHeight,
|
||||
GLint gliDepth,
|
||||
cl_gl_object_type clGLType,
|
||||
GLenum glCubemapFace,
|
||||
GLsizei glNumSamples
|
||||
): // Initialization of member variables
|
||||
clGLType_(clGLType),
|
||||
glTarget_(glTarget),
|
||||
gluiName_(gluiName),
|
||||
gliMipLevel_(gliMipLevel),
|
||||
glInternalFormat_(glInternalFormat),
|
||||
gliWidth_(gliWidth),
|
||||
gliHeight_(gliHeight),
|
||||
gliDepth_(gliDepth),
|
||||
glCubemapFace_(glCubemapFace),
|
||||
glNumSamples_(glNumSamples),
|
||||
cliChecksum_(0)
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~GLObject() {}
|
||||
virtual GLObject* asGLObject() {return this;}
|
||||
|
||||
//! GLObject query functions to get GL info from member variables
|
||||
GLenum getGLTarget() const {return glTarget_;}
|
||||
GLuint getGLName() const {return gluiName_;}
|
||||
GLint getGLMipLevel() const {return gliMipLevel_;}
|
||||
GLenum getGLInternalFormat() const {return glInternalFormat_;}
|
||||
GLint getGLSize() const {return gliWidth_;}
|
||||
GLint getGLWidth() const {return gliWidth_;}
|
||||
GLint getGLHeight() const {return gliHeight_;}
|
||||
GLint getGLDepth() const {return gliDepth_;}
|
||||
cl_gl_object_type getCLGLObjectType() const { return clGLType_; }
|
||||
GLenum getCubemapFace() const {return glCubemapFace_;}
|
||||
GLsizei getNumSamples() const { return glNumSamples_;}
|
||||
void setPBOName(GLuint gluiName) {gluiPBO_ = gluiName;}
|
||||
GLuint getPBOName() const {return gluiPBO_;}
|
||||
|
||||
};
|
||||
|
||||
|
||||
//! Class BufferGL is drived from classes Buffer and GLObject
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for GL object
|
||||
class BufferGL : public Buffer, public GLObject
|
||||
{
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'BufferGL' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
public:
|
||||
//! BufferGL constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
BufferGL(
|
||||
Context& amdContext,
|
||||
cl_mem_flags clFlags,
|
||||
size_t uiSizeInBytes,
|
||||
GLenum glTarget,
|
||||
GLuint gluiName)
|
||||
: // Call base classes constructors
|
||||
Buffer(
|
||||
amdContext,
|
||||
clFlags,
|
||||
uiSizeInBytes
|
||||
),
|
||||
GLObject(
|
||||
glTarget,
|
||||
gluiName,
|
||||
0, // Mipmap level default
|
||||
GL_ARRAY_BUFFER, // Just init to some value
|
||||
(GLint) uiSizeInBytes,
|
||||
1,
|
||||
1,
|
||||
CL_GL_OBJECT_BUFFER,
|
||||
0,
|
||||
0
|
||||
)
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
virtual ~BufferGL() {}
|
||||
|
||||
virtual BufferGL* asBufferGL() { return this; }
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
};
|
||||
|
||||
|
||||
//! Class ImageGL is derived from classes Image and GLObject
|
||||
//! where the former keeps all data for CL object and
|
||||
//! the latter keeps all data for GL object
|
||||
class ImageGL : public Image, public GLObject
|
||||
{
|
||||
public:
|
||||
//! ImageGL constructor just calls constructors of base classes
|
||||
//! to pass down the parameters
|
||||
ImageGL(
|
||||
Context& amdContext,
|
||||
cl_mem_object_type clType,
|
||||
cl_mem_flags clFlags,
|
||||
const Format& format,
|
||||
size_t width,
|
||||
size_t height,
|
||||
size_t depth,
|
||||
GLenum glTarget,
|
||||
GLuint gluiName,
|
||||
GLint gliMipLevel,
|
||||
GLenum glInternalFormat,
|
||||
cl_gl_object_type clGLType,
|
||||
GLsizei numSamples,
|
||||
GLenum glCubemapFace = 0)
|
||||
: Image(amdContext, clType, clFlags, format, width, height, depth,
|
||||
Format(format).getElementSize() * width,
|
||||
Format(format).getElementSize() * width * depth)
|
||||
, GLObject(glTarget, gluiName, gliMipLevel, glInternalFormat,
|
||||
static_cast<GLint>(width), static_cast<GLint>(height),
|
||||
static_cast<GLint>(depth), clGLType, glCubemapFace,numSamples)
|
||||
{
|
||||
setInteropObj(this);
|
||||
}
|
||||
|
||||
virtual ~ImageGL() {}
|
||||
|
||||
//! For CPU device only!
|
||||
virtual bool mapExtObjectInCQThread(void);
|
||||
virtual bool unmapExtObjectInCQThread(void);
|
||||
|
||||
protected:
|
||||
//! Initializes the device memory array which is nested
|
||||
// after'BufferGL' object in memory layout.
|
||||
virtual void initDeviceMemory();
|
||||
};
|
||||
|
||||
#ifdef _WIN32
|
||||
#define APICALL WINAPI
|
||||
#define GETPROCADDRESS GetProcAddress
|
||||
#define API_GETPROCADDR "wglGetProcAddress"
|
||||
#define FCN_STR_TYPE LPCSTR
|
||||
typedef PROC (WINAPI* PFN_xxxGetProcAddress) (LPCSTR fcnName);
|
||||
#else //!_WIN32
|
||||
#define APICALL // __stdcall //??? todo odintsov
|
||||
#define API_GETPROCADDR "glXGetProcAddress"
|
||||
#define GETPROCADDRESS dlsym
|
||||
#define FCN_STR_TYPE const GLubyte*
|
||||
#define WINAPI
|
||||
#define PROC void*
|
||||
typedef void* (*PFN_xxxGetProcAddress) (const GLubyte* procName);
|
||||
// X11 typedef
|
||||
typedef Display* (*PFNXOpenDisplay)(_Xconst char* display_name );
|
||||
typedef int (*PFNXCloseDisplay)(Display* display );
|
||||
|
||||
//glx typedefs
|
||||
typedef GLXDrawable (*PFNglXGetCurrentDrawable)();
|
||||
typedef Display* (*PFNglXGetCurrentDisplay)();
|
||||
typedef GLXContext (*PFNglXGetCurrentContext)( void );
|
||||
typedef XVisualInfo* (*PFNglXChooseVisual)(Display *dpy, int screen, int *attribList);
|
||||
typedef GLXContext(*PFNglXCreateContext)(Display* dpy,XVisualInfo* vis,GLXContext shareList,Bool direct);
|
||||
typedef void(*PFNglXDestroyContext)(Display* dpy, GLXContext ctx);
|
||||
typedef Bool(*PFNglXMakeCurrent)( Display* dpy, GLXDrawable drawable, GLXContext ctx);
|
||||
typedef void* HMODULE;
|
||||
|
||||
#endif //!_WIN32
|
||||
|
||||
#define GLPREFIX(rtype, fcn, dclargs) \
|
||||
typedef rtype (APICALL* PFN_##fcn) dclargs;
|
||||
|
||||
// Declare prototypes for GL functions
|
||||
#include "gl_functions.hpp"
|
||||
|
||||
class GLFunctions
|
||||
{
|
||||
public:
|
||||
//! Locks any access to the virtual GPUs
|
||||
class SetIntEnv : public amd::StackObject {
|
||||
public:
|
||||
//! Default constructor
|
||||
SetIntEnv(GLFunctions* env);
|
||||
|
||||
//! Destructor
|
||||
~SetIntEnv();
|
||||
|
||||
//! Checks if the environment setup was successful
|
||||
bool isValid() const { return isValid_; }
|
||||
|
||||
private:
|
||||
GLFunctions* env_; //!< GL environment
|
||||
bool isValid_; //!< If TRUE, then it's a valid setup
|
||||
};
|
||||
|
||||
private:
|
||||
HMODULE libHandle_;
|
||||
int missed_; // Indicates how many GL functions not init'ed, if any
|
||||
|
||||
amd::Monitor lock_;
|
||||
|
||||
#ifdef _WIN32
|
||||
HGLRC hOrigGLRC_;
|
||||
HDC hDC_;
|
||||
HGLRC hIntGLRC_; // handle for internal GLRC to access shared context
|
||||
HDC tempDC_;
|
||||
HGLRC tempGLRC_;
|
||||
#else
|
||||
public:
|
||||
Display* Dpy_;
|
||||
GLXDrawable Drawable_;
|
||||
GLXContext origCtx_;
|
||||
Display* intDpy_;
|
||||
Window intDrawable_;
|
||||
GLXContext intCtx_;
|
||||
Display* tempDpy_;
|
||||
GLXDrawable tempDrawable_;
|
||||
GLXContext tempCtx_;
|
||||
|
||||
//pointers to X11 functions
|
||||
PFNXOpenDisplay XOpenDisplay_;
|
||||
PFNXCloseDisplay XCloseDisplay_;
|
||||
|
||||
//pointers to GLX functions
|
||||
PFNglXGetCurrentDrawable glXGetCurrentDrawable_;
|
||||
PFNglXGetCurrentDisplay glXGetCurrentDisplay_;
|
||||
PFNglXGetCurrentContext glXGetCurrentContext_;
|
||||
PFNglXChooseVisual glXChooseVisual_;
|
||||
PFNglXCreateContext glXCreateContext_;
|
||||
PFNglXDestroyContext glXDestroyContext_;
|
||||
PFNglXMakeCurrent glXMakeCurrent_;
|
||||
#endif
|
||||
public:
|
||||
|
||||
GLFunctions(HMODULE h);
|
||||
~GLFunctions();
|
||||
|
||||
// Query CL-GL context association
|
||||
bool isAssociated() const
|
||||
{
|
||||
#ifdef _WIN32
|
||||
if(hDC_ && hOrigGLRC_) return true;
|
||||
#else //!_WIN32
|
||||
if(Dpy_ && origCtx_) return true;
|
||||
#endif //!_WIN32
|
||||
return false;
|
||||
}
|
||||
// Accessor methods
|
||||
#ifdef _WIN32
|
||||
HGLRC getOrigGLRC() const {return hOrigGLRC_;}
|
||||
HDC getDC() const {return hDC_;}
|
||||
HGLRC getIntGLRC() const {return hIntGLRC_;}
|
||||
#else //!_WIN32
|
||||
Display* getDpy() const {return Dpy_;}
|
||||
GLXDrawable getDrawable() const {return Drawable_;}
|
||||
GLXContext getOrigCtx() const {return origCtx_;}
|
||||
|
||||
Display* getIntDpy() const {return intDpy_;}
|
||||
GLXDrawable getIntDrawable() const {return intDrawable_;}
|
||||
GLXContext getIntCtx() const {return intCtx_;}
|
||||
#endif //!_WIN32
|
||||
|
||||
// Initialize GL dynamic library and function pointers
|
||||
bool init(intptr_t hdc, intptr_t hglrc);
|
||||
|
||||
// Return true if successful, false - if error occurred
|
||||
bool setIntEnv();
|
||||
bool restoreEnv();
|
||||
|
||||
amd::Monitor& getLock() { return lock_; }
|
||||
|
||||
PFN_xxxGetProcAddress GetProcAddress_;
|
||||
|
||||
#define GLPREFIX(rtype, fcn, dclargs) \
|
||||
PFN_##fcn fcn##_;
|
||||
// Declare pointers to GL functions
|
||||
#include "gl_functions.hpp"
|
||||
};
|
||||
|
||||
//! Functions for executing the GL related stuff
|
||||
cl_mem clCreateFromGLBufferAMD(Context& amdContext, cl_mem_flags flags,
|
||||
GLuint bufobj, cl_int* errcode_ret);
|
||||
cl_mem clCreateFromGLTextureAMD(Context& amdContext, cl_mem_flags flags,
|
||||
GLenum target, GLint miplevel, GLuint texture, int* errcode_ret);
|
||||
cl_mem clCreateFromGLRenderbufferAMD(Context& amdContext, cl_mem_flags flags,
|
||||
GLuint renderbuffer, int* errcode_ret);
|
||||
|
||||
bool
|
||||
getCLFormatFromGL(
|
||||
const Context& amdContext,
|
||||
GLint gliInternalFormat,
|
||||
cl_image_format* pclImageFormat,
|
||||
int* piBytesPerPixel);
|
||||
|
||||
} //namespace amd
|
||||
|
||||
#endif //CL_GL_AMD_HPP_
|
||||
@@ -0,0 +1,235 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
#ifdef _WIN32
|
||||
#include <d3d10_1.h>
|
||||
#include "cl_d3d9_amd.hpp"
|
||||
#include "cl_d3d10_amd.hpp"
|
||||
#include "cl_d3d11_amd.hpp"
|
||||
#endif //_WIN32
|
||||
|
||||
#include <icd/icd_dispatch.h>
|
||||
|
||||
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
|
||||
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);
|
||||
}
|
||||
|
||||
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,
|
||||
|
||||
/* 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(clGetDeviceIDsFromDX9MediaAdapterKHR,NULL),//KHRpfn_clGetDeviceIDsFromDX9MediaAdapterKHR clGetDeviceIDsFromDX9MediaAdapterKHR;
|
||||
WINDOWS_SWITCH(clEnqueueAcquireDX9MediaSurfacesKHR, NULL), //KHRpfn_clEnqueueAcquireDX9MediaSurfacesKHR clEnqueueAcquireDX9MediaSurfacesKHR;
|
||||
WINDOWS_SWITCH(clEnqueueReleaseDX9MediaSurfacesKHR, NULL), //KHRpfn_clEnqueueReleaseDX9MediaSurfacesKHR clEnqueueReleaseDX9MediaSurfacesKHR;
|
||||
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
|
||||
clCreateCommandQueueWithProperties,
|
||||
clCreatePipe,
|
||||
clGetPipeInfo,
|
||||
clSVMAlloc,
|
||||
clSVMFree,
|
||||
clEnqueueSVMFree,
|
||||
clEnqueueSVMMemcpy,
|
||||
clEnqueueSVMMemFill,
|
||||
clEnqueueSVMMap,
|
||||
clEnqueueSVMUnmap,
|
||||
clCreateSamplerWithProperties,
|
||||
clSetKernelArgSVMPointer,
|
||||
clSetKernelExecInfo,
|
||||
|
||||
clGetKernelSubGroupInfoKHR,
|
||||
clTerminateContextKHR
|
||||
}};
|
||||
|
||||
CL_API_ENTRY cl_int CL_API_CALL
|
||||
clIcdGetPlatformIDsKHR(
|
||||
cl_uint num_entries,
|
||||
cl_platform_id * platforms,
|
||||
cl_uint * num_platforms)
|
||||
{
|
||||
if (!amd::Runtime::initialized()) {
|
||||
amd::Runtime::init();
|
||||
}
|
||||
|
||||
if (((num_entries > 0 || num_platforms == NULL) && platforms == NULL)
|
||||
|| (num_entries == 0 && platforms != NULL)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
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;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,981 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2008-2010 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __OPENCL_CL_ICD_H
|
||||
#define __OPENCL_CL_ICD_H
|
||||
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_gl.h>
|
||||
|
||||
#define cl_khr_icd 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetPlatformIDs_fn)(
|
||||
cl_uint /* num_entries */,
|
||||
cl_platform_id * /* platforms */,
|
||||
cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetPlatformInfo_fn)(
|
||||
cl_platform_id /* platform */,
|
||||
cl_platform_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetDeviceIDs_fn)(
|
||||
cl_platform_id /* platform */,
|
||||
cl_device_type /* device_type */,
|
||||
cl_uint /* num_entries */,
|
||||
cl_device_id * /* devices */,
|
||||
cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetDeviceInfo_fn)(
|
||||
cl_device_id /* device */,
|
||||
cl_device_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_context (CL_API_CALL * clCreateContext_fn)(
|
||||
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_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_context (CL_API_CALL * clCreateContextFromType_fn)(
|
||||
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 */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clRetainContext_fn)(
|
||||
cl_context /* context */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clReleaseContext_fn)(
|
||||
cl_context /* context */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetContextInfo_fn)(
|
||||
cl_context /* context */,
|
||||
cl_context_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_command_queue (CL_API_CALL * clCreateCommandQueue_fn)(
|
||||
cl_context /* context */,
|
||||
cl_device_id /* device */,
|
||||
cl_command_queue_properties /* properties */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clRetainCommandQueue_fn)(
|
||||
cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clReleaseCommandQueue_fn)(
|
||||
cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetCommandQueueInfo_fn)(
|
||||
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 */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clSetCommandQueueProperty_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_command_queue_properties /* properties */,
|
||||
cl_bool /* enable */,
|
||||
cl_command_queue_properties * /* old_properties */) /*CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED*/;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateBuffer_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
size_t /* size */,
|
||||
void * /* host_ptr */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateSubBuffer_fn)(
|
||||
cl_mem /* buffer */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_buffer_create_type /* buffer_create_type */,
|
||||
const void * /* buffer_create_info */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateImage2D_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
const cl_image_format * /* image_format */,
|
||||
size_t /* image_width */,
|
||||
size_t /* image_height */,
|
||||
size_t /* image_row_pitch */,
|
||||
void * /* host_ptr */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateImage3D_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
const cl_image_format * /* image_format */,
|
||||
size_t /* image_width */,
|
||||
size_t /* image_height */,
|
||||
size_t /* image_depth */,
|
||||
size_t /* image_row_pitch */,
|
||||
size_t /* image_slice_pitch */,
|
||||
void * /* host_ptr */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clRetainMemObject_fn)(
|
||||
cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clReleaseMemObject_fn)(
|
||||
cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetSupportedImageFormats_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_mem_object_type /* image_type */,
|
||||
cl_uint /* num_entries */,
|
||||
cl_image_format * /* image_formats */,
|
||||
cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetMemObjectInfo_fn)(
|
||||
cl_mem /* memobj */,
|
||||
cl_mem_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetImageInfo_fn)(
|
||||
cl_mem /* image */,
|
||||
cl_image_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clSetMemObjectDestructorCallback_fn)(
|
||||
cl_mem /* memobj */,
|
||||
void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/),
|
||||
void * /*user_data */ ) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
/* Sampler APIs */
|
||||
typedef cl_sampler (CL_API_CALL * clCreateSampler_fn)(
|
||||
cl_context /* context */,
|
||||
cl_bool /* normalized_coords */,
|
||||
cl_addressing_mode /* addressing_mode */,
|
||||
cl_filter_mode /* filter_mode */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clRetainSampler_fn)(
|
||||
cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clReleaseSampler_fn)(
|
||||
cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetSamplerInfo_fn)(
|
||||
cl_sampler /* sampler */,
|
||||
cl_sampler_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* Program Object APIs */
|
||||
typedef cl_program (CL_API_CALL * clCreateProgramWithSource_fn)(
|
||||
cl_context /* context */,
|
||||
cl_uint /* count */,
|
||||
const char ** /* strings */,
|
||||
const size_t * /* lengths */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_program (CL_API_CALL * clCreateProgramWithBinary_fn)(
|
||||
cl_context /* context */,
|
||||
cl_uint /* num_devices */,
|
||||
const cl_device_id * /* device_list */,
|
||||
const size_t * /* lengths */,
|
||||
const unsigned char ** /* binaries */,
|
||||
cl_int * /* binary_status */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clRetainProgram_fn)(
|
||||
cl_program /* program */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clReleaseProgram_fn)(
|
||||
cl_program /* program */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clBuildProgram_fn)(
|
||||
cl_program /* program */,
|
||||
cl_uint /* num_devices */,
|
||||
const cl_device_id * /* device_list */,
|
||||
const char * /* options */,
|
||||
void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */),
|
||||
void * /* user_data */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clUnloadCompiler_fn)(void) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetProgramInfo_fn)(
|
||||
cl_program /* program */,
|
||||
cl_program_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetProgramBuildInfo_fn)(
|
||||
cl_program /* program */,
|
||||
cl_device_id /* device */,
|
||||
cl_program_build_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* Kernel Object APIs */
|
||||
typedef cl_kernel (CL_API_CALL * clCreateKernel_fn)(
|
||||
cl_program /* program */,
|
||||
const char * /* kernel_name */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clCreateKernelsInProgram_fn)(
|
||||
cl_program /* program */,
|
||||
cl_uint /* num_kernels */,
|
||||
cl_kernel * /* kernels */,
|
||||
cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clRetainKernel_fn)(
|
||||
cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clReleaseKernel_fn)(
|
||||
cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clSetKernelArg_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_uint /* arg_index */,
|
||||
size_t /* arg_size */,
|
||||
const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetKernelInfo_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_kernel_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetKernelWorkGroupInfo_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_device_id /* device */,
|
||||
cl_kernel_work_group_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* Event Object APIs */
|
||||
typedef cl_int (CL_API_CALL * clWaitForEvents_fn)(
|
||||
cl_uint /* num_events */,
|
||||
const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetEventInfo_fn)(
|
||||
cl_event /* event */,
|
||||
cl_event_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_event (CL_API_CALL * clCreateUserEvent_fn)(
|
||||
cl_context /* context */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clRetainEvent_fn)(
|
||||
cl_event /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clReleaseEvent_fn)(
|
||||
cl_event /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clSetUserEventStatus_fn)(
|
||||
cl_event /* event */,
|
||||
cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clSetEventCallback_fn)(
|
||||
cl_event /* event */,
|
||||
cl_int /* command_exec_callback_type */,
|
||||
void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *),
|
||||
void * /* user_data */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
/* Profiling APIs */
|
||||
typedef cl_int (CL_API_CALL * clGetEventProfilingInfo_fn)(
|
||||
cl_event /* event */,
|
||||
cl_profiling_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* Flush and Finish APIs */
|
||||
typedef cl_int (CL_API_CALL * clFlush_fn)(
|
||||
cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clFinish_fn)(
|
||||
cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* Enqueued Commands APIs */
|
||||
typedef cl_int (CL_API_CALL * clEnqueueReadBuffer_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* buffer */,
|
||||
cl_bool /* blocking_read */,
|
||||
size_t /* offset */,
|
||||
size_t /* cb */,
|
||||
void * /* ptr */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueReadBufferRect_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* buffer */,
|
||||
cl_bool /* blocking_read */,
|
||||
const size_t * /* buffer_offset */,
|
||||
const size_t * /* host_offset */,
|
||||
const size_t * /* region */,
|
||||
size_t /* buffer_row_pitch */,
|
||||
size_t /* buffer_slice_pitch */,
|
||||
size_t /* host_row_pitch */,
|
||||
size_t /* host_slice_pitch */,
|
||||
void * /* ptr */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueWriteBuffer_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* buffer */,
|
||||
cl_bool /* blocking_write */,
|
||||
size_t /* offset */,
|
||||
size_t /* cb */,
|
||||
const void * /* ptr */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueWriteBufferRect_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* buffer */,
|
||||
cl_bool /* blocking_read */,
|
||||
const size_t * /* buffer_offset */,
|
||||
const size_t * /* host_offset */,
|
||||
const size_t * /* region */,
|
||||
size_t /* buffer_row_pitch */,
|
||||
size_t /* buffer_slice_pitch */,
|
||||
size_t /* host_row_pitch */,
|
||||
size_t /* host_slice_pitch */,
|
||||
const void * /* ptr */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueCopyBuffer_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* src_buffer */,
|
||||
cl_mem /* dst_buffer */,
|
||||
size_t /* src_offset */,
|
||||
size_t /* dst_offset */,
|
||||
size_t /* cb */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueCopyBufferRect_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* src_buffer */,
|
||||
cl_mem /* dst_buffer */,
|
||||
const size_t * /* src_origin */,
|
||||
const size_t * /* dst_origin */,
|
||||
const size_t * /* region */,
|
||||
size_t /* src_row_pitch */,
|
||||
size_t /* src_slice_pitch */,
|
||||
size_t /* dst_row_pitch */,
|
||||
size_t /* dst_slice_pitch */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueReadImage_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* image */,
|
||||
cl_bool /* blocking_read */,
|
||||
const size_t * /* origin[3] */,
|
||||
const size_t * /* region[3] */,
|
||||
size_t /* row_pitch */,
|
||||
size_t /* slice_pitch */,
|
||||
void * /* ptr */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueWriteImage_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* image */,
|
||||
cl_bool /* blocking_write */,
|
||||
const size_t * /* origin[3] */,
|
||||
const size_t * /* region[3] */,
|
||||
size_t /* input_row_pitch */,
|
||||
size_t /* input_slice_pitch */,
|
||||
const void * /* ptr */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueCopyImage_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* src_image */,
|
||||
cl_mem /* dst_image */,
|
||||
const size_t * /* src_origin[3] */,
|
||||
const size_t * /* dst_origin[3] */,
|
||||
const size_t * /* region[3] */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueCopyImageToBuffer_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* src_image */,
|
||||
cl_mem /* dst_buffer */,
|
||||
const size_t * /* src_origin[3] */,
|
||||
const size_t * /* region[3] */,
|
||||
size_t /* dst_offset */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueCopyBufferToImage_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* src_buffer */,
|
||||
cl_mem /* dst_image */,
|
||||
size_t /* src_offset */,
|
||||
const size_t * /* dst_origin[3] */,
|
||||
const size_t * /* region[3] */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef void * (CL_API_CALL * clEnqueueMapBuffer_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* buffer */,
|
||||
cl_bool /* blocking_map */,
|
||||
cl_map_flags /* map_flags */,
|
||||
size_t /* offset */,
|
||||
size_t /* cb */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef void * (CL_API_CALL * clEnqueueMapImage_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* image */,
|
||||
cl_bool /* blocking_map */,
|
||||
cl_map_flags /* map_flags */,
|
||||
const size_t * /* origin[3] */,
|
||||
const size_t * /* region[3] */,
|
||||
size_t * /* image_row_pitch */,
|
||||
size_t * /* image_slice_pitch */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueUnmapMemObject_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* memobj */,
|
||||
void * /* mapped_ptr */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueNDRangeKernel_fn)(
|
||||
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 */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueTask_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_kernel /* kernel */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueNativeKernel_fn)(
|
||||
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 */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueMarker_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueWaitForEvents_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_events */,
|
||||
const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueBarrier_fn)(
|
||||
cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef void * (CL_API_CALL * clGetExtensionFunctionAddress_fn)(
|
||||
const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateFromGLBuffer_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLuint /* bufobj */,
|
||||
int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateFromGLTexture2D_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateFromGLTexture3D_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateFromGLRenderbuffer_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLuint /* renderbuffer */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetGLObjectInfo_fn)(
|
||||
cl_mem /* memobj */,
|
||||
cl_gl_object_type * /* gl_object_type */,
|
||||
cl_GLuint * /* gl_object_name */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetGLTextureInfo_fn)(
|
||||
cl_mem /* memobj */,
|
||||
cl_gl_texture_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_event (CL_API_CALL * clCreateEventFromGLsyncKHR_fn) (
|
||||
cl_context /* context */,
|
||||
cl_GLsync /* cl_GLsync */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueAcquireGLObjects_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueReleaseGLObjects_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clCreateSubDevices_fn)(
|
||||
cl_device_id /* in_device */,
|
||||
const cl_device_partition_property * /* properties */,
|
||||
cl_uint /* num_entries */,
|
||||
cl_device_id * /* out_devices */,
|
||||
cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clRetainDevice_fn)(
|
||||
cl_device_id /* device */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clReleaseDevice_fn)(
|
||||
cl_device_id /* device */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateImage_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
const cl_image_format * /* image_format*/,
|
||||
const cl_image_desc * /* image_desc*/,
|
||||
void * /* host_ptr */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_program (CL_API_CALL * clCreateProgramWithBuiltInKernels_fn)(
|
||||
cl_context /* context */,
|
||||
cl_uint /* num_devices */,
|
||||
const cl_device_id * /* device_list */,
|
||||
const char * /* kernel_names */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clCompileProgram_fn)(
|
||||
cl_program /* program */,
|
||||
cl_uint /* num_devices */,
|
||||
const cl_device_id * /* device_list */,
|
||||
const char * /* options */,
|
||||
cl_uint /* num_input_headers */,
|
||||
const cl_program * /* input_headers */,
|
||||
const char ** /* header_include_names */,
|
||||
void (CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
|
||||
void * /* user_data */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_program (CL_API_CALL * clLinkProgram_fn)(
|
||||
cl_context /* context */,
|
||||
cl_uint /* num_devices */,
|
||||
const cl_device_id * /* device_list */,
|
||||
const char * /* options */,
|
||||
cl_uint /* num_input_programs */,
|
||||
const cl_program * /* input_programs */,
|
||||
void (CL_CALLBACK *pfn_notify)(cl_program program, void *user_data),
|
||||
void * /* user_data */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clUnloadPlatformCompiler_fn)(
|
||||
cl_platform_id /* platform */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetKernelArgInfo_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_uint /* arg_indx */,
|
||||
cl_kernel_arg_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueFillBuffer_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* buffer */,
|
||||
const void * /* pattern */,
|
||||
size_t /* pattern_size */,
|
||||
size_t /* offset */,
|
||||
size_t /* size */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueFillImage_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_mem /* image */,
|
||||
const void * /* fill_color */,
|
||||
const size_t * /* origin */,
|
||||
const size_t * /* region */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueMigrateMemObjects_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_mem_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_mem_migration_flags /* flags */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueMarkerWithWaitList_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueBarrierWithWaitList_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef void* (CL_API_CALL * clGetExtensionFunctionAddressForPlatform_fn)(
|
||||
cl_platform_id /* platform */,
|
||||
const char * /* funcname */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreateFromGLTexture_fn)(
|
||||
cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* texture_target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef cl_command_queue (CL_API_CALL * clCreateCommandQueueWithProperties_fn)(
|
||||
cl_context /* context */,
|
||||
cl_device_id /* device */,
|
||||
const cl_queue_properties * /* properties */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_sampler (CL_API_CALL * clCreateSamplerWithProperties_fn)(
|
||||
cl_context /* context */,
|
||||
const cl_sampler_properties * /* properties */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef void * (CL_API_CALL * clSVMAlloc_fn)(
|
||||
cl_context /* context */,
|
||||
cl_svm_mem_flags /* flags */,
|
||||
size_t /* size */,
|
||||
cl_uint /* alignment */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef void (CL_API_CALL * clSVMFree_fn)(
|
||||
cl_context /* context */,
|
||||
void * /* svm_pointer */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clSetKernelArgSVMPointer_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_uint /* arg_index */,
|
||||
const void * /* arg_value */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clSetKernelExecInfo_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_kernel_exec_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
const void * /* param_value */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueSVMFree_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_svm_pointers */,
|
||||
void *[] /* svm_pointers */,
|
||||
void (CL_CALLBACK * /* pfn_free_func */)(cl_command_queue /* queue */,
|
||||
cl_uint /* num_svm_pointers */,
|
||||
void *[] /* svm_pointers */,
|
||||
void * /* user_data */),
|
||||
void * /* user_data */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueSVMMemcpy_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_bool /* blocking_copy */,
|
||||
void * /* dst_ptr */,
|
||||
const void * /* src_ptr */,
|
||||
size_t /* size */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueSVMMemFill_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
void * /* svm_ptr */,
|
||||
const void * /* pattern */,
|
||||
size_t /* pattern_size */,
|
||||
size_t /* size */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueSVMMap_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
cl_bool /* blocking_map */,
|
||||
cl_map_flags /* flags */,
|
||||
void * /* svm_ptr */,
|
||||
size_t /* size */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clEnqueueSVMUnmap_fn)(
|
||||
cl_command_queue /* command_queue */,
|
||||
void * /* svm_ptr */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_mem (CL_API_CALL * clCreatePipe_fn)(
|
||||
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 */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetPipeInfo_fn)(
|
||||
cl_mem /* pipe */,
|
||||
cl_pipe_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
typedef cl_int (CL_API_CALL * clGetKernelSubGroupInfoKHR_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_device_id /* device */,
|
||||
cl_kernel_sub_group_info /* param_name */,
|
||||
size_t /* input_value_size */,
|
||||
const void * /* input_value */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_2_0;
|
||||
|
||||
|
||||
typedef struct _cl_icd_dispatch_table
|
||||
{
|
||||
/* OpenCL 1.0 */
|
||||
clGetPlatformIDs_fn GetPlatformIDs;
|
||||
clGetPlatformInfo_fn GetPlatformInfo;
|
||||
clGetDeviceIDs_fn GetDeviceIDs;
|
||||
clGetDeviceInfo_fn GetDeviceInfo;
|
||||
clCreateContext_fn CreateContext;
|
||||
clCreateContextFromType_fn CreateContextFromType;
|
||||
clRetainContext_fn RetainContext;
|
||||
clReleaseContext_fn ReleaseContext;
|
||||
clGetContextInfo_fn GetContextInfo;
|
||||
clCreateCommandQueue_fn CreateCommandQueue;
|
||||
clRetainCommandQueue_fn RetainCommandQueue;
|
||||
clReleaseCommandQueue_fn ReleaseCommandQueue;
|
||||
clGetCommandQueueInfo_fn GetCommandQueueInfo;
|
||||
clSetCommandQueueProperty_fn SetCommandQueueProperty;
|
||||
clCreateBuffer_fn CreateBuffer;
|
||||
clCreateImage2D_fn CreateImage2D;
|
||||
clCreateImage3D_fn CreateImage3D;
|
||||
clRetainMemObject_fn RetainMemObject;
|
||||
clReleaseMemObject_fn ReleaseMemObject;
|
||||
clGetSupportedImageFormats_fn GetSupportedImageFormats;
|
||||
clGetMemObjectInfo_fn GetMemObjectInfo;
|
||||
clGetImageInfo_fn GetImageInfo;
|
||||
clCreateSampler_fn CreateSampler;
|
||||
clRetainSampler_fn RetainSampler;
|
||||
clReleaseSampler_fn ReleaseSampler;
|
||||
clGetSamplerInfo_fn GetSamplerInfo;
|
||||
clCreateProgramWithSource_fn CreateProgramWithSource;
|
||||
clCreateProgramWithBinary_fn CreateProgramWithBinary;
|
||||
clRetainProgram_fn RetainProgram;
|
||||
clReleaseProgram_fn ReleaseProgram;
|
||||
clBuildProgram_fn BuildProgram;
|
||||
clUnloadCompiler_fn UnloadCompiler;
|
||||
clGetProgramInfo_fn GetProgramInfo;
|
||||
clGetProgramBuildInfo_fn GetProgramBuildInfo;
|
||||
clCreateKernel_fn CreateKernel;
|
||||
clCreateKernelsInProgram_fn CreateKernelsInProgram;
|
||||
clRetainKernel_fn RetainKernel;
|
||||
clReleaseKernel_fn ReleaseKernel;
|
||||
clSetKernelArg_fn SetKernelArg;
|
||||
clGetKernelInfo_fn GetKernelInfo;
|
||||
clGetKernelWorkGroupInfo_fn GetKernelWorkGroupInfo;
|
||||
clWaitForEvents_fn WaitForEvents;
|
||||
clGetEventInfo_fn GetEventInfo;
|
||||
clRetainEvent_fn RetainEvent;
|
||||
clReleaseEvent_fn ReleaseEvent;
|
||||
clGetEventProfilingInfo_fn GetEventProfilingInfo;
|
||||
clFlush_fn Flush;
|
||||
clFinish_fn Finish;
|
||||
clEnqueueReadBuffer_fn EnqueueReadBuffer;
|
||||
clEnqueueWriteBuffer_fn EnqueueWriteBuffer;
|
||||
clEnqueueCopyBuffer_fn EnqueueCopyBuffer;
|
||||
clEnqueueReadImage_fn EnqueueReadImage;
|
||||
clEnqueueWriteImage_fn EnqueueWriteImage;
|
||||
clEnqueueCopyImage_fn EnqueueCopyImage;
|
||||
clEnqueueCopyImageToBuffer_fn EnqueueCopyImageToBuffer;
|
||||
clEnqueueCopyBufferToImage_fn EnqueueCopyBufferToImage;
|
||||
clEnqueueMapBuffer_fn EnqueueMapBuffer;
|
||||
clEnqueueMapImage_fn EnqueueMapImage;
|
||||
clEnqueueUnmapMemObject_fn EnqueueUnmapMemObject;
|
||||
clEnqueueNDRangeKernel_fn EnqueueNDRangeKernel;
|
||||
clEnqueueTask_fn EnqueueTask;
|
||||
clEnqueueNativeKernel_fn EnqueueNativeKernel;
|
||||
clEnqueueMarker_fn EnqueueMarker;
|
||||
clEnqueueWaitForEvents_fn EnqueueWaitForEvents;
|
||||
clEnqueueBarrier_fn EnqueueBarrier;
|
||||
clGetExtensionFunctionAddress_fn GetExtensionFunctionAddress;
|
||||
clCreateFromGLBuffer_fn CreateFromGLBuffer;
|
||||
clCreateFromGLTexture2D_fn CreateFromGLTexture2D;
|
||||
clCreateFromGLTexture3D_fn CreateFromGLTexture3D;
|
||||
clCreateFromGLRenderbuffer_fn CreateFromGLRenderbuffer;
|
||||
clGetGLObjectInfo_fn GetGLObjectInfo;
|
||||
clGetGLTextureInfo_fn GetGLTextureInfo;
|
||||
clEnqueueAcquireGLObjects_fn EnqueueAcquireGLObjects;
|
||||
clEnqueueReleaseGLObjects_fn EnqueueReleaseGLObjects;
|
||||
clGetGLContextInfoKHR_fn GetGLContextInfoKHR;
|
||||
void* _reservedForD3D10KHR[6];
|
||||
/* OpenCL 1.1 */
|
||||
clSetEventCallback_fn SetEventCallback;
|
||||
clCreateSubBuffer_fn CreateSubBuffer;
|
||||
clSetMemObjectDestructorCallback_fn SetMemObjectDestructorCallback;
|
||||
clCreateUserEvent_fn CreateUserEvent;
|
||||
clSetUserEventStatus_fn SetUserEventStatus;
|
||||
clEnqueueReadBufferRect_fn EnqueueReadBufferRect;
|
||||
clEnqueueWriteBufferRect_fn EnqueueWriteBufferRect;
|
||||
clEnqueueCopyBufferRect_fn EnqueueCopyBufferRect;
|
||||
|
||||
void* _reservedForDeviceFissionEXT[3];
|
||||
clCreateEventFromGLsyncKHR_fn CreateEventFromGLsyncKHR;
|
||||
|
||||
/* OpenCL 1.2 */
|
||||
clCreateSubDevices_fn CreateSubDevices;
|
||||
clRetainDevice_fn RetainDevice;
|
||||
clReleaseDevice_fn ReleaseDevice;
|
||||
clCreateImage_fn CreateImage;
|
||||
clCreateProgramWithBuiltInKernels_fn CreateProgramWithBuiltInKernels;
|
||||
clCompileProgram_fn CompileProgram;
|
||||
clLinkProgram_fn LinkProgram;
|
||||
clUnloadPlatformCompiler_fn UnloadPlatformCompiler;
|
||||
clGetKernelArgInfo_fn GetKernelArgInfo;
|
||||
clEnqueueFillBuffer_fn EnqueueFillBuffer;
|
||||
clEnqueueFillImage_fn EnqueueFillImage;
|
||||
clEnqueueMigrateMemObjects_fn EnqueueMigrateMemObjects;
|
||||
clEnqueueMarkerWithWaitList_fn EnqueueMarkerWithWaitList;
|
||||
clEnqueueBarrierWithWaitList_fn EnqueueBarrierWithWaitList;
|
||||
clGetExtensionFunctionAddressForPlatform_fn GetExtensionFunctionAddressForPlatform;
|
||||
clCreateFromGLTexture_fn CreateFromGLTexture;
|
||||
|
||||
/* cl_khr_d3d11_sharing, cl_khr_dx9_media_sharing */
|
||||
void* _reservedD3DExtensions[10];
|
||||
|
||||
/* cl_khr_egl_image, cl_khr_egl_event */
|
||||
void* _reservedEGLExtensions[4];
|
||||
|
||||
/* OpenCL 2.0 */
|
||||
clCreateCommandQueueWithProperties_fn CreateCommandQueueWithProperties;
|
||||
clCreatePipe_fn CreatePipe;
|
||||
clGetPipeInfo_fn GetPipeInfo;
|
||||
clSVMAlloc_fn SVMAlloc;
|
||||
clSVMFree_fn SVMFree;
|
||||
clEnqueueSVMFree_fn EnqueueSVMFree;
|
||||
clEnqueueSVMMemcpy_fn EnqueueSVMMemcpy;
|
||||
clEnqueueSVMMemFill_fn EnqueueSVMMemFill;
|
||||
clEnqueueSVMMap_fn EnqueueSVMMap;
|
||||
clEnqueueSVMUnmap_fn EnqueueSVMUnmap;
|
||||
clCreateSamplerWithProperties_fn CreateSamplerWithProperties;
|
||||
clSetKernelArgSVMPointer_fn SetKernelArgSVMPointer;
|
||||
clSetKernelExecInfo_fn SetKernelExecInfo;
|
||||
|
||||
clGetKernelSubGroupInfoKHR_fn GetKernelSubGroupInfoKHR;
|
||||
clTerminateContextKHR_fn TerminateContextKHR;
|
||||
} cl_icd_dispatch_table;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __OPENCL_CL_ICD_H */
|
||||
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Advanced Micro Devices, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef CL_KERNEL_H_
|
||||
#define CL_KERNEL_H_
|
||||
|
||||
struct clk_builtins_t;
|
||||
|
||||
// This must be a multiple of sizeof(cl_ulong16)
|
||||
#define __CPU_SCRATCH_SIZE 128
|
||||
|
||||
#define CLK_PRIVATE_MEMORY_SIZE (8*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_builtins_t const * builtins;
|
||||
void* local_mem_base;
|
||||
const void * table_base;
|
||||
|
||||
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)*/
|
||||
};
|
||||
|
||||
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
|
||||
} clk_value_type_t;
|
||||
|
||||
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,
|
||||
|
||||
//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
|
||||
|
||||
} 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;
|
||||
};
|
||||
#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);
|
||||
|
||||
/* 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
|
||||
};
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#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[];
|
||||
} clk_pipe_t;
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#pragma warning( pop )
|
||||
#endif
|
||||
|
||||
#endif /*CL_KERNEL_H_*/
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
//
|
||||
// Copyright (c) 2009 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
#include "cl_common.hpp"
|
||||
#include "cl_kernel_info_amd.h"
|
||||
#include "platform/kernel.hpp"
|
||||
#include "platform/ndrange.hpp"
|
||||
#include "platform/command.hpp"
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup AMD_Extensions
|
||||
* @{
|
||||
*
|
||||
*/
|
||||
|
||||
/*! \brief Retrieves the kernel information.
|
||||
*
|
||||
* \param kernel specifies the kernel object being queried.
|
||||
*
|
||||
* \param device identifies a specific device in the list of devices associated
|
||||
* with \a kernel. The list of devices is the list of devices in the OpenCL
|
||||
* context that is associated with \a kernel. If the list of devices associated
|
||||
* with kernel is a single device, \a device can be a NULL value.
|
||||
*
|
||||
* \param param_name specifies the information to query.
|
||||
*
|
||||
* \param param_value is a pointer to memory where the appropriate result
|
||||
* being queried is returned. If \a param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size is used to specify the size in bytes of memory
|
||||
* pointed to by \a param_value. This size must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data copied
|
||||
* to \a param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the function is executed successfully
|
||||
* - CL_INVALID_VALUE if \a param_name is not valid, or if size in bytes
|
||||
* specified by \a param_value_size is < size of return type and
|
||||
* \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;
|
||||
}
|
||||
|
||||
// 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));
|
||||
|
||||
// Make sure we found a valid kernel
|
||||
if (devKernel == NULL) {
|
||||
return CL_INVALID_KERNEL;
|
||||
}
|
||||
|
||||
// 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);
|
||||
case CL_KERNELINFO_WAVEFRONT_PER_SIMD:
|
||||
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);
|
||||
case CL_KERNELINFO_AVAILABLE_GPRS:
|
||||
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);
|
||||
case CL_KERNELINFO_AVAILABLE_SGPRS:
|
||||
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);
|
||||
case CL_KERNELINFO_AVAILABLE_VGPRS:
|
||||
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);
|
||||
case CL_KERNELINFO_AVAILABLE_LDS_SIZE:
|
||||
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);
|
||||
case CL_KERNELINFO_AVAILABLE_STACK_SIZE:
|
||||
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);
|
||||
default:
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,165 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2009 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
|
||||
#ifndef __CL_KERNEL_INFO_AMD_H
|
||||
#define __CL_KERNEL_INFO_AMD_H
|
||||
|
||||
#include "CL/cl_platform.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
/*! \brief Retrieves the kernel information.
|
||||
*
|
||||
* \param kernel specifies the kernel object being queried.
|
||||
*
|
||||
* \param device identifies a specific device in the list of devices associated
|
||||
* with \a kernel. The list of devices is the list of devices in the OpenCL
|
||||
* context that is associated with \a kernel. If the list of devices associated
|
||||
* with kernel is a single device, \a device can be a NULL value.
|
||||
*
|
||||
* \param param_name specifies the information to query.
|
||||
*
|
||||
* \param param_value is a pointer to memory where the appropriate result
|
||||
* being queried is returned. If \a param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size is used to specify the size in bytes of memory
|
||||
* pointed to by \a param_value. This size must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data copied
|
||||
* to \a param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the function is executed successfully
|
||||
* - CL_INVALID_VALUE if \a param_name is not valid, or if size in bytes
|
||||
* specified by \a param_value_size is < size of return type and
|
||||
* \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;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*__CL_KERNEL_INFO_AMD_H*/
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,72 @@
|
||||
//
|
||||
// Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#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);
|
||||
|
||||
*not_null(errcode_ret) = amd::ObjectMetadata::check(key)
|
||||
? CL_SUCCESS : CL_OUT_OF_RESOURCES;
|
||||
|
||||
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;
|
||||
|
||||
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();
|
||||
|
||||
void* value = metadata.getValueForKey(key);
|
||||
if (value == NULL) {
|
||||
return CL_INVALID_KEY_AMD;
|
||||
}
|
||||
|
||||
*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;
|
||||
}
|
||||
|
||||
amd::ObjectMetadata& metadata =
|
||||
amd::RuntimeObject::fromHandle<amd::RuntimeObject>(object)->metadata();
|
||||
|
||||
metadata.setValueForKey(key, value);
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
@@ -0,0 +1,829 @@
|
||||
//
|
||||
// Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
#include "platform/command.hpp"
|
||||
#include <cstring>
|
||||
|
||||
#if cl_amd_open_video
|
||||
|
||||
#include "platform/video_session.hpp"
|
||||
|
||||
#include "cal.h"
|
||||
#include "calcl.h"
|
||||
|
||||
amd::HostQueue* staticQueue; //@todo fix the interface and remove hardcoded queue
|
||||
/* Helper function GetCalDecodeProfile()
|
||||
*/
|
||||
static bool
|
||||
GetCalVideoProfile(cl_video_decode_profile_amd clVideoProfile,
|
||||
CALdecodeProfile& calVideoProfile)
|
||||
{
|
||||
switch(clVideoProfile) {
|
||||
case CL_VIDEO_DECODE_PROFILE_H264_BASELINE_AMD:
|
||||
calVideoProfile = CAL_VID_H264_BASELINE;
|
||||
break;
|
||||
case CL_VIDEO_DECODE_PROFILE_H264_MAIN_AMD:
|
||||
calVideoProfile = CAL_VID_H264_MAIN;
|
||||
break;
|
||||
case CL_VIDEO_DECODE_PROFILE_H264_HIGH_AMD:
|
||||
calVideoProfile = CAL_VID_H264_HIGH;
|
||||
break;
|
||||
case CL_VIDEO_DECODE_PROFILE_VC1_SIMPLE_AMD:
|
||||
calVideoProfile = CAL_VID_VC1_SIMPLE;
|
||||
break;
|
||||
case CL_VIDEO_DECODE_PROFILE_VC1_MAIN_AMD:
|
||||
calVideoProfile = CAL_VID_VC1_MAIN;
|
||||
break;
|
||||
case CL_VIDEO_DECODE_PROFILE_VC1_ADVANCED_AMD:
|
||||
calVideoProfile = CAL_VID_VC1_ADVANCED;
|
||||
break;
|
||||
case CL_VIDEO_DECODE_PROFILE_MPEG2_VLD_AMD:
|
||||
calVideoProfile = CAL_VID_MPEG2_VLD;
|
||||
break;
|
||||
//case CL_VIDEO_DECODE_PROFILE_MPEG2_SIMPLE_AMD:
|
||||
//case CL_VIDEO_DECODE_PROFILE_MPEG2_MAIN_AMD:
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/* Helper function GetCalDecodeProfile()
|
||||
*/
|
||||
static bool
|
||||
GetCalVideoFormat(cl_video_format_amd clVideoFormat,
|
||||
CALdecodeFormat& calVideoFormat)
|
||||
{
|
||||
switch(clVideoFormat) {
|
||||
case CL_VIDEO_NV12_INTERLEAVED_AMD:
|
||||
calVideoFormat = CAL_VID_NV12_INTERLEAVED;
|
||||
break;
|
||||
case CL_VIDEO_YV12_INTERLEAVED_AMD:
|
||||
calVideoFormat = CAL_VID_YV12_INTERLEAVED;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup cl_amd_open_video
|
||||
*
|
||||
* This section provides OpenCL extension functions that allow applications
|
||||
* to use kernel decoding of video streams using corresponding HW capabilities.
|
||||
*
|
||||
* @}
|
||||
* \addtogroup clQueryVidDecoderCapsAMD
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/*! \brief Creates a video session object.
|
||||
*
|
||||
* \param context is a valid OpenCL context on which the image object
|
||||
* is to be created.
|
||||
*
|
||||
* \param device must be a device associated with context. It can either be in
|
||||
* the list of devices specified when context is created using
|
||||
* clCreateContext or have the same device type as the device type
|
||||
* specified when the context is created using clCreateContextFromType
|
||||
*
|
||||
* \param flags is a bit-field that is used to specify the video session
|
||||
* operation mode, available flags are as follows:
|
||||
* - CL_VIDEO_DECODE_ACCELERATION_AMD - the video session supports HW
|
||||
* acceleration of video decoding operation.
|
||||
*
|
||||
* \param errcode_ret will return CL_SUCCESS if no error occurs;
|
||||
* or an appropriate error code:
|
||||
* - CL_INVALID_CONTEXT if \a context is not a valid context;
|
||||
* - CL_INVALID_DEVICE if \a device is not a valid device;
|
||||
* - CL_INVALID_VIDEO_SESSION_FLAGS_AMD if flags is NULL or contains invalid
|
||||
* configuration;
|
||||
* - CL_INVALID_OPERATION if video decode extension is not supported by
|
||||
* any device associated with context;
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required
|
||||
* by the runtime.
|
||||
*
|
||||
* \version 1.1r25
|
||||
*/
|
||||
RUNTIME_ENTRY_RET(cl_video_session_amd, clCreateVideoSessionAMD, (
|
||||
cl_context context,
|
||||
cl_device_id device,
|
||||
cl_video_session_flags_amd flags,
|
||||
cl_video_config_type_amd config_buffer_type,
|
||||
cl_uint config_buffer_size,
|
||||
void* config_buffer,
|
||||
cl_int* errcode_ret))
|
||||
{
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
LogWarning("invalid parameter \"context\"");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
if (!is_valid(device)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
LogWarning("invalid parameter \"device\"");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
amd::Device* amdDevice = as_amd(device);
|
||||
if (!amdDevice->info().openVideo_) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
LogWarning("Device or CAL does not support Open Video extension");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
|
||||
// Create video command queue
|
||||
cl_video_encode_desc_amd ovSessionProperties;
|
||||
CALvideoProperties calVideoProperties;
|
||||
calVideoProperties.size = sizeof(calVideoProperties);
|
||||
calVideoProperties.flags = static_cast<CALuint>(flags);
|
||||
switch(config_buffer_type) {
|
||||
case CL_VIDEO_DECODE_CONFIGURATION_AMD:
|
||||
{
|
||||
cl_video_decode_desc_amd* videoDecodeDesc =
|
||||
static_cast<cl_video_decode_desc_amd*>(config_buffer);
|
||||
if (!GetCalVideoProfile(videoDecodeDesc->attrib.profile,
|
||||
calVideoProperties.profile)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
LogWarning("Profile is not supported or invalid");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
if (!GetCalVideoFormat(videoDecodeDesc->attrib.format,
|
||||
calVideoProperties.format)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
LogWarning("Format is not supported or invalid");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
calVideoProperties.width = videoDecodeDesc->image_width;
|
||||
calVideoProperties.height = videoDecodeDesc->image_height;
|
||||
calVideoProperties.VideoEngine_name = CAL_CONTEXT_VIDEO;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VIDEO_CONFIG_TYPE_AMD;
|
||||
LogWarning("invalid parameter \"config_buffer_type\"");
|
||||
return (cl_video_session_amd) 0;
|
||||
break;
|
||||
}
|
||||
|
||||
ovSessionProperties.calVideoProperties = &calVideoProperties;
|
||||
|
||||
amd::HostQueue* queue = new amd::HostQueue(
|
||||
*as_amd(context), *as_amd(device), 0, &ovSessionProperties);
|
||||
|
||||
if (queue == NULL || !queue->create()) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
LogWarning("not enough host memory");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
|
||||
staticQueue = queue;
|
||||
amd::VideoSession* video_session = new amd::VideoSession(
|
||||
*as_amd(context), *as_amd(device), queue, flags, config_buffer_type,
|
||||
config_buffer_size, config_buffer);
|
||||
if (!video_session) {
|
||||
queue->release();
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
LogWarning("not enough host memory");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
|
||||
return as_cl<amd::VideoSession>(video_session);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
RUNTIME_ENTRY_RET(cl_video_session_amd, clCreateVideoEncSessionAMD, (
|
||||
cl_context context,
|
||||
cl_device_id device,
|
||||
cl_video_session_flags_amd flags,
|
||||
cl_video_config_type_amd config_buffer_type,
|
||||
cl_uint config_buffer_size,
|
||||
void* config_buffer,
|
||||
cl_int* errcode_ret))
|
||||
{
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
|
||||
// Make sure the context is valid
|
||||
if (!is_valid(context)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_CONTEXT;
|
||||
LogWarning("invalid parameter \"context\"");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
|
||||
// Make sure the device is valid
|
||||
if (!is_valid(device)) {
|
||||
*not_null(errcode_ret) = CL_INVALID_DEVICE;
|
||||
LogWarning("invalid parameter \"device\"");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
|
||||
// Make sure the device supports Open Video extensions
|
||||
amd::Device* amdDevice = as_amd(device);
|
||||
if (!amdDevice->info().openVideo_) {
|
||||
*not_null(errcode_ret) = CL_INVALID_OPERATION;
|
||||
LogWarning("Device or CAL does not support Open Video extension");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
|
||||
cl_video_encode_desc_amd *ovSessionProperties = (cl_video_encode_desc_amd *)config_buffer;
|
||||
|
||||
// Create video command queue
|
||||
CALvideoProperties calVideoProperties;
|
||||
|
||||
switch(config_buffer_type)
|
||||
{
|
||||
case CL_VIDEO_ENCODE_CONFIGURATION_AMD:
|
||||
calVideoProperties.size = sizeof(calVideoProperties);
|
||||
calVideoProperties.flags = static_cast<CALuint>(flags);
|
||||
calVideoProperties.profile = (CALdecodeProfile)ovSessionProperties->attrib.codec_profile;
|
||||
calVideoProperties.format = (CALdecodeFormat)ovSessionProperties->attrib.format;
|
||||
calVideoProperties.width = ovSessionProperties->image_width;
|
||||
calVideoProperties.height = ovSessionProperties->image_height;
|
||||
calVideoProperties.VideoEngine_name = CAL_CONTEXT_VIDEO_VCE;
|
||||
ovSessionProperties->calVideoProperties = &calVideoProperties;
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VIDEO_CONFIG_TYPE_AMD;
|
||||
LogWarning("invalid parameter \"config_buffer_type\"");
|
||||
return (cl_video_session_amd) 0;
|
||||
break;
|
||||
}
|
||||
|
||||
amd::HostQueue* queue = new amd::HostQueue(
|
||||
*as_amd(context), *as_amd(device), 0, ovSessionProperties);
|
||||
|
||||
if (queue == NULL || !queue->create()) {
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
LogWarning("not enough host memory");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
staticQueue = queue;
|
||||
#if 0 // this doesn't work here due to context value...
|
||||
CAL_VID_PROFILE_LEVEL encode_profile_level;
|
||||
encode_profile_level.profile = buffer->attrib.profile;
|
||||
encode_profile_level.level = buffer->attrib.level;
|
||||
CALuint frameRate = 0;
|
||||
CALuint YUVwidth = buffer->image_width;
|
||||
CALuint YUVhigh = buffer->image_height;
|
||||
|
||||
cal::details::extensions_.extEncodeCreateSession_((CALcontext)as_amd(context), 0, CAL_VID_encode_AVC_FULL, encode_profile_level,
|
||||
CAL_VID_PICTURE_NV12, YUVwidth, YUVhigh, frameRate, CAL_VID_ENCODE_JOB_PRIORITY_LEVEL1);
|
||||
#endif
|
||||
|
||||
amd::VideoSession* video_session = new amd::VideoSession(
|
||||
*as_amd(context), *as_amd(device), queue, flags, config_buffer_type,
|
||||
config_buffer_size, config_buffer);
|
||||
if (!video_session)
|
||||
{
|
||||
queue->release();
|
||||
*not_null(errcode_ret) = CL_OUT_OF_HOST_MEMORY;
|
||||
LogWarning("not enough host memory");
|
||||
return (cl_video_session_amd) 0;
|
||||
}
|
||||
|
||||
return as_cl<amd::VideoSession>(video_session);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clDestroyVideoEncSessionAMD,
|
||||
(cl_video_session_amd video_session))
|
||||
{
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
|
||||
cl_int errcode_ret = CL_SUCCESS;
|
||||
amd::VideoSession* session = as_amd(video_session);
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList,
|
||||
session->context(), 0, NULL);
|
||||
amd::Command* command = new amd::SetVideoSessionCommand(
|
||||
session->queue(), eventWaitList,
|
||||
amd::SetVideoSessionCommand::CloseSession, NULL);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
command->release();
|
||||
|
||||
session->queue().finish();
|
||||
session->release();
|
||||
|
||||
return errcode_ret;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Increments the video session reference count.
|
||||
*
|
||||
* \param video_session is a valid OpenCL Video Session.
|
||||
*
|
||||
* \return CL_SUCCESS if the function executes successfully;
|
||||
* Otherwise an error code is returned:
|
||||
* - CL_INVALID_VIDEO_SESSION_AMD if video_session is not a valid
|
||||
* video session;
|
||||
*
|
||||
* \version 1.1r25
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clRetainVideoSessionAMD,
|
||||
(cl_video_session_amd video_session))
|
||||
{
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
as_amd(video_session)->retain();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Decrements the video session reference count.
|
||||
*
|
||||
* \param video_session is a valid OpenCL Video Session.
|
||||
*
|
||||
* \return CL_SUCCESS if the function executes successfully;
|
||||
* Otherwise an error code is returned:
|
||||
* - CL_INVALID_VIDEO_SESSION_AMD if video_session is not a valid
|
||||
* video session;
|
||||
*
|
||||
* \version 1.1r25
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clReleaseVideoSessionAMD,
|
||||
(cl_video_session_amd video_session))
|
||||
{
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
as_amd(video_session)->release();
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Queries the configuration of a specific video session.
|
||||
*
|
||||
* \param video_session is a valid OpenCL Video Session.
|
||||
*
|
||||
* \param config_buffer_type is an enumeration constant that identifies the type
|
||||
* of the configuration buffer. It can be one of the following values:
|
||||
* - CL_VIDEO_DECODE_CONFIGURATION_AMD - The buffer contains decoder configuration,
|
||||
* according to the cl_video_decode_desc_amd structure definition.
|
||||
*
|
||||
* \param config_buffer_size is a pointer to size of config_buffer in bytes.
|
||||
* The implementation returns the size of the config_buffer in this argument.
|
||||
*
|
||||
* \param config_buffer is a pointer to a configuration buffer. The
|
||||
* implementation writes the configuration query data into this
|
||||
* buffer. If this pointer is NULL, it is ignored (which enables the
|
||||
* application to query the required buffer size for this configuration type).
|
||||
*
|
||||
* \returns CL_SUCCESS if the video session configuration was set properly;
|
||||
* Otherwise an appropriate error code is returned:
|
||||
* - CL_INVALID_VIDEO_SESSION_AMD if video_session is not a valid video session;
|
||||
* - CL_INVALID_VIDEO_CONFIG_TYPE_AMD if config_buffer_type is NULL or contains a
|
||||
* configuration type which is not supported by the specific implementation;
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required
|
||||
* by the runtime.
|
||||
*
|
||||
* \version 1.1r25
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetVideoSessionInfoAMD, (
|
||||
cl_video_session_amd video_session,
|
||||
cl_video_session_info_amd param_name,
|
||||
size_t param_value_size,
|
||||
void* param_value,
|
||||
size_t* param_value_size_ret))
|
||||
{
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
//switch(config_buffer_type) {
|
||||
//case CL_VIDEO_DECODE_CONFIGURATION_AMD:
|
||||
// break;
|
||||
//default:
|
||||
// return CL_INVALID_VIDEO_CONFIG_TYPE_AMD;
|
||||
//}
|
||||
/*
|
||||
return amd::clGetVideoSessionInfoAMD(*as_amd(video_session),
|
||||
config_buffer_type, config_buffer_size, config_buffer);
|
||||
*/
|
||||
return CL_INVALID_VALUE;
|
||||
// return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
/*! \brief Queries the configuration of a specific video session.
|
||||
*
|
||||
* \param video_session is a valid OpenCL Video Session.
|
||||
*
|
||||
* \param config_buffer_type is an enumeration constant that identifies the type
|
||||
* of the configuration buffer. It can be one of the following values:
|
||||
* - CL_VIDEO_ENCODE_CONFIGURATION_AMD - The buffer contains encoder configuration,
|
||||
* according to the cl_video_decode_desc_amd structure definition.
|
||||
*
|
||||
* \param config_buffer_size is a pointer to size of config_buffer in bytes.
|
||||
* The implementation returns the size of the config_buffer in this argument.
|
||||
*
|
||||
* \param config_buffer is a pointer to a configuration buffer. The
|
||||
* implementation writes the configuration query data into this
|
||||
* buffer. If this pointer is NULL, it is ignored (which enables the
|
||||
* application to query the required buffer size for this configuration type).
|
||||
*
|
||||
* \returns CL_SUCCESS if the video session configuration was set properly;
|
||||
* Otherwise an appropriate error code is returned:
|
||||
* - CL_INVALID_VIDEO_SESSION_AMD if video_session is not a valid video session;
|
||||
* - CL_INVALID_VIDEO_CONFIG_TYPE_AMD if config_buffer_type is NULL or contains a
|
||||
* configuration type which is not supported by the specific implementation;
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required
|
||||
* by the runtime.
|
||||
*
|
||||
* \version 1.1r25
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clGetVideoSessionEncInfoAMD, (
|
||||
cl_video_session_amd video_session,
|
||||
cl_video_session_enc_info_amd param_name,
|
||||
size_t param_value_size,
|
||||
void* param_value,
|
||||
size_t* param_value_size_ret))
|
||||
{
|
||||
cl_uint errcode_ret = CL_SUCCESS;
|
||||
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
|
||||
amd::VideoSession& session = *as_amd(video_session);
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, session.context(), 0, NULL);
|
||||
amd::Command* command = NULL;
|
||||
|
||||
switch(param_name) {
|
||||
case CL_CONFIG_TYPE_PICTURE_CONTROL :
|
||||
command = new amd::SetVideoSessionCommand(
|
||||
session.queue(), eventWaitList,
|
||||
amd::SetVideoSessionCommand::ConfigTypePictureControl, param_value);
|
||||
break;
|
||||
case CL_CONFIG_TYPE_RATE_CONTROL :
|
||||
command = new amd::SetVideoSessionCommand(
|
||||
session.queue(), eventWaitList,
|
||||
amd::SetVideoSessionCommand::ConfigTypeRateControl, param_value);
|
||||
break;
|
||||
case CL_CONFIG_TYPE_MOTION_ESTIMATION :
|
||||
command = new amd::SetVideoSessionCommand(
|
||||
session.queue(), eventWaitList,
|
||||
amd::SetVideoSessionCommand::ConfigTypeMotionEstimation, param_value);
|
||||
break;
|
||||
case CL_CONFIG_TYPE_RDO :
|
||||
command = new amd::SetVideoSessionCommand(
|
||||
session.queue(), eventWaitList,
|
||||
amd::SetVideoSessionCommand::ConfigTypeRDO, param_value);
|
||||
break;
|
||||
default:
|
||||
errcode_ret = CL_INVALID_VIDEO_CONFIG_TYPE_AMD;
|
||||
break;
|
||||
}
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
command->release();
|
||||
|
||||
session.queue().finish();
|
||||
* param_value_size_ret = sizeof(param_value);
|
||||
|
||||
return errcode_ret;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clSendEncodeConfigInfoAMD, (
|
||||
cl_video_session_amd video_session,
|
||||
size_t numBuffers,
|
||||
void* pConfigBuffers))
|
||||
{
|
||||
cl_uint errcode_ret = CL_SUCCESS;
|
||||
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
|
||||
amd::VideoSession& session = *as_amd(video_session);
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, session.context(), 0, NULL);
|
||||
amd::Command* command = new amd::SetVideoSessionCommand(
|
||||
session.queue(), eventWaitList,
|
||||
amd::SetVideoSessionCommand::SendEncodeConfig, pConfigBuffers, numBuffers);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
command->release();
|
||||
|
||||
session.queue().finish();
|
||||
|
||||
return errcode_ret;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Enqueues execution of a decode/encode command on UVD unit of the device
|
||||
* specified at creation of video session.
|
||||
*
|
||||
* \param video_session is a valid OpenCL video session.
|
||||
*
|
||||
* \param video_data_structure is a valid pointer to a structure
|
||||
* containing control and video stream data for decoding/encoding.
|
||||
*
|
||||
* \param config_buffer_size is a pointer to size of config_buffer in bytes.
|
||||
* The implementation returns the size of the config_buffer in this argument.
|
||||
*
|
||||
* \param event_wait_list and \param num_events_in_wait_list specify events
|
||||
* that need to complete before this particular command can be executed.
|
||||
*
|
||||
* \param event returns an event object that identifies this particular
|
||||
* video program execution instance.
|
||||
*
|
||||
* \returns CL_SUCCESS if the video program execution was
|
||||
* successfully passed to the CAL for execution and CAL returned CAL_RESULT_OK.
|
||||
* Otherwise, it returnes one of the following errors:
|
||||
*
|
||||
* - CL_INVALID_VIDEO_SESSION_AMD if the parameter video_session is not
|
||||
* a valid video session object returned by a call to function
|
||||
* clCreateVideoSessionAMD;
|
||||
* - CL_IVALID_VIDEO_DATA_AMD if pointer video_data_struct is NULL, points
|
||||
* to invalid memory, or any of the pointers/objects provided in the
|
||||
* video_data_structure is NULL or invalid;
|
||||
* - CL_INVALID_CONTEXT if context associated with video_session is not
|
||||
* the same as context associated with event_wait_list;
|
||||
* - 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_HOST_MEMORY if there is a failure to allocate resources
|
||||
* required by the Open CL implementation on the host.
|
||||
*
|
||||
* \version 1.1r33
|
||||
*/
|
||||
RUNTIME_ENTRY(cl_int, clEnqueueRunVideoProgramAMD, (
|
||||
cl_video_session_amd video_session,
|
||||
void* video_data,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list,
|
||||
cl_event* event))
|
||||
{
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
cl_int errcode = CL_SUCCESS;
|
||||
|
||||
amd::VideoSession& session = *as_amd(video_session);
|
||||
|
||||
switch(session.type()) {
|
||||
case CL_VIDEO_DECODE_CONFIGURATION_AMD:
|
||||
errcode = amd::clEnqueueVideoDecodeAMD(session,
|
||||
(cl_video_decode_data_amd*) video_data,
|
||||
num_events_in_wait_list, event_wait_list, event);
|
||||
break;
|
||||
case CL_VIDEO_ENCODE_CONFIGURATION_AMD:
|
||||
errcode = amd::clEnqueueVideoEncodeAMD(session,
|
||||
(cl_video_encode_data_amd*) video_data,
|
||||
num_events_in_wait_list, event_wait_list, event);
|
||||
break;
|
||||
|
||||
default:
|
||||
errcode = CL_INVALID_VIDEO_CONFIG_TYPE_AMD;
|
||||
}
|
||||
return errcode;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEncodeGetDeviceCapAMD, (
|
||||
cl_device_id device_id,
|
||||
cl_uint encode_mode,
|
||||
cl_uint encode_cap_total_size,
|
||||
cl_uint *num_encode_cap,
|
||||
void *pEncodeCAP))
|
||||
{
|
||||
// Make sure the device supports Open Video extensions
|
||||
amd::Device* device = as_amd(device_id);
|
||||
if (!device->info().openVideo_) {
|
||||
return CL_DEVICE_NOT_FOUND;
|
||||
}
|
||||
|
||||
// amd::VideoSession& session = *as_amd(video_session);
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, staticQueue->context(), 0, NULL);
|
||||
amd::Command* command = new amd::SetVideoSessionCommand(
|
||||
*staticQueue, eventWaitList,
|
||||
amd::SetVideoSessionCommand::GetDeviceCapVCE, pEncodeCAP, encode_cap_total_size);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
command->release();
|
||||
staticQueue->finish();
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
#if 1
|
||||
RUNTIME_ENTRY(cl_int, clEncodePictureAMD, (
|
||||
cl_video_session_amd video_session,
|
||||
cl_uint number_of_encode_task_input_buffers,
|
||||
void* encode_task_input_buffer_list,
|
||||
void* picture_parameter,
|
||||
cl_uint* pTaskID))
|
||||
|
||||
{
|
||||
cl_uint errcode_ret = CL_SUCCESS;
|
||||
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
|
||||
return errcode_ret;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
#endif
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEncodeQueryTaskDescriptionAMD, (
|
||||
cl_video_session_amd video_session,
|
||||
cl_uint num_of_task_description_request,
|
||||
cl_uint* num_of_task_description_return,
|
||||
void * task_description_list))
|
||||
{
|
||||
cl_uint errcode_ret = CL_SUCCESS;
|
||||
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
|
||||
amd::VideoSession& session = *as_amd(video_session);
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, session.context(), 0, NULL);
|
||||
amd::Command* command = new amd::SetVideoSessionCommand(
|
||||
session.queue(), eventWaitList,
|
||||
amd::SetVideoSessionCommand::EncodeQueryTaskDescription,
|
||||
num_of_task_description_request, task_description_list, num_of_task_description_return);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
command->release();
|
||||
session.queue().finish();
|
||||
|
||||
return errcode_ret;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clEncodeReleaseOutputResourceAMD, (
|
||||
cl_video_session_amd video_session,
|
||||
cl_uint task_id))
|
||||
{
|
||||
cl_uint errcode_ret = CL_SUCCESS;
|
||||
|
||||
if (!is_valid(video_session)) {
|
||||
LogWarning("invalid parameter \"video_session\"");
|
||||
return CL_INVALID_VIDEO_SESSION_AMD;
|
||||
}
|
||||
|
||||
amd::VideoSession& session = *as_amd(video_session);
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int err = amd::clSetEventWaitList(eventWaitList, session.context(), 0, NULL);
|
||||
amd::Command* command = new amd::SetVideoSessionCommand(
|
||||
session.queue(), eventWaitList,
|
||||
amd::SetVideoSessionCommand::ReleaseOutputResource,
|
||||
NULL, task_id);
|
||||
if (command == NULL) {
|
||||
return CL_OUT_OF_HOST_MEMORY;
|
||||
}
|
||||
command->enqueue();
|
||||
command->release();
|
||||
session.queue().finish();
|
||||
|
||||
return errcode_ret;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
namespace amd {
|
||||
|
||||
cl_int
|
||||
clEnqueueVideoDecodeAMD(VideoSession& session,
|
||||
cl_video_decode_data_amd* data,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list,
|
||||
cl_event* event)
|
||||
{
|
||||
if ((NULL == data) || (data->video_type.type != CL_VIDEO_DECODE)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
if (!is_valid(data->output_surface)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int errcode = amd::clSetEventWaitList(eventWaitList,
|
||||
session.context(), num_events_in_wait_list, event_wait_list);
|
||||
if (errcode != CL_SUCCESS){
|
||||
return errcode;
|
||||
}
|
||||
|
||||
//! Now create command and enqueue
|
||||
amd::RunVideoProgramCommand* command =
|
||||
new amd::RunVideoProgramCommand(session.queue(),
|
||||
eventWaitList, data, *as_amd(data->output_surface),
|
||||
CL_COMMAND_VIDEO_DECODE_AMD);
|
||||
if (command == NULL) {
|
||||
LogError("Cannot create new RunVideoProgramCommand");
|
||||
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();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
cl_int
|
||||
clEnqueueVideoEncodeAMD(VideoSession& session,
|
||||
cl_video_encode_data_amd* data,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event* event_wait_list,
|
||||
cl_event* event)
|
||||
{
|
||||
if ((NULL == data) || (data->video_type.type != CL_VIDEO_ENCODE)) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
|
||||
CAL_VID_BUFFER_DESCRIPTION *bufferList =
|
||||
reinterpret_cast<CAL_VID_BUFFER_DESCRIPTION *>(data->pictureParam1);
|
||||
cl_mem memory = static_cast<cl_mem>(bufferList[0].buffer.pPicture);
|
||||
|
||||
if (!is_valid(memory)) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
// Start up the event queue
|
||||
amd::Command::EventWaitList eventWaitList;
|
||||
cl_int errcode = amd::clSetEventWaitList(eventWaitList,
|
||||
session.context(), num_events_in_wait_list, event_wait_list);
|
||||
if (errcode != CL_SUCCESS){
|
||||
return errcode;
|
||||
}
|
||||
|
||||
//! Now create command and enqueue
|
||||
amd::RunVideoProgramCommand* command =
|
||||
new amd::RunVideoProgramCommand(session.queue(),
|
||||
eventWaitList, data, *as_amd(memory),
|
||||
CL_COMMAND_VIDEO_ENCODE_AMD);
|
||||
if (command == NULL) {
|
||||
LogError("Cannot create new RunVideoProgramCommand");
|
||||
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;
|
||||
}
|
||||
|
||||
// Issue the command via the queue system.
|
||||
command->enqueue();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
} // namespace amd
|
||||
|
||||
#endif // cl_amd_video_session
|
||||
@@ -0,0 +1,362 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
|
||||
#ifndef __CL_OPEN_VIDEO_AMD_H
|
||||
#define __CL_OPEN_VIDEO_AMD_H
|
||||
|
||||
/******************************************
|
||||
* Private AMD extension cl_amd_open_video *
|
||||
******************************************/
|
||||
#define cl_amd_open_video 1
|
||||
|
||||
#if cl_amd_open_video
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
/* cl_device_info*/
|
||||
#define CL_DEVICE_MAX_VIDEO_SESSIONS_AMD 0x10010
|
||||
#define CL_DEVICE_NUM_VIDEO_ATTRIBS_AMD 0x10011
|
||||
#define CL_DEVICE_VIDEO_ATTRIBS_AMD 0x10012
|
||||
|
||||
#define CL_DEVICE_VIDEO_ATTRIBS_ENC_AMD 0x10014
|
||||
#define CL_DEVICE_MAX_VIDEO_ENC_SESSIONS_AMD 0x10015
|
||||
#define CL_DEVICE_NUM_VIDEO_ENC_ATTRIBS_AMD 0x10016
|
||||
|
||||
/* cl_video_session_flags_amd */
|
||||
typedef cl_bitfield cl_video_session_flags_amd;
|
||||
|
||||
/* cl_video_config_type_amd enumeration */
|
||||
//
|
||||
// Open Encode Porting TBD check if the 0x4101 enum. that will result is OK
|
||||
//
|
||||
|
||||
/* cl_video_config_type_amd enumeration */
|
||||
typedef enum _cl_video_config_type_amd {
|
||||
CL_VIDEO_DECODE_CONFIGURATION_AMD = 0x4100,
|
||||
CL_VIDEO_ENCODE_CONFIGURATION_AMD = 0x4101
|
||||
} cl_video_config_type_amd;
|
||||
|
||||
/* cl_video_session_info_amd enumeration */
|
||||
typedef enum _cl_video_session_info_amd {
|
||||
CL_VIDEO_SESSION_CONFIG_SIZE_AMD = 0x10013,
|
||||
CL_VIDEO_SESSION_CONFIG_TYPE_AMD,
|
||||
CL_VIDEO_SESSION_CONFIG_BUDDEF_AMD
|
||||
} cl_video_session_info_amd;
|
||||
|
||||
typedef enum _cl_video_session_enc_info_amd {
|
||||
CL_CONFIG_TYPE_NONE = 0,
|
||||
CL_CONFIG_TYPE_PICTURE_CONTROL = 1,
|
||||
CL_CONFIG_TYPE_RATE_CONTROL = 2,
|
||||
CL_CONFIG_TYPE_MOTION_ESTIMATION = 3,
|
||||
CL_CONFIG_TYPE_RDO = 4
|
||||
} cl_video_session_enc_info_amd;
|
||||
|
||||
/* cl_amd_open_video typedefs */
|
||||
typedef struct _cl_video_session_amd* cl_video_session_amd;
|
||||
|
||||
//typedef cl_bitfield cl_video_session_flags_amd;
|
||||
|
||||
/* cl_video_decode_profile_amd enumeration */
|
||||
typedef enum _cl_video_decode_profile_amd
|
||||
{
|
||||
CL_VIDEO_DECODE_PROFILE_H264_BASELINE_AMD = 1,
|
||||
CL_VIDEO_DECODE_PROFILE_H264_MAIN_AMD,
|
||||
CL_VIDEO_DECODE_PROFILE_H264_HIGH_AMD,
|
||||
CL_VIDEO_DECODE_PROFILE_VC1_SIMPLE_AMD,
|
||||
CL_VIDEO_DECODE_PROFILE_VC1_MAIN_AMD,
|
||||
CL_VIDEO_DECODE_PROFILE_VC1_ADVANCED_AMD,
|
||||
CL_VIDEO_DECODE_PROFILE_MPEG2_VLD_AMD,
|
||||
} cl_video_decode_profile_amd;
|
||||
|
||||
//
|
||||
// Open Encode ported for encode
|
||||
//
|
||||
/* cl_video_encode_profile_amd enumeration */
|
||||
typedef enum _cl_video_encode_profile_amd
|
||||
{
|
||||
CL_VIDEO_ENCODE_PROFILE_H264_BASELINE_AMD = 1,
|
||||
CL_VIDEO_ENCODE_PROFILE_H264_MAIN_AMD,
|
||||
CL_VIDEO_ENCODE_PROFILE_H264_HIGH_AMD,
|
||||
|
||||
} cl_video_encode_profile_amd;
|
||||
|
||||
|
||||
/* cl_video_format_amd enumeration */
|
||||
typedef enum _cl_video_format_amd
|
||||
{
|
||||
CL_VIDEO_NV12_INTERLEAVED_AMD = 1,
|
||||
CL_VIDEO_YV12_INTERLEAVED_AMD
|
||||
} cl_video_format_amd;
|
||||
|
||||
/* cl_video_attrib_amd */
|
||||
typedef struct _cl_video_attrib_amd {
|
||||
cl_video_decode_profile_amd profile;
|
||||
cl_video_format_amd format;
|
||||
} cl_video_attrib_amd;
|
||||
|
||||
/* cl_video_decode_desc_amd */
|
||||
typedef struct _cl_video_decode_desc_amd {
|
||||
cl_video_attrib_amd attrib;
|
||||
size_t image_width;
|
||||
size_t image_height;
|
||||
} cl_video_decode_desc_amd;
|
||||
|
||||
|
||||
//
|
||||
// Open Encode ported
|
||||
//
|
||||
|
||||
/* cl_video_attrib_amd */
|
||||
typedef struct _cl_video_attrib_encode_amd {
|
||||
cl_video_encode_profile_amd codec_profile;
|
||||
cl_uint profile;
|
||||
cl_uint level;
|
||||
cl_video_format_amd format;
|
||||
} cl_video_attrib_encode_amd;
|
||||
|
||||
/* cl_video_encode_desc_amd */
|
||||
typedef struct _cl_video_encode_desc_amd {
|
||||
cl_video_attrib_encode_amd attrib;
|
||||
size_t image_width;
|
||||
size_t image_height;
|
||||
cl_uint priority;
|
||||
cl_uint encodeMode;
|
||||
cl_uint frameRateNumerator;
|
||||
cl_uint frameRateDenominator;
|
||||
void * calVideoProperties;
|
||||
} cl_video_encode_desc_amd;
|
||||
|
||||
/* cl_video_program_type_amd enumeration*/
|
||||
typedef enum _cl_video_program_type_amd
|
||||
{
|
||||
CL_VIDEO_DECODE = 1,
|
||||
CL_VIDEO_ENCODE = 2,
|
||||
} cl_video_program_type_amd;
|
||||
|
||||
/* cl_video_program_data_amd */
|
||||
typedef struct _cl_video_program_data_amd {
|
||||
cl_uint size;
|
||||
cl_video_program_type_amd type;
|
||||
cl_uint flags;
|
||||
} cl_video_program_data_amd;
|
||||
|
||||
/* cl_video_decode_data_amd */
|
||||
typedef struct _cl_video_decode_data_amd {
|
||||
cl_video_program_data_amd video_type;
|
||||
cl_mem output_surface;
|
||||
void* picture_parameter_1;
|
||||
void* picture_parameter_2;
|
||||
cl_uint picture_parameter_2_size;
|
||||
void* bitstream_data;
|
||||
cl_uint bitstream_data_size;
|
||||
void* slice_data_control;
|
||||
cl_uint slice_data_control_size;
|
||||
} cl_video_decode_data_amd;
|
||||
|
||||
/* cl_video_encode_data_amd */
|
||||
typedef struct _cl_video_encode_data_amd {
|
||||
cl_video_program_data_amd video_type;
|
||||
cl_uint pictureParam1Size;
|
||||
cl_uint pictureParam2Size;
|
||||
void* pictureParam1;
|
||||
void* pictureParam2;
|
||||
cl_uint uiTaskID;
|
||||
} cl_video_encode_data_amd;
|
||||
|
||||
/* cl_command_type */
|
||||
#define CL_COMMAND_VIDEO_DECODE_AMD 0x4101
|
||||
#define CL_COMMAND_VIDEO_ENCODE_AMD 0x4102
|
||||
#define CL_COMMAND_VIDEO_QUERY_TASK_AMD 0x4103
|
||||
|
||||
/* cl_amd_open_video error codes */
|
||||
#define CL_INVALID_VIDEO_SESSION_FLAGS_AMD -1100
|
||||
#define CL_INVALID_VIDEO_SESSION_AMD -1101
|
||||
#define CL_INVALID_VIDEO_CONFIG_TYPE_AMD -1102
|
||||
#define CL_INVALID_VIDEO_CONFIG_BUFFER_AMD -1103
|
||||
#define CL_INVALID_VIDEO_DATA_AMD -1104
|
||||
|
||||
/* cl_video_session_flags_amd - bitfield */
|
||||
#define CL_VIDEO_DECODE_ACCELERATION_AMD (1<<0)
|
||||
// Open Encode ported
|
||||
#define CL_VIDEO_ENCODE_ACCELERATION_AMD (1<<0)
|
||||
|
||||
// /* cl_video_session_info_amd enumeration */
|
||||
//typedef enum _cl_video_session_info_amd {
|
||||
// CL_VIDEO_SESSION_CONFIG_SIZE_AMD = 0x10012,
|
||||
// CL_VIDEO_SESSION_CONFIG_TYPE_AMD,
|
||||
// CL_VIDEO_SESSION_CONFIG_BUDDEF_AMD
|
||||
//} cl_video_session_info_amd;
|
||||
|
||||
typedef CL_API_ENTRY cl_video_session_amd (CL_API_CALL* clCreateVideoSessionAMD_fn)(
|
||||
cl_context /* context */,
|
||||
cl_device_id /* device */,
|
||||
cl_video_session_flags_amd /* flags */,
|
||||
cl_video_config_type_amd /* config_buffer_type */,
|
||||
cl_uint /* config_buffer_size */,
|
||||
void* /* config_buffer */,
|
||||
cl_int* /* errcode_ret */);
|
||||
|
||||
// Open Encode Changes add Enc CreateSession
|
||||
typedef CL_API_ENTRY cl_video_session_amd (CL_API_CALL* clCreateVideoEncSessionAMD_fn)(
|
||||
cl_context /* context */,
|
||||
cl_device_id /* device */,
|
||||
cl_video_session_flags_amd /* flags */,
|
||||
cl_video_config_type_amd /* config_buffer_type */,
|
||||
cl_uint /* config_buffer_size */,
|
||||
void* /* config_buffer */,
|
||||
cl_int* /* errcode_ret */);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clDestroyVideoEncSessionAMD_fn)(
|
||||
cl_video_session_amd /*video_session*/);
|
||||
|
||||
// Open Encode Changes
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clRetainVideoSessionAMD_fn)(
|
||||
cl_video_session_amd /* video_session */);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clReleaseVideoSessionAMD_fn)(
|
||||
cl_video_session_amd /* video_session*/);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clGetVideoSessionInfoAMD_fn)(
|
||||
cl_video_session_amd /* video_session */,
|
||||
cl_video_session_info_amd /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void* /* param_value */,
|
||||
size_t* /* param_value_size_ret */);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clGetVideoSessionEncInfoAMD_fn)(
|
||||
cl_video_session_amd /* video_session */,
|
||||
cl_video_session_enc_info_amd /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void* /* param_value */,
|
||||
size_t* /* param_value_size_ret */);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clSendEncodeConfigInfoAMD_fn) (
|
||||
cl_video_session_amd /* video_session */,
|
||||
size_t /* numBuffers */,
|
||||
void* /* pConfigBuffers */);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clEnqueueRunVideoProgramAMD_fn)(
|
||||
cl_video_session_amd /* video_session */,
|
||||
void* /* video_data_struct */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event* /* event_wait_list */,
|
||||
cl_event* /* event*/);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clEncodeGetDeviceCapAMD_fn)(
|
||||
cl_device_id /* device_id */,
|
||||
cl_uint /* encode_mode */,
|
||||
cl_uint /* encode_cap_total_size */,
|
||||
cl_uint* /* num_encode_cap */,
|
||||
void* /* pEncodeCAP */);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clEncodeQueryTaskDescriptionAMD_fn)(
|
||||
cl_video_session_amd /* video_session */,
|
||||
cl_uint /* num_of_task_description_request */,
|
||||
cl_uint* /* num_of_task_description_return */,
|
||||
void * /* task_description_list */
|
||||
);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL* clEncodeReleaseOutputResourceAMD_fn)(
|
||||
cl_video_session_amd /* video_session */,
|
||||
cl_uint /* task_id */
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*cl_amd_open_video*/
|
||||
|
||||
#endif /*!__CL_OPEN_VIDEO_AMD_H*/
|
||||
@@ -0,0 +1,187 @@
|
||||
//
|
||||
// Copyright (c) 2013 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
#include "platform/memory.hpp"
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/command.hpp"
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup CL_Pipes
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief creates a pipe object.
|
||||
*
|
||||
* \param context is a valid OpenCL context used to create the pipe object.
|
||||
*
|
||||
* \param flags is a bit-field that is used to specify allocation and usage
|
||||
* information such as the memory arena that should be used to allocate the pipe
|
||||
* object and how it will be used. Only CL_MEM_READ_ONLY, CL_MEM_WRITE_ONLY,
|
||||
* CL_MEM_READ_WRITE and CL_MEM_HOST_NO_ACCESS can be specified when creating a
|
||||
* pipe object. If value specified for flags is 0, the default is used which is
|
||||
* CL_MEM_READ_WRITE.
|
||||
*
|
||||
* \param pipe_packet_size is the size in bytes of a pipe packet.
|
||||
*
|
||||
* \param pipe_max_packets specifies the pipe capacity by specifying the maximum
|
||||
* number of packets the pipe can hold.
|
||||
*
|
||||
* \param properties specifies a list of properties for the pipe and their
|
||||
* corresponding values. Each property name is immediately followed by the
|
||||
* corresponding desired value. The list is terminated with 0.
|
||||
*
|
||||
* In OpenCL 2.0, properties must be NULL.
|
||||
*
|
||||
* \param errcode_ret will return an appropriate error code.
|
||||
* If \a errcode_ret is NULL, no error code is returned.
|
||||
*
|
||||
* \return a valid non-zero pipe object and \a errcode_ret is set to CL_SUCCESS
|
||||
* if the pipe object is created successfully. Otherwise, it returns a NULL
|
||||
* value with one of the following error values returned in errcode_ret:
|
||||
* - CL_INVALID_CONTEXT if context is not a valid context.
|
||||
* - CL_INVALID_VALUE if values specified in flags are not as defined above.
|
||||
* - CL_INVALID_VALUE if properties is not NULL.
|
||||
* - CL_INVALID_PIPE_SIZE if pipe_packet_size is 0 or the pipe_packet_size
|
||||
* exceeds CL_DEVICE_PIPE_MAX_PACKET_SIZE value for all devices in context
|
||||
* or if pipe_max_packets is 0.
|
||||
* - CL_MEM_OBJECT_ALLOCATION_FAILURE if there is a failure to allocate memory
|
||||
* for the 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
|
||||
* by the OpenCL implementation on the host.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
// 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 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);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Get information specific to a pipe object created with clCreatePipe.
|
||||
*
|
||||
* \param param_name specifies the information to query.
|
||||
*
|
||||
* \param param_value is a pointer to memory where the appropriate result being
|
||||
* queried is returned. If param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size is used to specify the size in bytes of memory
|
||||
* pointed to by param_value. This size must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data being
|
||||
* queried by param_value. If param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \return CL_SUCCESS if the function is executed successfully. Otherwise, it
|
||||
* returns one of the following errors:
|
||||
* - CL_INVALID_VALUE if param_name is not valid, or if size in bytes specified
|
||||
* by param_value_size is < size of return type and param_value is not NULL.
|
||||
* - 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
|
||||
* 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;
|
||||
}
|
||||
|
||||
amd::Pipe* pipe = as_amd(memobj)->asPipe();
|
||||
if (pipe == NULL) {
|
||||
return CL_INVALID_MEM_OBJECT;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
case CL_PIPE_MAX_PACKETS: {
|
||||
cl_uint count = pipe->getMaxNumPackets();
|
||||
return amd::clGetInfo(
|
||||
count, param_value_size, param_value, param_value_size_ret);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
#include "cl_common.hpp"
|
||||
#include "cl_platform_amd.h"
|
||||
#include <cstring>
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup AMD_Extensions
|
||||
* @{
|
||||
*
|
||||
*/
|
||||
|
||||
RUNTIME_ENTRY(cl_int, clUnloadPlatformAMD, (cl_platform_id platform))
|
||||
{
|
||||
if (AMD_PLATFORM == platform) {
|
||||
amd::Runtime::tearDown();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,117 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2009 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
|
||||
// AMD-specific platform management extensions
|
||||
|
||||
#ifndef __CL_PLATFORM_AMD_H
|
||||
#define __CL_PLATFORM_AMD_H
|
||||
|
||||
#include "CL/cl_platform.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
/*! \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
|
||||
* 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;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*__CL_AMD_PROFILE_H*/
|
||||
@@ -0,0 +1,382 @@
|
||||
//
|
||||
// Copyright (c) 2009 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
#include "cl_common.hpp"
|
||||
#include "cl_profile_amd.h"
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/command.hpp"
|
||||
#include "platform/perfctr.hpp"
|
||||
#include <cstring>
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup AMD_Extensions
|
||||
* @{
|
||||
*
|
||||
*/
|
||||
|
||||
/*! \brief Creates a new HW performance counter
|
||||
* for the specified OpenCL context.
|
||||
*
|
||||
* \param device must be a valid OpenCL device.
|
||||
*
|
||||
* \param block_index index of the HW block to configure.
|
||||
*
|
||||
* \param counter_index index of the hardware counter
|
||||
* within the block to configure.
|
||||
*
|
||||
* \param event_index Event you wish to count with
|
||||
* the counter specified by block_index + counter_index
|
||||
*
|
||||
* \param perf_counter the created perfcounter object
|
||||
*
|
||||
* \param errcode_ret A non zero value if OpenCL failed to create PerfCounter
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_DEVICE if the specified context is invalid.
|
||||
* - CL_INVALID_OPERATION if we couldn't create the object
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Destroy a performance counter object.
|
||||
*
|
||||
* \param perf_counter the perfcounter object for release
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to release PerfCounter
|
||||
* - 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_EXIT
|
||||
|
||||
/*! \brief Increments the perfcounter object reference count.
|
||||
*
|
||||
* \param perf_counter the perfcounter object for retain
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to retain PerfCounter
|
||||
* - 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_EXIT
|
||||
|
||||
/*! \brief Enqueues the begin command for the specified counters.
|
||||
*
|
||||
* \param command_queue must be a valid OpenCL command queue.
|
||||
*
|
||||
* \param num_perf_counters the number of perfcounter objects in the array.
|
||||
*
|
||||
* \param perf_counters specifies an array of perfcounter objects.
|
||||
*
|
||||
* \param event_wait_list specify [is a pointer to] events that need to
|
||||
* complete before this particular command can be executed.
|
||||
* If \a event_wait_list is NULL, then this particular command does not wait
|
||||
* on any event to complete. If \a event_wait_list is NULL,
|
||||
* \a num_events_in_wait_list must be 0. If \a event_wait_list is not NULL,
|
||||
* the list of events pointed to by \a event_wait_list must be valid and
|
||||
* \a num_events_in_wait_list must be greater than 0. The events specified in
|
||||
* \a event_wait_list act as synchronization points.
|
||||
*
|
||||
* \param num_events_in_wait_list specify the number of events in
|
||||
* \a event_wait_list. It must be 0 if \a event_wait_list is NULL. It must be
|
||||
* greater than 0 if \a event_wait_list is not NULL.
|
||||
*
|
||||
* \param event returns an event object that identifies this particular
|
||||
* command and can be used to query or queue a wait for this particular
|
||||
* command to complete. \a event can be NULL in which case it will not be
|
||||
* possible for the application to query the status of this command or queue a
|
||||
* wait for this command to complete.
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to release PerfCounter
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - 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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Enqueues the end command for the specified counters.
|
||||
*
|
||||
* \param command_queue must be a valid OpenCL command queue.
|
||||
*
|
||||
* \param num_perf_counters the number of perfcounter objects in the array.
|
||||
*
|
||||
* \param perf_counters specifies an array of perfcounter objects.
|
||||
*
|
||||
* \param event_wait_list specify [is a pointer to] events that need to
|
||||
* complete before this particular command can be executed.
|
||||
* If \a event_wait_list is NULL, then this particular command does not wait
|
||||
* on any event to complete. If \a event_wait_list is NULL,
|
||||
* \a num_events_in_wait_list must be 0. If \a event_wait_list is not NULL,
|
||||
* the list of events pointed to by \a event_wait_list must be valid and
|
||||
* \a num_events_in_wait_list must be greater than 0. The events specified in
|
||||
* \a event_wait_list act as synchronization points.
|
||||
*
|
||||
* \param num_events_in_wait_list specify the number of events in
|
||||
* \a event_wait_list. It must be 0 if \a event_wait_list is NULL. It must be
|
||||
* greater than 0 if \a event_wait_list is not NULL.
|
||||
*
|
||||
* \param event returns an event object that identifies this particular
|
||||
* command and can be used to query or queue a wait for this particular
|
||||
* command to complete. \a event can be NULL in which case it will not be
|
||||
* possible for the application to query the status of this command or queue a
|
||||
* wait for this command to complete.
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to release PerfCounter
|
||||
* - 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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Retrieves the results from the counter objects.
|
||||
*
|
||||
* \param num_perf_counter the perfcounter object for the information query.
|
||||
*
|
||||
* \param perf_counters specifies an array of perfcounter objects.
|
||||
*
|
||||
* \param wait_event specifies the wait event, returned in
|
||||
* the clEnqueueEndPerfCounterAMD.
|
||||
*
|
||||
* \param wait true if OpenCL should wait for the perfcounter data.
|
||||
*
|
||||
* \param values must be a valid pointer to an array of 64-bit values
|
||||
* and the array size must be equal to num_perf_counters.
|
||||
*
|
||||
* \return
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - 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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
default:
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,247 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2009 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
|
||||
#ifndef __CL_PROFILE_AMD_H
|
||||
#define __CL_PROFILE_AMD_H
|
||||
|
||||
#include "CL/cl_platform.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
/*! \brief Creates a new HW performance counter
|
||||
* for the specified OpenCL context.
|
||||
*
|
||||
* \param device must be a valid OpenCL device.
|
||||
*
|
||||
* \param properties the list of properties of the hardware counter
|
||||
*
|
||||
* \param errcode_ret A non zero value if OpenCL failed to create PerfCounter
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_CONTEXT if the specified context is invalid.
|
||||
* - CL_OUT_OF_RESOURCES if we couldn't create the object
|
||||
*
|
||||
* \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;
|
||||
|
||||
/*! \brief Destroy a performance counter object.
|
||||
*
|
||||
* \param perf_counter the perfcounter object for release
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to release PerfCounter
|
||||
* - 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;
|
||||
|
||||
/*! \brief Increments the perfcounter object reference count.
|
||||
*
|
||||
* \param perf_counter the perfcounter object for retain
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to retain PerfCounter
|
||||
* - 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;
|
||||
|
||||
/*! \brief Enqueues the begin command for the specified counters.
|
||||
*
|
||||
* \param command_queue must be a valid OpenCL command queue.
|
||||
*
|
||||
* \param num_perf_counters the number of perfcounter objects in the array.
|
||||
*
|
||||
* \param perf_counters specifies an array of perfcounter objects.
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to release PerfCounter
|
||||
* - 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;
|
||||
|
||||
/*! \brief Enqueues the end command for the specified counters.
|
||||
*
|
||||
* \param command_queue must be a valid OpenCL command queue.
|
||||
*
|
||||
* \param num_perf_counters the number of perfcounter objects in the array.
|
||||
*
|
||||
* \param perf_counters specifies an array of perfcounter objects.
|
||||
*
|
||||
* \param event the event object associated with the end operation.
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to release PerfCounter
|
||||
* - 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;
|
||||
|
||||
/*! \brief Retrieves the results from the counter objects.
|
||||
*
|
||||
* \param perf_counter specifies a perfcounter objects for query.
|
||||
*
|
||||
* \param param_name specifies the information to query.
|
||||
*
|
||||
* \param param_value is a pointer to memory where the appropriate result
|
||||
* being queried is returned. If \a param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size is used to specify the size in bytes of memory
|
||||
* pointed to by \a param_value. This size must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data copied
|
||||
* to \a param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \param values must be a valid pointer to an array of 64-bit values
|
||||
* and the array size must be equal to num_perf_counters.
|
||||
*
|
||||
* \return
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - 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;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif /*__CL_PROFILE_AMD_H*/
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,328 @@
|
||||
//
|
||||
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#include "cl_common.hpp"
|
||||
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/sampler.hpp"
|
||||
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup CL_Samplers
|
||||
*
|
||||
* A sampler object describes how to sample an image when the image is read
|
||||
* in the kernel. The built-in functions to read from an image in a kernel
|
||||
* take a sampler as an argument. The sampler arguments to the image read
|
||||
* function can be sampler objects created using OpenCL functions and passed
|
||||
* as argument values to the kernel or can be samplers declared inside
|
||||
* a kernel.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*! \brief Create a sampler object.
|
||||
*
|
||||
* \param context must be a valid OpenCL context.
|
||||
*
|
||||
* \param specifies a list of sampler property names and their corresponding
|
||||
* values. Each sampler property name is immediately followed by the
|
||||
* corresponding desired value. The list is terminated with 0. If a supported
|
||||
* property and its value is not specified in sampler_properties, its default
|
||||
* value will be used. sampler_properties can be NULL in which case the default
|
||||
* values for supported sampler properties will be used.
|
||||
*
|
||||
* \param errcode_ret will return an appropriate error code. If \a errcode_ret
|
||||
* is NULL, no error code is returned.
|
||||
*
|
||||
* \return A valid non-zero sampler object and \a errcode_ret is set to
|
||||
* CL_SUCCESS if the sampler object is created successfully. It returns a NULL
|
||||
* value with one of the following error values returned in \a errcode_ret:
|
||||
* - CL_INVALID_CONTEXT if \a context is not a valid context.
|
||||
* - CL_INVALID_VALUE if the property name in sampler_properties is not a
|
||||
* supported property name, if the value specified for a supported property
|
||||
* name is not valid, or if the same property name is specified more than
|
||||
* once
|
||||
* - CL_INVALID_OPERATION if images are not supported by any device associated
|
||||
* with context
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required
|
||||
* by the runtime.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
cl_bool normalized_coords = CL_TRUE;
|
||||
cl_addressing_mode addressing_mode = CL_ADDRESS_CLAMP;
|
||||
cl_filter_mode filter_mode = CL_FILTER_NEAREST;
|
||||
|
||||
const struct SamplerProperty {
|
||||
cl_sampler_properties name;
|
||||
union {
|
||||
cl_sampler_properties raw;
|
||||
cl_bool normalized_coords;
|
||||
cl_addressing_mode addressing_mode;
|
||||
cl_filter_mode filter_mode;
|
||||
} value;
|
||||
} *p = reinterpret_cast<const SamplerProperty*>(sampler_properties);
|
||||
|
||||
if(p != NULL) while(p->name != 0) {
|
||||
switch(p->name) {
|
||||
case CL_SAMPLER_NORMALIZED_COORDS:
|
||||
normalized_coords = p->value.normalized_coords;
|
||||
break;
|
||||
case CL_SAMPLER_ADDRESSING_MODE:
|
||||
addressing_mode = p->value.addressing_mode;
|
||||
break;
|
||||
case CL_SAMPLER_FILTER_MODE:
|
||||
filter_mode = p->value.filter_mode;
|
||||
break;
|
||||
default:
|
||||
*not_null(errcode_ret) = CL_INVALID_VALUE;
|
||||
LogWarning("invalid property name");
|
||||
return (cl_sampler) 0;
|
||||
}
|
||||
++p;
|
||||
}
|
||||
|
||||
// Check sampler validity
|
||||
// Check addressing mode
|
||||
switch(addressing_mode) {
|
||||
case CL_ADDRESS_NONE:
|
||||
case CL_ADDRESS_CLAMP_TO_EDGE:
|
||||
case CL_ADDRESS_CLAMP:
|
||||
break;
|
||||
|
||||
case CL_ADDRESS_REPEAT:
|
||||
if(!normalized_coords) {
|
||||
// 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(!normalized_coords) {
|
||||
// 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(filter_mode) {
|
||||
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),
|
||||
normalized_coords != 0, // To get rid of VS warning C4800
|
||||
addressing_mode,
|
||||
filter_mode);
|
||||
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);
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl<amd::Sampler>(sampler);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Create a sampler object.
|
||||
*
|
||||
* \param context must be a valid OpenCL context.
|
||||
*
|
||||
* \param addressing_mode specifies how out of range image coordinates are
|
||||
* handled when reading from an image. This can be set to CL_ADDRESS_REPEAT,
|
||||
* CL_ADDRESS_CLAMP_TO_EDGE, CL_ADDRESS_CLAMP and CL_ADDRESS_NONE.
|
||||
*
|
||||
* \param filter_mode specifies the type of filter that must be applied when
|
||||
* reading an image. This can be CL_FILTER_NEAREST or CL_FILTER_LINEAR.
|
||||
*
|
||||
* \param normalized_coords determines if the image coordinates specified are
|
||||
* normalized (if \a normalized_coords is not zero) or not (if
|
||||
* \a normalized_coords is zero).
|
||||
*
|
||||
* \param errcode_ret will return an appropriate error code. If \a errcode_ret
|
||||
* is NULL, no error code is returned.
|
||||
*
|
||||
* \return A valid non-zero sampler object and \a errcode_ret is set to
|
||||
* CL_SUCCESS if the sampler object is created successfully. It returns a NULL
|
||||
* value with one of the following error values returned in \a errcode_ret:
|
||||
* - CL_INVALID_CONTEXT if \a context is not a valid context.
|
||||
* - CL_INVALID_VALUE if \a addressing_mode, \a filter_mode or
|
||||
* \a normalized_coords or combination of these argument values are not
|
||||
* valid.
|
||||
* - CL_INVALID_OPERATION if images are not supported by any device associated
|
||||
* with context
|
||||
* - CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required
|
||||
* by the runtime.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Increment the sampler reference count.
|
||||
*
|
||||
* clCreateSampler does an implicit retain.
|
||||
*
|
||||
* \return CL_SUCCESS if the function is executed successfully. It returns
|
||||
* CL_INVALID_SAMPLER if \a sampler is not a valid sampler object.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Decrement the sampler reference count.
|
||||
*
|
||||
* The sampler object is deleted after the reference count becomes zero and
|
||||
* commands queued for execution on a command-queue(s) that use sampler have
|
||||
* finished.
|
||||
*
|
||||
* \return CL_SUCCESS if the function is executed successfully. It returns
|
||||
* CL_INVALID_SAMPLER if \a sampler is not a valid sampler object.
|
||||
*
|
||||
* \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_EXIT
|
||||
|
||||
/*! \brief Return information about the sampler object.
|
||||
*
|
||||
* \param sampler specifies the sampler being queried.
|
||||
*
|
||||
* \param param_name specifies the information to query.
|
||||
*
|
||||
* \param param_value is a pointer to memory where the appropriate result
|
||||
* being queried is returned. If \a param_value is NULL, it is ignored.
|
||||
*
|
||||
* \param param_value_size is used to specify the size in bytes of memory
|
||||
* pointed to by \a param_value. This size must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data copied
|
||||
* to \a param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* - CL_SUCCESS if the function is executed successfully
|
||||
* - CL_INVALID_VALUE if \a param_name is not valid, or if size in bytes
|
||||
* specified by \a param_value_size is < size of return type and
|
||||
* \a param_value is not NULL
|
||||
* - CL_INVALID_SAMPLER if \a sampler is a not a valid sampler object.
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,259 @@
|
||||
#include "cl_common.hpp"
|
||||
#include "cl_sdi_amd.h"
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/command.hpp"
|
||||
#include "platform/memory.hpp"
|
||||
#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) )
|
||||
{
|
||||
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(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;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
@@ -0,0 +1,48 @@
|
||||
#ifndef __CL_SDI_AMD_H
|
||||
#define __CL_SDI_AMD_H
|
||||
|
||||
#include "CL/cl_ext.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
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
|
||||
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;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /*extern "C"*/
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,118 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2012 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
#ifndef __CL_SEMAPHORE_AMD_H
|
||||
#define __CL_SEMAPHORE_AMD_H
|
||||
/*******************************************
|
||||
* AMD Extension cl_amd_semaphore
|
||||
*******************************************/
|
||||
#define cl_amd_semaphore 1
|
||||
|
||||
#if cl_amd_semaphore
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* 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
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* cl_amd_semaphore */
|
||||
|
||||
#endif /* __CL_SEMAPHORE_AMD_H */
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,498 @@
|
||||
//
|
||||
// Copyright (c) 2009 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
#include "cl_common.hpp"
|
||||
#include "cl_thread_trace_amd.h"
|
||||
#include "platform/context.hpp"
|
||||
#include "platform/command.hpp"
|
||||
#include "platform/threadtrace.hpp"
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
|
||||
/*! \addtogroup API
|
||||
* @{
|
||||
*
|
||||
* \addtogroup AMD_Extensions
|
||||
* @{
|
||||
*
|
||||
*/
|
||||
|
||||
/*! \brief Creates a new HW threadTrace
|
||||
*
|
||||
* \param device must be a valid OpenCL device.
|
||||
*
|
||||
* \param threadTrace the created cl_threadtrace_amd object
|
||||
*
|
||||
* \param errcode_ret A non zero value if OpenCL failed to create cl_threadtrace_amd
|
||||
* - CL_SUCCESS if the function is executed successfully.
|
||||
* - CL_INVALID_DEVICE if the specified context is invalid.
|
||||
* - CL_INVALID_OPERATION if we couldn't create the object
|
||||
*
|
||||
* \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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
*not_null(errcode_ret) = CL_SUCCESS;
|
||||
return as_cl(threadTrace);
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
///*! \brief Destroy a threadTrace object.
|
||||
// *
|
||||
// * \param threadTrace the cl_threadtrace_amd object for release
|
||||
// *
|
||||
// * \return A non zero value if OpenCL failed to release cl_threadtrace_amd
|
||||
// * - 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_EXIT
|
||||
//
|
||||
// *! \brief Increments the cl_threadtrace_amd object reference count.
|
||||
// *
|
||||
// * \param threadTrace the cl_threadtrace_amd object for retain
|
||||
// *
|
||||
// * \return A non zero value if OpenCL failed to retain cl_threadtrace_amd
|
||||
// * - 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_EXIT
|
||||
|
||||
//
|
||||
// *! \brief Sets the cl_threadtrace_amd object configuration parameter.
|
||||
// *
|
||||
// * \param thread_trace the cl_threadtrace_amd object to set configuration parameter
|
||||
// *
|
||||
// * \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,
|
||||
// * - 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, 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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
case CL_THREAD_TRACE_PARAM_COMPUTE_UNIT_TARGET:
|
||||
as_amd(thread_trace)->setCU(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_SHADER_ARRAY_TARGET:
|
||||
as_amd(thread_trace)->setSH(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_SIMD_MASK:
|
||||
as_amd(thread_trace)->setSIMD(param_value);
|
||||
break;
|
||||
case CL_THREAD_TRACE_PARAM_USER_DATA:
|
||||
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;
|
||||
case CL_THREAD_TRACE_PARAM_IS_WRAPPED:
|
||||
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;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! \brief Get specific information about the OpenCL Thread Trace.
|
||||
*
|
||||
* \param threadTrace_info_param is an enum that identifies the Thread Trace information being
|
||||
* queried.
|
||||
*
|
||||
* \param param_value is a pointer to memory location where appropriate values
|
||||
* for a given \a threadTrace_info_param will be returned. If \a param_value is NULL,
|
||||
* it is ignored.
|
||||
*
|
||||
* \param param_value_size specifies the size in bytes of memory pointed to by
|
||||
* \a param_value. This size in bytes must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data being
|
||||
* queried by param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* CL_INVALID_OPERATION if cl_threadtrace_amd object is not valid
|
||||
* - CL_INVALID_VALUE if \a param_name is not one of the supported
|
||||
* values or if size in bytes specified by \a param_value_size is < size of
|
||||
* return type and \a param_value is not a NULL value.
|
||||
* - 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)) {
|
||||
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);
|
||||
break;
|
||||
}
|
||||
case CL_THREAD_TRACE_BUFFERS_SIZE:
|
||||
{
|
||||
// Make sure we found a valid thread trace object
|
||||
if (devThreadTrace == NULL) {
|
||||
return CL_INVALID_OPERATION;
|
||||
}
|
||||
unsigned int bufSize2Se[2] = {0};
|
||||
|
||||
if (!devThreadTrace->info(thread_trace_info_param,bufSize2Se,seNum)) {
|
||||
return CL_INVALID_VALUE;
|
||||
}
|
||||
return amd::clGetInfo(bufSize2Se,
|
||||
param_value_size, param_value, param_value_size_ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/* \brief Enqueues the command for the specified thread trace object.
|
||||
*
|
||||
* \param command_queue must be a valid OpenCL command queue.
|
||||
*
|
||||
* \param thread_trace specifies the cl_threadtrace_amd object.
|
||||
*
|
||||
* \param event_wait_list specify [is a pointer to] events that need to
|
||||
* complete before this particular command can be executed.
|
||||
* If \a event_wait_list is NULL, then this particular command does not wait
|
||||
* on any event to complete. If \a event_wait_list is NULL,
|
||||
* \a num_events_in_wait_list must be 0. If \a event_wait_list is not NULL,
|
||||
* the list of events pointed to by \a event_wait_list must be valid and
|
||||
* \a num_events_in_wait_list must be greater than 0. The events specified in
|
||||
* \a event_wait_list act as synchronization points.
|
||||
*
|
||||
* \param num_events_in_wait_list specify the number of events in
|
||||
* \a event_wait_list. It must be 0 if \a event_wait_list is NULL. It must be
|
||||
* greater than 0 if \a event_wait_list is not NULL.
|
||||
*
|
||||
* \param event returns an event object that identifies this particular
|
||||
* command and can be used to query or queue a wait for this particular
|
||||
* command to complete. \a event can be NULL in which case it will not be
|
||||
* possible for the application to query the status of this command or queue a
|
||||
* 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_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_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 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.
|
||||
*/
|
||||
|
||||
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)) {
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
//
|
||||
///*! \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.
|
||||
// *
|
||||
// * \param thread_trace specifies the cl_threadtrace_amd object.
|
||||
// *
|
||||
// * \param mem_objects the cl_mem objects for trace recording
|
||||
// *
|
||||
// * \param mem_objects_num the number of cl_mem objects in the mem_objects
|
||||
// *
|
||||
// * \param buffer_size the size of each cl_mem object from mem_objects
|
||||
// *
|
||||
// * \param event_wait_list specify [is a pointer to] events that need to
|
||||
// * complete before this particular command can be executed.
|
||||
// * If \a event_wait_list is NULL, then this particular command does not wait
|
||||
// * on any event to complete. If \a event_wait_list is NULL,
|
||||
// * \a num_events_in_wait_list must be 0. If \a event_wait_list is not NULL,
|
||||
// * the list of events pointed to by \a event_wait_list must be valid and
|
||||
// * \a num_events_in_wait_list must be greater than 0. The events specified in
|
||||
// * \a event_wait_list act as synchronization points.
|
||||
// *
|
||||
// * \param num_events_in_wait_list specify the number of events in
|
||||
// * \a event_wait_list. It must be 0 if \a event_wait_list is NULL. It must be
|
||||
// * greater than 0 if \a event_wait_list is not NULL.
|
||||
// *
|
||||
// * \param event returns an event object that identifies this particular
|
||||
// * command and can be used to query or queue a wait for this particular
|
||||
// * command to complete. \a event can be NULL in which case it will not be
|
||||
// * possible for the application to query the status of this command or queue a
|
||||
// * 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_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_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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
*not_null(event) = as_cl(&command->event());
|
||||
if (event == NULL) {
|
||||
command->release();
|
||||
}
|
||||
return CL_SUCCESS;
|
||||
}
|
||||
RUNTIME_EXIT
|
||||
|
||||
/*! @}
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,439 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2012 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
|
||||
#ifndef __CL_THREAD_TRACE_AMD_H
|
||||
#define __CL_THREAD_TRACE_AMD_H
|
||||
|
||||
#include "CL/cl_platform.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /*__cplusplus*/
|
||||
|
||||
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
|
||||
|
||||
/* 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
|
||||
} 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
|
||||
};
|
||||
|
||||
// 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,
|
||||
};
|
||||
|
||||
//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_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,
|
||||
};
|
||||
|
||||
enum ThreadTraceInfo
|
||||
{
|
||||
CL_THREAD_TRACE_SE,
|
||||
CL_THREAD_TRACE_BUFFERS_FILLED,
|
||||
CL_THREAD_TRACE_BUFFERS_SIZE
|
||||
};
|
||||
|
||||
|
||||
/*! \brief Creates a new cl_threadtrace_amd object
|
||||
*
|
||||
* \param device must be a valid OpenCL device.
|
||||
*
|
||||
* \param errcode_ret A non zero value if OpenCL failed to create threadTrace
|
||||
* -CL_INVALID_DEVICE if devices contains an invalid device.
|
||||
* -CL_DEVICE_NOT_AVAILABLE if a device is currently not available even
|
||||
* though the device was returned by clGetDeviceIDs.
|
||||
* -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.
|
||||
*
|
||||
* \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;
|
||||
|
||||
/*! \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_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;
|
||||
|
||||
/*! \brief Increments the cl_threadtrace_amd object reference count.
|
||||
*
|
||||
* \param threadTrace the cl_threadtrace_amd object for retain
|
||||
*
|
||||
* \return A non zero value if OpenCL failed to retain threadTrace
|
||||
* -CL_INVALID_VALUE if the thread_trace is not a valid 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
|
||||
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 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,
|
||||
* - 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
|
||||
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..
|
||||
*
|
||||
* \param command_queue must be a valid OpenCL command queue.
|
||||
*
|
||||
* \param thread_trace specifies the cl_threadtrace_amd object.
|
||||
*
|
||||
* \param mem_objects the cl_mem objects for trace recording
|
||||
*
|
||||
* \param mem_objects_num the number of cl_mem objects in the mem_objects
|
||||
*
|
||||
* \param buffer_size the size of each cl_mem object from mem_objects
|
||||
*
|
||||
* \param event_wait_list specify [is a pointer to] events that need to
|
||||
* complete before this particular command can be executed.
|
||||
* If \a event_wait_list is NULL, then this particular command does not wait
|
||||
* on any event to complete. If \a event_wait_list is NULL,
|
||||
* \a num_events_in_wait_list must be 0. If \a event_wait_list is not NULL,
|
||||
* the list of events pointed to by \a event_wait_list must be valid and
|
||||
* \a num_events_in_wait_list must be greater than 0. The events specified in
|
||||
* \a event_wait_list act as synchronization points.
|
||||
*
|
||||
* \param num_events_in_wait_list specify the number of events in
|
||||
* \a event_wait_list. It must be 0 if \a event_wait_list is NULL. It must be
|
||||
* greater than 0 if \a event_wait_list is not NULL.
|
||||
*
|
||||
* \param event returns an event object that identifies this particular
|
||||
* command and can be used to query or queue a wait for this particular
|
||||
* command to complete. \a event can be NULL in which case it will not be
|
||||
* possible for the application to query the status of this command or queue a
|
||||
* 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_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_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;
|
||||
|
||||
/*! \brief Get specific information about the OpenCL Thread Trace.
|
||||
*
|
||||
* \param thread_trace_info_param is an enum that identifies the Thread Trace information being
|
||||
* queried.
|
||||
*
|
||||
* \param param_value is a pointer to memory location where appropriate values
|
||||
* for a given \a threadTrace_info_param will be returned. If \a param_value is NULL,
|
||||
* it is ignored.
|
||||
*
|
||||
* \param param_value_size specifies the size in bytes of memory pointed to by
|
||||
* \a param_value. This size in bytes must be >= size of return type.
|
||||
*
|
||||
* \param param_value_size_ret returns the actual size in bytes of data being
|
||||
* queried by param_value. If \a param_value_size_ret is NULL, it is ignored.
|
||||
*
|
||||
* \return One of the following values:
|
||||
* CL_INVALID_OPERATION if cl_threadtrace_amd object is not valid
|
||||
* - CL_INVALID_VALUE if \a param_name is not one of the supported
|
||||
* values or if size in bytes specified by \a param_value_size is < size of
|
||||
* return type and \a param_value is not a NULL value.
|
||||
* CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required by the
|
||||
* 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;
|
||||
|
||||
/*! \brief Enqueues the thread trace command for the specified thread trace object.
|
||||
*
|
||||
* \param command_queue must be a valid OpenCL command queue.
|
||||
*
|
||||
* \param threadTraces specifies an array of cl_threadtrace_amd objects.
|
||||
*
|
||||
* \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_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_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 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.
|
||||
*/
|
||||
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*/
|
||||
@@ -0,0 +1,56 @@
|
||||
//
|
||||
// Copyright 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
//
|
||||
GLPREFIX(GLubyte*, glGetString, (GLenum name))
|
||||
|
||||
GLPREFIX(void, glBindBuffer, (GLenum target, GLuint buffer))
|
||||
//GLPREFIX(void, glBindFramebufferEXT, (GLenum target, GLuint framebuffer))
|
||||
GLPREFIX(void, glBindRenderbuffer, (GLenum target, GLuint renderbuffer))
|
||||
GLPREFIX(void, glBindTexture, (GLenum target, GLuint texture))
|
||||
GLPREFIX(void, glBufferData, (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage))
|
||||
|
||||
GLPREFIX(GLenum, glCheckFramebufferStatusEXT, (GLenum target))
|
||||
|
||||
GLPREFIX(void, glDeleteBuffers, (GLsizei n, const GLuint* buffers))
|
||||
GLPREFIX(void, glDrawPixels, (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels))
|
||||
|
||||
//GLPREFIX(void, glFramebufferRenderbufferEXT, (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer))
|
||||
|
||||
GLPREFIX(void, glGenBuffers, (GLsizei n, GLuint* buffers))
|
||||
//GLPREFIX(void, glGenFramebuffersEXT, (GLsizei n, GLuint* framebuffers))
|
||||
//10
|
||||
GLPREFIX(void, glGetBufferParameteriv, (GLenum target, GLenum pname, GLint* params))
|
||||
GLPREFIX(GLenum, glGetError, (void))
|
||||
GLPREFIX(void, glFinish, (void))
|
||||
GLPREFIX(void, glFlush, (void))
|
||||
GLPREFIX(GLenum, glClientWaitSync, (GLsync sync, GLbitfield flags, GLuint64 timeout))
|
||||
GLPREFIX(void, glGetIntegerv, (GLenum pname, GLint *params))
|
||||
GLPREFIX(void, glGetRenderbufferParameterivEXT, (GLenum target, GLenum pname, GLint* params))
|
||||
//GLPREFIX(GLubyte*, glGetString, (GLenum name))
|
||||
GLPREFIX(void, glGetTexImage, (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels))
|
||||
GLPREFIX(void, glGetTexLevelParameteriv, (GLenum target, GLint level, GLenum pname, GLint *params))
|
||||
GLPREFIX(void, glGetTexParameteriv, (GLenum target, GLenum pname, GLint *params))
|
||||
|
||||
GLPREFIX(GLboolean, glIsBuffer, (GLuint buffer))
|
||||
GLPREFIX(GLboolean, glIsRenderbufferEXT, (GLuint renderbuffer))
|
||||
GLPREFIX(GLboolean, glIsTexture, (GLuint texture))
|
||||
//20
|
||||
GLPREFIX(GLvoid*, glMapBuffer, (GLenum target, GLenum access))
|
||||
|
||||
GLPREFIX(void, glReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels))
|
||||
|
||||
GLPREFIX(void, glTexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels))
|
||||
GLPREFIX(void, glTexImage3D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels))
|
||||
|
||||
GLPREFIX(GLboolean, glUnmapBuffer, (GLenum target))
|
||||
|
||||
#ifdef _WIN32
|
||||
GLPREFIX(HGLRC, wglCreateContext, (HDC hdc))
|
||||
GLPREFIX(HGLRC, wglGetCurrentContext, (void))
|
||||
GLPREFIX(HDC, wglGetCurrentDC, (void))
|
||||
GLPREFIX(BOOL, wglDeleteContext, (HGLRC hglrc))
|
||||
GLPREFIX(BOOL, wglMakeCurrent, (HDC hdc, HGLRC hglrc))
|
||||
GLPREFIX(BOOL, wglShareLists, (HGLRC hglrc1, HGLRC hglrc2))
|
||||
#endif //_WIN32
|
||||
|
||||
#undef GLPREFIX
|
||||
@@ -0,0 +1 @@
|
||||
libamdocl32.so
|
||||
@@ -0,0 +1 @@
|
||||
libamdocl64.so
|
||||
@@ -0,0 +1,329 @@
|
||||
/* -*- mode: c; tab-width: 8; -*- */
|
||||
/* vi: set sw=4 ts=8: */
|
||||
/* Reference version of egl.h for EGL 1.4.
|
||||
* $Revision: 9356 $ on $Date: 2009-10-21 02:52:25 -0700 (Wed, 21 Oct 2009) $
|
||||
*/
|
||||
|
||||
/*
|
||||
** Copyright (c) 2007-2009 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
#ifndef __egl_h_
|
||||
#define __egl_h_
|
||||
|
||||
/* All platform-dependent types and macro boilerplate (such as EGLAPI
|
||||
* and EGLAPIENTRY) should go in eglplatform.h.
|
||||
*/
|
||||
#include <EGL/eglplatform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* EGL Types */
|
||||
/* EGLint is defined in eglplatform.h */
|
||||
typedef unsigned int EGLBoolean;
|
||||
typedef unsigned int EGLenum;
|
||||
typedef void *EGLConfig;
|
||||
typedef void *EGLContext;
|
||||
typedef void *EGLDisplay;
|
||||
typedef void *EGLSurface;
|
||||
typedef void *EGLClientBuffer;
|
||||
|
||||
/* EGL Versioning */
|
||||
#define EGL_VERSION_1_0 1
|
||||
#define EGL_VERSION_1_1 1
|
||||
#define EGL_VERSION_1_2 1
|
||||
#define EGL_VERSION_1_3 1
|
||||
#define EGL_VERSION_1_4 1
|
||||
|
||||
/* EGL Enumerants. Bitmasks and other exceptional cases aside, most
|
||||
* enums are assigned unique values starting at 0x3000.
|
||||
*/
|
||||
|
||||
/* EGL aliases */
|
||||
#define EGL_FALSE 0
|
||||
#define EGL_TRUE 1
|
||||
|
||||
/* Out-of-band handle values */
|
||||
#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0)
|
||||
#define EGL_NO_CONTEXT ((EGLContext)0)
|
||||
#define EGL_NO_DISPLAY ((EGLDisplay)0)
|
||||
#define EGL_NO_SURFACE ((EGLSurface)0)
|
||||
|
||||
/* Out-of-band attribute value */
|
||||
#define EGL_DONT_CARE ((EGLint)-1)
|
||||
|
||||
/* Errors / GetError return values */
|
||||
#define EGL_SUCCESS 0x3000
|
||||
#define EGL_NOT_INITIALIZED 0x3001
|
||||
#define EGL_BAD_ACCESS 0x3002
|
||||
#define EGL_BAD_ALLOC 0x3003
|
||||
#define EGL_BAD_ATTRIBUTE 0x3004
|
||||
#define EGL_BAD_CONFIG 0x3005
|
||||
#define EGL_BAD_CONTEXT 0x3006
|
||||
#define EGL_BAD_CURRENT_SURFACE 0x3007
|
||||
#define EGL_BAD_DISPLAY 0x3008
|
||||
#define EGL_BAD_MATCH 0x3009
|
||||
#define EGL_BAD_NATIVE_PIXMAP 0x300A
|
||||
#define EGL_BAD_NATIVE_WINDOW 0x300B
|
||||
#define EGL_BAD_PARAMETER 0x300C
|
||||
#define EGL_BAD_SURFACE 0x300D
|
||||
#define EGL_CONTEXT_LOST 0x300E /* EGL 1.1 - IMG_power_management */
|
||||
|
||||
/* Reserved 0x300F-0x301F for additional errors */
|
||||
|
||||
/* Config attributes */
|
||||
#define EGL_BUFFER_SIZE 0x3020
|
||||
#define EGL_ALPHA_SIZE 0x3021
|
||||
#define EGL_BLUE_SIZE 0x3022
|
||||
#define EGL_GREEN_SIZE 0x3023
|
||||
#define EGL_RED_SIZE 0x3024
|
||||
#define EGL_DEPTH_SIZE 0x3025
|
||||
#define EGL_STENCIL_SIZE 0x3026
|
||||
#define EGL_CONFIG_CAVEAT 0x3027
|
||||
#define EGL_CONFIG_ID 0x3028
|
||||
#define EGL_LEVEL 0x3029
|
||||
#define EGL_MAX_PBUFFER_HEIGHT 0x302A
|
||||
#define EGL_MAX_PBUFFER_PIXELS 0x302B
|
||||
#define EGL_MAX_PBUFFER_WIDTH 0x302C
|
||||
#define EGL_NATIVE_RENDERABLE 0x302D
|
||||
#define EGL_NATIVE_VISUAL_ID 0x302E
|
||||
#define EGL_NATIVE_VISUAL_TYPE 0x302F
|
||||
#define EGL_SAMPLES 0x3031
|
||||
#define EGL_SAMPLE_BUFFERS 0x3032
|
||||
#define EGL_SURFACE_TYPE 0x3033
|
||||
#define EGL_TRANSPARENT_TYPE 0x3034
|
||||
#define EGL_TRANSPARENT_BLUE_VALUE 0x3035
|
||||
#define EGL_TRANSPARENT_GREEN_VALUE 0x3036
|
||||
#define EGL_TRANSPARENT_RED_VALUE 0x3037
|
||||
#define EGL_NONE 0x3038 /* Attrib list terminator */
|
||||
#define EGL_BIND_TO_TEXTURE_RGB 0x3039
|
||||
#define EGL_BIND_TO_TEXTURE_RGBA 0x303A
|
||||
#define EGL_MIN_SWAP_INTERVAL 0x303B
|
||||
#define EGL_MAX_SWAP_INTERVAL 0x303C
|
||||
#define EGL_LUMINANCE_SIZE 0x303D
|
||||
#define EGL_ALPHA_MASK_SIZE 0x303E
|
||||
#define EGL_COLOR_BUFFER_TYPE 0x303F
|
||||
#define EGL_RENDERABLE_TYPE 0x3040
|
||||
#define EGL_MATCH_NATIVE_PIXMAP 0x3041 /* Pseudo-attribute (not queryable) */
|
||||
#define EGL_CONFORMANT 0x3042
|
||||
|
||||
/* Reserved 0x3041-0x304F for additional config attributes */
|
||||
|
||||
/* Config attribute values */
|
||||
#define EGL_SLOW_CONFIG 0x3050 /* EGL_CONFIG_CAVEAT value */
|
||||
#define EGL_NON_CONFORMANT_CONFIG 0x3051 /* EGL_CONFIG_CAVEAT value */
|
||||
#define EGL_TRANSPARENT_RGB 0x3052 /* EGL_TRANSPARENT_TYPE value */
|
||||
#define EGL_RGB_BUFFER 0x308E /* EGL_COLOR_BUFFER_TYPE value */
|
||||
#define EGL_LUMINANCE_BUFFER 0x308F /* EGL_COLOR_BUFFER_TYPE value */
|
||||
|
||||
/* More config attribute values, for EGL_TEXTURE_FORMAT */
|
||||
#define EGL_NO_TEXTURE 0x305C
|
||||
#define EGL_TEXTURE_RGB 0x305D
|
||||
#define EGL_TEXTURE_RGBA 0x305E
|
||||
#define EGL_TEXTURE_2D 0x305F
|
||||
|
||||
/* Config attribute mask bits */
|
||||
#define EGL_PBUFFER_BIT 0x0001 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_PIXMAP_BIT 0x0002 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_WINDOW_BIT 0x0004 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 /* EGL_SURFACE_TYPE mask bits */
|
||||
|
||||
#define EGL_OPENGL_ES_BIT 0x0001 /* EGL_RENDERABLE_TYPE mask bits */
|
||||
#define EGL_OPENVG_BIT 0x0002 /* EGL_RENDERABLE_TYPE mask bits */
|
||||
#define EGL_OPENGL_ES2_BIT 0x0004 /* EGL_RENDERABLE_TYPE mask bits */
|
||||
#define EGL_OPENGL_BIT 0x0008 /* EGL_RENDERABLE_TYPE mask bits */
|
||||
|
||||
/* QueryString targets */
|
||||
#define EGL_VENDOR 0x3053
|
||||
#define EGL_VERSION 0x3054
|
||||
#define EGL_EXTENSIONS 0x3055
|
||||
#define EGL_CLIENT_APIS 0x308D
|
||||
|
||||
/* QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */
|
||||
#define EGL_HEIGHT 0x3056
|
||||
#define EGL_WIDTH 0x3057
|
||||
#define EGL_LARGEST_PBUFFER 0x3058
|
||||
#define EGL_TEXTURE_FORMAT 0x3080
|
||||
#define EGL_TEXTURE_TARGET 0x3081
|
||||
#define EGL_MIPMAP_TEXTURE 0x3082
|
||||
#define EGL_MIPMAP_LEVEL 0x3083
|
||||
#define EGL_RENDER_BUFFER 0x3086
|
||||
#define EGL_VG_COLORSPACE 0x3087
|
||||
#define EGL_VG_ALPHA_FORMAT 0x3088
|
||||
#define EGL_HORIZONTAL_RESOLUTION 0x3090
|
||||
#define EGL_VERTICAL_RESOLUTION 0x3091
|
||||
#define EGL_PIXEL_ASPECT_RATIO 0x3092
|
||||
#define EGL_SWAP_BEHAVIOR 0x3093
|
||||
#define EGL_MULTISAMPLE_RESOLVE 0x3099
|
||||
|
||||
/* EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */
|
||||
#define EGL_BACK_BUFFER 0x3084
|
||||
#define EGL_SINGLE_BUFFER 0x3085
|
||||
|
||||
/* OpenVG color spaces */
|
||||
#define EGL_VG_COLORSPACE_sRGB 0x3089 /* EGL_VG_COLORSPACE value */
|
||||
#define EGL_VG_COLORSPACE_LINEAR 0x308A /* EGL_VG_COLORSPACE value */
|
||||
|
||||
/* OpenVG alpha formats */
|
||||
#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B /* EGL_ALPHA_FORMAT value */
|
||||
#define EGL_VG_ALPHA_FORMAT_PRE 0x308C /* EGL_ALPHA_FORMAT value */
|
||||
|
||||
/* Constant scale factor by which fractional display resolutions &
|
||||
* aspect ratio are scaled when queried as integer values.
|
||||
*/
|
||||
#define EGL_DISPLAY_SCALING 10000
|
||||
|
||||
/* Unknown display resolution/aspect ratio */
|
||||
#define EGL_UNKNOWN ((EGLint)-1)
|
||||
|
||||
/* Back buffer swap behaviors */
|
||||
#define EGL_BUFFER_PRESERVED 0x3094 /* EGL_SWAP_BEHAVIOR value */
|
||||
#define EGL_BUFFER_DESTROYED 0x3095 /* EGL_SWAP_BEHAVIOR value */
|
||||
|
||||
/* CreatePbufferFromClientBuffer buffer types */
|
||||
#define EGL_OPENVG_IMAGE 0x3096
|
||||
|
||||
/* QueryContext targets */
|
||||
#define EGL_CONTEXT_CLIENT_TYPE 0x3097
|
||||
|
||||
/* CreateContext attributes */
|
||||
#define EGL_CONTEXT_CLIENT_VERSION 0x3098
|
||||
|
||||
/* Multisample resolution behaviors */
|
||||
#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A /* EGL_MULTISAMPLE_RESOLVE value */
|
||||
#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B /* EGL_MULTISAMPLE_RESOLVE value */
|
||||
|
||||
/* BindAPI/QueryAPI targets */
|
||||
#define EGL_OPENGL_ES_API 0x30A0
|
||||
#define EGL_OPENVG_API 0x30A1
|
||||
#define EGL_OPENGL_API 0x30A2
|
||||
|
||||
/* GetCurrentSurface targets */
|
||||
#define EGL_DRAW 0x3059
|
||||
#define EGL_READ 0x305A
|
||||
|
||||
/* WaitNative engines */
|
||||
#define EGL_CORE_NATIVE_ENGINE 0x305B
|
||||
|
||||
/* EGL 1.2 tokens renamed for consistency in EGL 1.3 */
|
||||
#define EGL_COLORSPACE EGL_VG_COLORSPACE
|
||||
#define EGL_ALPHA_FORMAT EGL_VG_ALPHA_FORMAT
|
||||
#define EGL_COLORSPACE_sRGB EGL_VG_COLORSPACE_sRGB
|
||||
#define EGL_COLORSPACE_LINEAR EGL_VG_COLORSPACE_LINEAR
|
||||
#define EGL_ALPHA_FORMAT_NONPRE EGL_VG_ALPHA_FORMAT_NONPRE
|
||||
#define EGL_ALPHA_FORMAT_PRE EGL_VG_ALPHA_FORMAT_PRE
|
||||
|
||||
/* EGL extensions must request enum blocks from the Khronos
|
||||
* API Registrar, who maintains the enumerant registry. Submit
|
||||
* a bug in Khronos Bugzilla against task "Registry".
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* EGL Functions */
|
||||
|
||||
EGLAPI EGLint EGLAPIENTRY eglGetError(void);
|
||||
|
||||
EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy);
|
||||
|
||||
EGLAPI const char * EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
|
||||
EGLint config_size, EGLint *num_config);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,
|
||||
EGLConfig *configs, EGLint config_size,
|
||||
EGLint *num_config);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
|
||||
EGLint attribute, EGLint *value);
|
||||
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
|
||||
EGLNativeWindowType win,
|
||||
const EGLint *attrib_list);
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
|
||||
const EGLint *attrib_list);
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
|
||||
EGLNativePixmapType pixmap,
|
||||
const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface,
|
||||
EGLint attribute, EGLint *value);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api);
|
||||
EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void);
|
||||
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(
|
||||
EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
|
||||
EGLConfig config, const EGLint *attrib_list);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
|
||||
EGLint attribute, EGLint value);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval);
|
||||
|
||||
|
||||
EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config,
|
||||
EGLContext share_context,
|
||||
const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw,
|
||||
EGLSurface read, EGLContext ctx);
|
||||
|
||||
EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void);
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw);
|
||||
EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx,
|
||||
EGLint attribute, EGLint *value);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface,
|
||||
EGLNativePixmapType target);
|
||||
|
||||
/* This is a generic function pointer type, whose name indicates it must
|
||||
* be cast to the proper type *and calling convention* before use.
|
||||
*/
|
||||
typedef void (*__eglMustCastToProperFunctionPointerType)(void);
|
||||
|
||||
/* Now, define eglGetProcAddress using the generic function ptr. type */
|
||||
EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY
|
||||
eglGetProcAddress(const char *procname);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __egl_h_ */
|
||||
@@ -0,0 +1,645 @@
|
||||
#ifndef __eglext_h_
|
||||
#define __eglext_h_ 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Copyright (c) 2013 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
/*
|
||||
** This header is generated from the Khronos OpenGL / OpenGL ES XML
|
||||
** API Registry. The current version of the Registry, generator scripts
|
||||
** used to make the header, and the header can be found at
|
||||
** http://www.opengl.org/registry/
|
||||
**
|
||||
** Khronos $Revision: 24350 $ on $Date: 2013-12-04 12:46:23 -0800 (Wed, 04 Dec 2013) $
|
||||
*/
|
||||
|
||||
#include <EGL/eglplatform.h>
|
||||
|
||||
#define EGL_EGLEXT_VERSION 20131204
|
||||
|
||||
/* Generated C header for:
|
||||
* API: egl
|
||||
* Versions considered: .*
|
||||
* Versions emitted: _nomatch_^
|
||||
* Default extensions included: egl
|
||||
* Additional extensions included: _nomatch_^
|
||||
* Extensions removed: _nomatch_^
|
||||
*/
|
||||
|
||||
#ifndef EGL_KHR_cl_event
|
||||
#define EGL_KHR_cl_event 1
|
||||
#define EGL_CL_EVENT_HANDLE_KHR 0x309C
|
||||
#define EGL_SYNC_CL_EVENT_KHR 0x30FE
|
||||
#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF
|
||||
#endif /* EGL_KHR_cl_event */
|
||||
|
||||
#ifndef EGL_KHR_cl_event2
|
||||
#define EGL_KHR_cl_event2 1
|
||||
typedef void *EGLSyncKHR;
|
||||
typedef intptr_t EGLAttribKHR;
|
||||
typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync64KHR (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list);
|
||||
#endif
|
||||
#endif /* EGL_KHR_cl_event2 */
|
||||
|
||||
#ifndef EGL_KHR_client_get_all_proc_addresses
|
||||
#define EGL_KHR_client_get_all_proc_addresses 1
|
||||
#endif /* EGL_KHR_client_get_all_proc_addresses */
|
||||
|
||||
#ifndef EGL_KHR_config_attribs
|
||||
#define EGL_KHR_config_attribs 1
|
||||
#define EGL_CONFORMANT_KHR 0x3042
|
||||
#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020
|
||||
#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040
|
||||
#endif /* EGL_KHR_config_attribs */
|
||||
|
||||
#ifndef EGL_KHR_create_context
|
||||
#define EGL_KHR_create_context 1
|
||||
#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098
|
||||
#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB
|
||||
#define EGL_CONTEXT_FLAGS_KHR 0x30FC
|
||||
#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD
|
||||
#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD
|
||||
#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE
|
||||
#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF
|
||||
#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001
|
||||
#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
|
||||
#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004
|
||||
#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
|
||||
#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002
|
||||
#define EGL_OPENGL_ES3_BIT_KHR 0x00000040
|
||||
#endif /* EGL_KHR_create_context */
|
||||
|
||||
#ifndef EGL_KHR_fence_sync
|
||||
#define EGL_KHR_fence_sync 1
|
||||
#ifdef KHRONOS_SUPPORT_INT64
|
||||
#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0
|
||||
#define EGL_SYNC_CONDITION_KHR 0x30F8
|
||||
#define EGL_SYNC_FENCE_KHR 0x30F9
|
||||
#endif /* KHRONOS_SUPPORT_INT64 */
|
||||
#endif /* EGL_KHR_fence_sync */
|
||||
|
||||
#ifndef EGL_KHR_get_all_proc_addresses
|
||||
#define EGL_KHR_get_all_proc_addresses 1
|
||||
#endif /* EGL_KHR_get_all_proc_addresses */
|
||||
|
||||
#ifndef EGL_KHR_gl_renderbuffer_image
|
||||
#define EGL_KHR_gl_renderbuffer_image 1
|
||||
#define EGL_GL_RENDERBUFFER_KHR 0x30B9
|
||||
#endif /* EGL_KHR_gl_renderbuffer_image */
|
||||
|
||||
#ifndef EGL_KHR_gl_texture_2D_image
|
||||
#define EGL_KHR_gl_texture_2D_image 1
|
||||
#define EGL_GL_TEXTURE_2D_KHR 0x30B1
|
||||
#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC
|
||||
#endif /* EGL_KHR_gl_texture_2D_image */
|
||||
|
||||
#ifndef EGL_KHR_gl_texture_3D_image
|
||||
#define EGL_KHR_gl_texture_3D_image 1
|
||||
#define EGL_GL_TEXTURE_3D_KHR 0x30B2
|
||||
#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD
|
||||
#endif /* EGL_KHR_gl_texture_3D_image */
|
||||
|
||||
#ifndef EGL_KHR_gl_texture_cubemap_image
|
||||
#define EGL_KHR_gl_texture_cubemap_image 1
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8
|
||||
#endif /* EGL_KHR_gl_texture_cubemap_image */
|
||||
|
||||
#ifndef EGL_KHR_image
|
||||
#define EGL_KHR_image 1
|
||||
typedef void *EGLImageKHR;
|
||||
#define EGL_NATIVE_PIXMAP_KHR 0x30B0
|
||||
#define EGL_NO_IMAGE_KHR ((EGLImageKHR)0)
|
||||
typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image);
|
||||
#endif
|
||||
#endif /* EGL_KHR_image */
|
||||
|
||||
#ifndef EGL_KHR_image_base
|
||||
#define EGL_KHR_image_base 1
|
||||
#define EGL_IMAGE_PRESERVED_KHR 0x30D2
|
||||
#endif /* EGL_KHR_image_base */
|
||||
|
||||
#ifndef EGL_KHR_image_pixmap
|
||||
#define EGL_KHR_image_pixmap 1
|
||||
#endif /* EGL_KHR_image_pixmap */
|
||||
|
||||
#ifndef EGL_KHR_lock_surface
|
||||
#define EGL_KHR_lock_surface 1
|
||||
#define EGL_READ_SURFACE_BIT_KHR 0x0001
|
||||
#define EGL_WRITE_SURFACE_BIT_KHR 0x0002
|
||||
#define EGL_LOCK_SURFACE_BIT_KHR 0x0080
|
||||
#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100
|
||||
#define EGL_MATCH_FORMAT_KHR 0x3043
|
||||
#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0
|
||||
#define EGL_FORMAT_RGB_565_KHR 0x30C1
|
||||
#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2
|
||||
#define EGL_FORMAT_RGBA_8888_KHR 0x30C3
|
||||
#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4
|
||||
#define EGL_LOCK_USAGE_HINT_KHR 0x30C5
|
||||
#define EGL_BITMAP_POINTER_KHR 0x30C6
|
||||
#define EGL_BITMAP_PITCH_KHR 0x30C7
|
||||
#define EGL_BITMAP_ORIGIN_KHR 0x30C8
|
||||
#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9
|
||||
#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA
|
||||
#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB
|
||||
#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC
|
||||
#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD
|
||||
#define EGL_LOWER_LEFT_KHR 0x30CE
|
||||
#define EGL_UPPER_LEFT_KHR 0x30CF
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay dpy, EGLSurface surface);
|
||||
#endif
|
||||
#endif /* EGL_KHR_lock_surface */
|
||||
|
||||
#ifndef EGL_KHR_lock_surface2
|
||||
#define EGL_KHR_lock_surface2 1
|
||||
#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110
|
||||
#endif /* EGL_KHR_lock_surface2 */
|
||||
|
||||
#ifndef EGL_KHR_lock_surface3
|
||||
#define EGL_KHR_lock_surface3 1
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface64KHR (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value);
|
||||
#endif
|
||||
#endif /* EGL_KHR_lock_surface3 */
|
||||
|
||||
#ifndef EGL_KHR_reusable_sync
|
||||
#define EGL_KHR_reusable_sync 1
|
||||
typedef khronos_utime_nanoseconds_t EGLTimeKHR;
|
||||
#ifdef KHRONOS_SUPPORT_INT64
|
||||
#define EGL_SYNC_STATUS_KHR 0x30F1
|
||||
#define EGL_SIGNALED_KHR 0x30F2
|
||||
#define EGL_UNSIGNALED_KHR 0x30F3
|
||||
#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5
|
||||
#define EGL_CONDITION_SATISFIED_KHR 0x30F6
|
||||
#define EGL_SYNC_TYPE_KHR 0x30F7
|
||||
#define EGL_SYNC_REUSABLE_KHR 0x30FA
|
||||
#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001
|
||||
#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull
|
||||
#define EGL_NO_SYNC_KHR ((EGLSyncKHR)0)
|
||||
typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);
|
||||
typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync);
|
||||
EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
|
||||
#endif
|
||||
#endif /* KHRONOS_SUPPORT_INT64 */
|
||||
#endif /* EGL_KHR_reusable_sync */
|
||||
|
||||
#ifndef EGL_KHR_stream
|
||||
#define EGL_KHR_stream 1
|
||||
typedef void *EGLStreamKHR;
|
||||
typedef khronos_uint64_t EGLuint64KHR;
|
||||
#ifdef KHRONOS_SUPPORT_INT64
|
||||
#define EGL_NO_STREAM_KHR ((EGLStreamKHR)0)
|
||||
#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210
|
||||
#define EGL_PRODUCER_FRAME_KHR 0x3212
|
||||
#define EGL_CONSUMER_FRAME_KHR 0x3213
|
||||
#define EGL_STREAM_STATE_KHR 0x3214
|
||||
#define EGL_STREAM_STATE_CREATED_KHR 0x3215
|
||||
#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216
|
||||
#define EGL_STREAM_STATE_EMPTY_KHR 0x3217
|
||||
#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218
|
||||
#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219
|
||||
#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A
|
||||
#define EGL_BAD_STREAM_KHR 0x321B
|
||||
#define EGL_BAD_STATE_KHR 0x321C
|
||||
typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR (EGLDisplay dpy, const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);
|
||||
#endif
|
||||
#endif /* KHRONOS_SUPPORT_INT64 */
|
||||
#endif /* EGL_KHR_stream */
|
||||
|
||||
#ifndef EGL_KHR_stream_consumer_gltexture
|
||||
#define EGL_KHR_stream_consumer_gltexture 1
|
||||
#ifdef EGL_KHR_stream
|
||||
#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
#endif
|
||||
#endif /* EGL_KHR_stream */
|
||||
#endif /* EGL_KHR_stream_consumer_gltexture */
|
||||
|
||||
#ifndef EGL_KHR_stream_cross_process_fd
|
||||
#define EGL_KHR_stream_cross_process_fd 1
|
||||
typedef int EGLNativeFileDescriptorKHR;
|
||||
#ifdef EGL_KHR_stream
|
||||
#define EGL_NO_FILE_DESCRIPTOR_KHR ((EGLNativeFileDescriptorKHR)(-1))
|
||||
typedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLNativeFileDescriptorKHR EGLAPIENTRY eglGetStreamFileDescriptorKHR (EGLDisplay dpy, EGLStreamKHR stream);
|
||||
EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamFromFileDescriptorKHR (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);
|
||||
#endif
|
||||
#endif /* EGL_KHR_stream */
|
||||
#endif /* EGL_KHR_stream_cross_process_fd */
|
||||
|
||||
#ifndef EGL_KHR_stream_fifo
|
||||
#define EGL_KHR_stream_fifo 1
|
||||
#ifdef EGL_KHR_stream
|
||||
#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC
|
||||
#define EGL_STREAM_TIME_NOW_KHR 0x31FD
|
||||
#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE
|
||||
#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);
|
||||
#endif
|
||||
#endif /* EGL_KHR_stream */
|
||||
#endif /* EGL_KHR_stream_fifo */
|
||||
|
||||
#ifndef EGL_KHR_stream_producer_aldatalocator
|
||||
#define EGL_KHR_stream_producer_aldatalocator 1
|
||||
#ifdef EGL_KHR_stream
|
||||
#endif /* EGL_KHR_stream */
|
||||
#endif /* EGL_KHR_stream_producer_aldatalocator */
|
||||
|
||||
#ifndef EGL_KHR_stream_producer_eglsurface
|
||||
#define EGL_KHR_stream_producer_eglsurface 1
|
||||
#ifdef EGL_KHR_stream
|
||||
#define EGL_STREAM_BIT_KHR 0x0800
|
||||
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);
|
||||
#endif
|
||||
#endif /* EGL_KHR_stream */
|
||||
#endif /* EGL_KHR_stream_producer_eglsurface */
|
||||
|
||||
#ifndef EGL_KHR_surfaceless_context
|
||||
#define EGL_KHR_surfaceless_context 1
|
||||
#endif /* EGL_KHR_surfaceless_context */
|
||||
|
||||
#ifndef EGL_KHR_vg_parent_image
|
||||
#define EGL_KHR_vg_parent_image 1
|
||||
#define EGL_VG_PARENT_IMAGE_KHR 0x30BA
|
||||
#endif /* EGL_KHR_vg_parent_image */
|
||||
|
||||
#ifndef EGL_KHR_wait_sync
|
||||
#define EGL_KHR_wait_sync 1
|
||||
typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
|
||||
#endif
|
||||
#endif /* EGL_KHR_wait_sync */
|
||||
|
||||
#ifndef EGL_ANDROID_blob_cache
|
||||
#define EGL_ANDROID_blob_cache 1
|
||||
typedef khronos_ssize_t EGLsizeiANDROID;
|
||||
typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);
|
||||
typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);
|
||||
typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
|
||||
#endif
|
||||
#endif /* EGL_ANDROID_blob_cache */
|
||||
|
||||
#ifndef EGL_ANDROID_framebuffer_target
|
||||
#define EGL_ANDROID_framebuffer_target 1
|
||||
#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147
|
||||
#endif /* EGL_ANDROID_framebuffer_target */
|
||||
|
||||
#ifndef EGL_ANDROID_image_native_buffer
|
||||
#define EGL_ANDROID_image_native_buffer 1
|
||||
#define EGL_NATIVE_BUFFER_ANDROID 0x3140
|
||||
#endif /* EGL_ANDROID_image_native_buffer */
|
||||
|
||||
#ifndef EGL_ANDROID_native_fence_sync
|
||||
#define EGL_ANDROID_native_fence_sync 1
|
||||
#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144
|
||||
#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145
|
||||
#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146
|
||||
#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1
|
||||
typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR sync);
|
||||
#endif
|
||||
#endif /* EGL_ANDROID_native_fence_sync */
|
||||
|
||||
#ifndef EGL_ANDROID_recordable
|
||||
#define EGL_ANDROID_recordable 1
|
||||
#define EGL_RECORDABLE_ANDROID 0x3142
|
||||
#endif /* EGL_ANDROID_recordable */
|
||||
|
||||
#ifndef EGL_ANGLE_d3d_share_handle_client_buffer
|
||||
#define EGL_ANGLE_d3d_share_handle_client_buffer 1
|
||||
#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200
|
||||
#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */
|
||||
|
||||
#ifndef EGL_ANGLE_query_surface_pointer
|
||||
#define EGL_ANGLE_query_surface_pointer 1
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
|
||||
#endif
|
||||
#endif /* EGL_ANGLE_query_surface_pointer */
|
||||
|
||||
#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle
|
||||
#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
|
||||
#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */
|
||||
|
||||
#ifndef EGL_ARM_pixmap_multisample_discard
|
||||
#define EGL_ARM_pixmap_multisample_discard 1
|
||||
#define EGL_DISCARD_SAMPLES_ARM 0x3286
|
||||
#endif /* EGL_ARM_pixmap_multisample_discard */
|
||||
|
||||
#ifndef EGL_EXT_buffer_age
|
||||
#define EGL_EXT_buffer_age 1
|
||||
#define EGL_BUFFER_AGE_EXT 0x313D
|
||||
#endif /* EGL_EXT_buffer_age */
|
||||
|
||||
#ifndef EGL_EXT_client_extensions
|
||||
#define EGL_EXT_client_extensions 1
|
||||
#endif /* EGL_EXT_client_extensions */
|
||||
|
||||
#ifndef EGL_EXT_create_context_robustness
|
||||
#define EGL_EXT_create_context_robustness 1
|
||||
#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF
|
||||
#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138
|
||||
#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE
|
||||
#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF
|
||||
#endif /* EGL_EXT_create_context_robustness */
|
||||
|
||||
#ifndef EGL_EXT_image_dma_buf_import
|
||||
#define EGL_EXT_image_dma_buf_import 1
|
||||
#define EGL_LINUX_DMA_BUF_EXT 0x3270
|
||||
#define EGL_LINUX_DRM_FOURCC_EXT 0x3271
|
||||
#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272
|
||||
#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273
|
||||
#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274
|
||||
#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275
|
||||
#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276
|
||||
#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277
|
||||
#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278
|
||||
#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279
|
||||
#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A
|
||||
#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B
|
||||
#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C
|
||||
#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D
|
||||
#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E
|
||||
#define EGL_ITU_REC601_EXT 0x327F
|
||||
#define EGL_ITU_REC709_EXT 0x3280
|
||||
#define EGL_ITU_REC2020_EXT 0x3281
|
||||
#define EGL_YUV_FULL_RANGE_EXT 0x3282
|
||||
#define EGL_YUV_NARROW_RANGE_EXT 0x3283
|
||||
#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284
|
||||
#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285
|
||||
#endif /* EGL_EXT_image_dma_buf_import */
|
||||
|
||||
#ifndef EGL_EXT_multiview_window
|
||||
#define EGL_EXT_multiview_window 1
|
||||
#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134
|
||||
#endif /* EGL_EXT_multiview_window */
|
||||
|
||||
#ifndef EGL_EXT_platform_base
|
||||
#define EGL_EXT_platform_base 1
|
||||
typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list);
|
||||
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
|
||||
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT (EGLenum platform, void *native_display, const EGLint *attrib_list);
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
|
||||
#endif
|
||||
#endif /* EGL_EXT_platform_base */
|
||||
|
||||
#ifndef EGL_EXT_platform_wayland
|
||||
#define EGL_EXT_platform_wayland 1
|
||||
#define EGL_PLATFORM_WAYLAND_EXT 0x31D8
|
||||
#endif /* EGL_EXT_platform_wayland */
|
||||
|
||||
#ifndef EGL_EXT_platform_x11
|
||||
#define EGL_EXT_platform_x11 1
|
||||
#define EGL_PLATFORM_X11_EXT 0x31D5
|
||||
#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6
|
||||
#endif /* EGL_EXT_platform_x11 */
|
||||
|
||||
#ifndef EGL_EXT_swap_buffers_with_damage
|
||||
#define EGL_EXT_swap_buffers_with_damage 1
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
|
||||
#endif
|
||||
#endif /* EGL_EXT_swap_buffers_with_damage */
|
||||
|
||||
#ifndef EGL_HI_clientpixmap
|
||||
#define EGL_HI_clientpixmap 1
|
||||
struct EGLClientPixmapHI {
|
||||
void *pData;
|
||||
EGLint iWidth;
|
||||
EGLint iHeight;
|
||||
EGLint iStride;
|
||||
};
|
||||
#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74
|
||||
typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap);
|
||||
#endif
|
||||
#endif /* EGL_HI_clientpixmap */
|
||||
|
||||
#ifndef EGL_HI_colorformats
|
||||
#define EGL_HI_colorformats 1
|
||||
#define EGL_COLOR_FORMAT_HI 0x8F70
|
||||
#define EGL_COLOR_RGB_HI 0x8F71
|
||||
#define EGL_COLOR_RGBA_HI 0x8F72
|
||||
#define EGL_COLOR_ARGB_HI 0x8F73
|
||||
#endif /* EGL_HI_colorformats */
|
||||
|
||||
#ifndef EGL_IMG_context_priority
|
||||
#define EGL_IMG_context_priority 1
|
||||
#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100
|
||||
#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101
|
||||
#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102
|
||||
#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103
|
||||
#endif /* EGL_IMG_context_priority */
|
||||
|
||||
#ifndef EGL_MESA_drm_image
|
||||
#define EGL_MESA_drm_image 1
|
||||
#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0
|
||||
#define EGL_DRM_BUFFER_USE_MESA 0x31D1
|
||||
#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2
|
||||
#define EGL_DRM_BUFFER_MESA 0x31D3
|
||||
#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4
|
||||
#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001
|
||||
#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002
|
||||
typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);
|
||||
#endif
|
||||
#endif /* EGL_MESA_drm_image */
|
||||
|
||||
#ifndef EGL_MESA_platform_gbm
|
||||
#define EGL_MESA_platform_gbm 1
|
||||
#define EGL_PLATFORM_GBM_MESA 0x31D7
|
||||
#endif /* EGL_MESA_platform_gbm */
|
||||
|
||||
#ifndef EGL_NV_3dvision_surface
|
||||
#define EGL_NV_3dvision_surface 1
|
||||
#define EGL_AUTO_STEREO_NV 0x3136
|
||||
#endif /* EGL_NV_3dvision_surface */
|
||||
|
||||
#ifndef EGL_NV_coverage_sample
|
||||
#define EGL_NV_coverage_sample 1
|
||||
#define EGL_COVERAGE_BUFFERS_NV 0x30E0
|
||||
#define EGL_COVERAGE_SAMPLES_NV 0x30E1
|
||||
#endif /* EGL_NV_coverage_sample */
|
||||
|
||||
#ifndef EGL_NV_coverage_sample_resolve
|
||||
#define EGL_NV_coverage_sample_resolve 1
|
||||
#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131
|
||||
#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132
|
||||
#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133
|
||||
#endif /* EGL_NV_coverage_sample_resolve */
|
||||
|
||||
#ifndef EGL_NV_depth_nonlinear
|
||||
#define EGL_NV_depth_nonlinear 1
|
||||
#define EGL_DEPTH_ENCODING_NV 0x30E2
|
||||
#define EGL_DEPTH_ENCODING_NONE_NV 0
|
||||
#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3
|
||||
#endif /* EGL_NV_depth_nonlinear */
|
||||
|
||||
#ifndef EGL_NV_native_query
|
||||
#define EGL_NV_native_query 1
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType *display_id);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeDisplayNV (EGLDisplay dpy, EGLNativeDisplayType *display_id);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeWindowNV (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativePixmapNV (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap);
|
||||
#endif
|
||||
#endif /* EGL_NV_native_query */
|
||||
|
||||
#ifndef EGL_NV_post_convert_rounding
|
||||
#define EGL_NV_post_convert_rounding 1
|
||||
#endif /* EGL_NV_post_convert_rounding */
|
||||
|
||||
#ifndef EGL_NV_post_sub_buffer
|
||||
#define EGL_NV_post_sub_buffer 1
|
||||
#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);
|
||||
#endif
|
||||
#endif /* EGL_NV_post_sub_buffer */
|
||||
|
||||
#ifndef EGL_NV_stream_sync
|
||||
#define EGL_NV_stream_sync 1
|
||||
#define EGL_SYNC_NEW_FRAME_NV 0x321F
|
||||
typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateStreamSyncNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list);
|
||||
#endif
|
||||
#endif /* EGL_NV_stream_sync */
|
||||
|
||||
#ifndef EGL_NV_sync
|
||||
#define EGL_NV_sync 1
|
||||
typedef void *EGLSyncNV;
|
||||
typedef khronos_utime_nanoseconds_t EGLTimeNV;
|
||||
#ifdef KHRONOS_SUPPORT_INT64
|
||||
#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6
|
||||
#define EGL_SYNC_STATUS_NV 0x30E7
|
||||
#define EGL_SIGNALED_NV 0x30E8
|
||||
#define EGL_UNSIGNALED_NV 0x30E9
|
||||
#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001
|
||||
#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull
|
||||
#define EGL_ALREADY_SIGNALED_NV 0x30EA
|
||||
#define EGL_TIMEOUT_EXPIRED_NV 0x30EB
|
||||
#define EGL_CONDITION_SATISFIED_NV 0x30EC
|
||||
#define EGL_SYNC_TYPE_NV 0x30ED
|
||||
#define EGL_SYNC_CONDITION_NV 0x30EE
|
||||
#define EGL_SYNC_FENCE_NV 0x30EF
|
||||
#define EGL_NO_SYNC_NV ((EGLSyncNV)0)
|
||||
typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync);
|
||||
typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync);
|
||||
EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value);
|
||||
#endif
|
||||
#endif /* KHRONOS_SUPPORT_INT64 */
|
||||
#endif /* EGL_NV_sync */
|
||||
|
||||
#ifndef EGL_NV_system_time
|
||||
#define EGL_NV_system_time 1
|
||||
typedef khronos_utime_nanoseconds_t EGLuint64NV;
|
||||
#ifdef KHRONOS_SUPPORT_INT64
|
||||
typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void);
|
||||
typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void);
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV (void);
|
||||
EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV (void);
|
||||
#endif
|
||||
#endif /* KHRONOS_SUPPORT_INT64 */
|
||||
#endif /* EGL_NV_system_time */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,125 @@
|
||||
#ifndef __eglplatform_h_
|
||||
#define __eglplatform_h_
|
||||
|
||||
/*
|
||||
** Copyright (c) 2007-2013 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
/* Platform-specific types and definitions for egl.h
|
||||
* $Revision: 23432 $ on $Date: 2013-10-09 00:57:24 -0700 (Wed, 09 Oct 2013) $
|
||||
*
|
||||
* Adopters may modify khrplatform.h and this file to suit their platform.
|
||||
* You are encouraged to submit all modifications to the Khronos group so that
|
||||
* they can be included in future versions of this file. Please submit changes
|
||||
* by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
|
||||
* by filing a bug against product "EGL" component "Registry".
|
||||
*/
|
||||
|
||||
#include <KHR/khrplatform.h>
|
||||
|
||||
/* Macros used in EGL function prototype declarations.
|
||||
*
|
||||
* EGL functions should be prototyped as:
|
||||
*
|
||||
* EGLAPI return-type EGLAPIENTRY eglFunction(arguments);
|
||||
* typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments);
|
||||
*
|
||||
* KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h
|
||||
*/
|
||||
|
||||
#ifndef EGLAPI
|
||||
#define EGLAPI KHRONOS_APICALL
|
||||
#endif
|
||||
|
||||
#ifndef EGLAPIENTRY
|
||||
#define EGLAPIENTRY KHRONOS_APIENTRY
|
||||
#endif
|
||||
#define EGLAPIENTRYP EGLAPIENTRY*
|
||||
|
||||
/* The types NativeDisplayType, NativeWindowType, and NativePixmapType
|
||||
* are aliases of window-system-dependent types, such as X Display * or
|
||||
* Windows Device Context. They must be defined in platform-specific
|
||||
* code below. The EGL-prefixed versions of Native*Type are the same
|
||||
* types, renamed in EGL 1.3 so all types in the API start with "EGL".
|
||||
*
|
||||
* Khronos STRONGLY RECOMMENDS that you use the default definitions
|
||||
* provided below, since these changes affect both binary and source
|
||||
* portability of applications using EGL running on different EGL
|
||||
* implementations.
|
||||
*/
|
||||
|
||||
#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#endif
|
||||
#include <windows.h>
|
||||
|
||||
typedef HDC EGLNativeDisplayType;
|
||||
typedef HBITMAP EGLNativePixmapType;
|
||||
typedef HWND EGLNativeWindowType;
|
||||
|
||||
#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */
|
||||
|
||||
typedef int EGLNativeDisplayType;
|
||||
typedef void *EGLNativeWindowType;
|
||||
typedef void *EGLNativePixmapType;
|
||||
|
||||
#elif defined(__ANDROID__) || defined(ANDROID)
|
||||
|
||||
#include <android/native_window.h>
|
||||
|
||||
struct egl_native_pixmap_t;
|
||||
|
||||
typedef struct ANativeWindow* EGLNativeWindowType;
|
||||
typedef struct egl_native_pixmap_t* EGLNativePixmapType;
|
||||
typedef void* EGLNativeDisplayType;
|
||||
|
||||
#elif defined(__unix__)
|
||||
|
||||
/* X11 (tentative) */
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
typedef Display *EGLNativeDisplayType;
|
||||
typedef Pixmap EGLNativePixmapType;
|
||||
typedef Window EGLNativeWindowType;
|
||||
|
||||
#else
|
||||
#error "Platform not recognized"
|
||||
#endif
|
||||
|
||||
/* EGL 1.2 types, renamed for consistency in EGL 1.3 */
|
||||
typedef EGLNativeDisplayType NativeDisplayType;
|
||||
typedef EGLNativePixmapType NativePixmapType;
|
||||
typedef EGLNativeWindowType NativeWindowType;
|
||||
|
||||
|
||||
/* Define EGLint. This must be a signed integral type large enough to contain
|
||||
* all legal attribute names and values passed into and out of EGL, whether
|
||||
* their type is boolean, bitmask, enumerant (symbolic constant), integer,
|
||||
* handle, or other. While in general a 32-bit integer will suffice, if
|
||||
* handles are 64 bit types, then EGLint should be defined as a signed 64-bit
|
||||
* integer type.
|
||||
*/
|
||||
typedef khronos_int32_t EGLint;
|
||||
|
||||
#endif /* __eglplatform_h */
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,282 @@
|
||||
#ifndef __khrplatform_h_
|
||||
#define __khrplatform_h_
|
||||
|
||||
/*
|
||||
** Copyright (c) 2008-2009 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
/* Khronos platform-specific types and definitions.
|
||||
*
|
||||
* $Revision: 23298 $ on $Date: 2013-09-30 17:07:13 -0700 (Mon, 30 Sep 2013) $
|
||||
*
|
||||
* Adopters may modify this file to suit their platform. Adopters are
|
||||
* encouraged to submit platform specific modifications to the Khronos
|
||||
* group so that they can be included in future versions of this file.
|
||||
* Please submit changes by sending them to the public Khronos Bugzilla
|
||||
* (http://khronos.org/bugzilla) by filing a bug against product
|
||||
* "Khronos (general)" component "Registry".
|
||||
*
|
||||
* A predefined template which fills in some of the bug fields can be
|
||||
* reached using http://tinyurl.com/khrplatform-h-bugreport, but you
|
||||
* must create a Bugzilla login first.
|
||||
*
|
||||
*
|
||||
* See the Implementer's Guidelines for information about where this file
|
||||
* should be located on your system and for more details of its use:
|
||||
* http://www.khronos.org/registry/implementers_guide.pdf
|
||||
*
|
||||
* This file should be included as
|
||||
* #include <KHR/khrplatform.h>
|
||||
* by Khronos client API header files that use its types and defines.
|
||||
*
|
||||
* The types in khrplatform.h should only be used to define API-specific types.
|
||||
*
|
||||
* Types defined in khrplatform.h:
|
||||
* khronos_int8_t signed 8 bit
|
||||
* khronos_uint8_t unsigned 8 bit
|
||||
* khronos_int16_t signed 16 bit
|
||||
* khronos_uint16_t unsigned 16 bit
|
||||
* khronos_int32_t signed 32 bit
|
||||
* khronos_uint32_t unsigned 32 bit
|
||||
* khronos_int64_t signed 64 bit
|
||||
* khronos_uint64_t unsigned 64 bit
|
||||
* khronos_intptr_t signed same number of bits as a pointer
|
||||
* khronos_uintptr_t unsigned same number of bits as a pointer
|
||||
* khronos_ssize_t signed size
|
||||
* khronos_usize_t unsigned size
|
||||
* khronos_float_t signed 32 bit floating point
|
||||
* khronos_time_ns_t unsigned 64 bit time in nanoseconds
|
||||
* khronos_utime_nanoseconds_t unsigned time interval or absolute time in
|
||||
* nanoseconds
|
||||
* khronos_stime_nanoseconds_t signed time interval in nanoseconds
|
||||
* khronos_boolean_enum_t enumerated boolean type. This should
|
||||
* only be used as a base type when a client API's boolean type is
|
||||
* an enum. Client APIs which use an integer or other type for
|
||||
* booleans cannot use this as the base type for their boolean.
|
||||
*
|
||||
* Tokens defined in khrplatform.h:
|
||||
*
|
||||
* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
|
||||
*
|
||||
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
|
||||
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
|
||||
*
|
||||
* Calling convention macros defined in this file:
|
||||
* KHRONOS_APICALL
|
||||
* KHRONOS_APIENTRY
|
||||
* KHRONOS_APIATTRIBUTES
|
||||
*
|
||||
* These may be used in function prototypes as:
|
||||
*
|
||||
* KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
|
||||
* int arg1,
|
||||
* int arg2) KHRONOS_APIATTRIBUTES;
|
||||
*/
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APICALL
|
||||
*-------------------------------------------------------------------------
|
||||
* This precedes the return type of the function in the function prototype.
|
||||
*/
|
||||
#if defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||
# define KHRONOS_APICALL __declspec(dllimport)
|
||||
#elif defined (__SYMBIAN32__)
|
||||
# define KHRONOS_APICALL IMPORT_C
|
||||
#else
|
||||
# define KHRONOS_APICALL
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APIENTRY
|
||||
*-------------------------------------------------------------------------
|
||||
* This follows the return type of the function and precedes the function
|
||||
* name in the function prototype.
|
||||
*/
|
||||
#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
|
||||
/* Win32 but not WinCE */
|
||||
# define KHRONOS_APIENTRY __stdcall
|
||||
#else
|
||||
# define KHRONOS_APIENTRY
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APIATTRIBUTES
|
||||
*-------------------------------------------------------------------------
|
||||
* This follows the closing parenthesis of the function prototype arguments.
|
||||
*/
|
||||
#if defined (__ARMCC_2__)
|
||||
#define KHRONOS_APIATTRIBUTES __softfp
|
||||
#else
|
||||
#define KHRONOS_APIATTRIBUTES
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* basic type definitions
|
||||
*-----------------------------------------------------------------------*/
|
||||
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
|
||||
|
||||
|
||||
/*
|
||||
* Using <stdint.h>
|
||||
*/
|
||||
#include <stdint.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(__VMS ) || defined(__sgi)
|
||||
|
||||
/*
|
||||
* Using <inttypes.h>
|
||||
*/
|
||||
#include <inttypes.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||
|
||||
/*
|
||||
* Win32
|
||||
*/
|
||||
typedef __int32 khronos_int32_t;
|
||||
typedef unsigned __int32 khronos_uint32_t;
|
||||
typedef __int64 khronos_int64_t;
|
||||
typedef unsigned __int64 khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(__sun__) || defined(__digital__)
|
||||
|
||||
/*
|
||||
* Sun or Digital
|
||||
*/
|
||||
typedef int khronos_int32_t;
|
||||
typedef unsigned int khronos_uint32_t;
|
||||
#if defined(__arch64__) || defined(_LP64)
|
||||
typedef long int khronos_int64_t;
|
||||
typedef unsigned long int khronos_uint64_t;
|
||||
#else
|
||||
typedef long long int khronos_int64_t;
|
||||
typedef unsigned long long int khronos_uint64_t;
|
||||
#endif /* __arch64__ */
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif 0
|
||||
|
||||
/*
|
||||
* Hypothetical platform with no float or int64 support
|
||||
*/
|
||||
typedef int khronos_int32_t;
|
||||
typedef unsigned int khronos_uint32_t;
|
||||
#define KHRONOS_SUPPORT_INT64 0
|
||||
#define KHRONOS_SUPPORT_FLOAT 0
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Generic fallback
|
||||
*/
|
||||
#include <stdint.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Types that are (so far) the same on all platforms
|
||||
*/
|
||||
typedef signed char khronos_int8_t;
|
||||
typedef unsigned char khronos_uint8_t;
|
||||
typedef signed short int khronos_int16_t;
|
||||
typedef unsigned short int khronos_uint16_t;
|
||||
|
||||
/*
|
||||
* Types that differ between LLP64 and LP64 architectures - in LLP64,
|
||||
* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
|
||||
* to be the only LLP64 architecture in current use.
|
||||
*/
|
||||
#ifdef _WIN64
|
||||
typedef signed long long int khronos_intptr_t;
|
||||
typedef unsigned long long int khronos_uintptr_t;
|
||||
typedef signed long long int khronos_ssize_t;
|
||||
typedef unsigned long long int khronos_usize_t;
|
||||
#else
|
||||
typedef signed long int khronos_intptr_t;
|
||||
typedef unsigned long int khronos_uintptr_t;
|
||||
typedef signed long int khronos_ssize_t;
|
||||
typedef unsigned long int khronos_usize_t;
|
||||
#endif
|
||||
|
||||
#if KHRONOS_SUPPORT_FLOAT
|
||||
/*
|
||||
* Float type
|
||||
*/
|
||||
typedef float khronos_float_t;
|
||||
#endif
|
||||
|
||||
#if KHRONOS_SUPPORT_INT64
|
||||
/* Time types
|
||||
*
|
||||
* These types can be used to represent a time interval in nanoseconds or
|
||||
* an absolute Unadjusted System Time. Unadjusted System Time is the number
|
||||
* of nanoseconds since some arbitrary system event (e.g. since the last
|
||||
* time the system booted). The Unadjusted System Time is an unsigned
|
||||
* 64 bit value that wraps back to 0 every 584 years. Time intervals
|
||||
* may be either signed or unsigned.
|
||||
*/
|
||||
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
|
||||
typedef khronos_int64_t khronos_stime_nanoseconds_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Dummy value used to pad enum types to 32 bits.
|
||||
*/
|
||||
#ifndef KHRONOS_MAX_ENUM
|
||||
#define KHRONOS_MAX_ENUM 0x7FFFFFFF
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Enumerated boolean type
|
||||
*
|
||||
* Values other than zero should be considered to be true. Therefore
|
||||
* comparisons should not be made against KHRONOS_TRUE.
|
||||
*/
|
||||
typedef enum {
|
||||
KHRONOS_FALSE = 0,
|
||||
KHRONOS_TRUE = 1,
|
||||
KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
|
||||
} khronos_boolean_enum_t;
|
||||
|
||||
#endif /* __khrplatform_h_ */
|
||||
File diff soppresso perché troppo grande
Carica Diff
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,126 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008-2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
#ifndef __OPENCL_CL_D3D10_H
|
||||
#define __OPENCL_CL_D3D10_H
|
||||
|
||||
#include <d3d10.h>
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* cl_khr_d3d10_sharing */
|
||||
#define cl_khr_d3d10_sharing 1
|
||||
|
||||
typedef cl_uint cl_d3d10_device_source_khr;
|
||||
typedef cl_uint cl_d3d10_device_set_khr;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// Error Codes
|
||||
#define CL_INVALID_D3D10_DEVICE_KHR -1002
|
||||
#define CL_INVALID_D3D10_RESOURCE_KHR -1003
|
||||
#define CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR -1004
|
||||
#define CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR -1005
|
||||
|
||||
// cl_d3d10_device_source_nv
|
||||
#define CL_D3D10_DEVICE_KHR 0x4010
|
||||
#define CL_D3D10_DXGI_ADAPTER_KHR 0x4011
|
||||
|
||||
// cl_d3d10_device_set_nv
|
||||
#define CL_PREFERRED_DEVICES_FOR_D3D10_KHR 0x4012
|
||||
#define CL_ALL_DEVICES_FOR_D3D10_KHR 0x4013
|
||||
|
||||
// cl_context_info
|
||||
#define CL_CONTEXT_D3D10_DEVICE_KHR 0x4014
|
||||
#define CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 0x402C
|
||||
|
||||
// cl_mem_info
|
||||
#define CL_MEM_D3D10_RESOURCE_KHR 0x4015
|
||||
|
||||
// cl_image_info
|
||||
#define CL_IMAGE_D3D10_SUBRESOURCE_KHR 0x4016
|
||||
|
||||
// cl_command_type
|
||||
#define CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR 0x4017
|
||||
#define CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR 0x4018
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromD3D10KHR_fn)(
|
||||
cl_platform_id platform,
|
||||
cl_d3d10_device_source_khr d3d_device_source,
|
||||
void * d3d_object,
|
||||
cl_d3d10_device_set_khr d3d_device_set,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * devices,
|
||||
cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10BufferKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Buffer * resource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10Texture2DKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Texture2D * resource,
|
||||
UINT subresource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10Texture3DKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Texture3D * resource,
|
||||
UINT subresource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireD3D10ObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D10ObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __OPENCL_CL_D3D10_H
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008-2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
#ifndef __OPENCL_CL_D3D11_H
|
||||
#define __OPENCL_CL_D3D11_H
|
||||
|
||||
#include <d3d11.h>
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* cl_khr_d3d11_sharing */
|
||||
#define cl_khr_d3d11_sharing 1
|
||||
|
||||
typedef cl_uint cl_d3d11_device_source_khr;
|
||||
typedef cl_uint cl_d3d11_device_set_khr;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// Error Codes
|
||||
#define CL_INVALID_D3D11_DEVICE_KHR -1006
|
||||
#define CL_INVALID_D3D11_RESOURCE_KHR -1007
|
||||
#define CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR -1008
|
||||
#define CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR -1009
|
||||
|
||||
// cl_d3d11_device_source
|
||||
#define CL_D3D11_DEVICE_KHR 0x4019
|
||||
#define CL_D3D11_DXGI_ADAPTER_KHR 0x401A
|
||||
|
||||
// cl_d3d11_device_set
|
||||
#define CL_PREFERRED_DEVICES_FOR_D3D11_KHR 0x401B
|
||||
#define CL_ALL_DEVICES_FOR_D3D11_KHR 0x401C
|
||||
|
||||
// cl_context_info
|
||||
#define CL_CONTEXT_D3D11_DEVICE_KHR 0x401D
|
||||
#define CL_CONTEXT_D3D11_PREFER_SHARED_RESOURCES_KHR 0x402D
|
||||
|
||||
// cl_mem_info
|
||||
#define CL_MEM_D3D11_RESOURCE_KHR 0x401E
|
||||
|
||||
// cl_image_info
|
||||
#define CL_IMAGE_D3D11_SUBRESOURCE_KHR 0x401F
|
||||
|
||||
// cl_command_type
|
||||
#define CL_COMMAND_ACQUIRE_D3D11_OBJECTS_KHR 0x4020
|
||||
#define CL_COMMAND_RELEASE_D3D11_OBJECTS_KHR 0x4021
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromD3D11KHR_fn)(
|
||||
cl_platform_id platform,
|
||||
cl_d3d11_device_source_khr d3d_device_source,
|
||||
void * d3d_object,
|
||||
cl_d3d11_device_set_khr d3d_device_set,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * devices,
|
||||
cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11BufferKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Buffer * resource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11Texture2DKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Texture2D * resource,
|
||||
UINT subresource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11Texture3DKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Texture3D * resource,
|
||||
UINT subresource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireD3D11ObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D11ObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __OPENCL_CL_D3D11_H
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008-2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
#ifndef __OPENCL_CL_DX9_MEDIA_SHARING_H
|
||||
#define __OPENCL_CL_DX9_MEDIA_SHARING_H
|
||||
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
/* cl_khr_dx9_media_sharing */
|
||||
#define cl_khr_dx9_media_sharing 1
|
||||
|
||||
typedef cl_uint cl_dx9_media_adapter_type_khr;
|
||||
typedef cl_uint cl_dx9_media_adapter_set_khr;
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <d3d9.h>
|
||||
typedef struct _cl_dx9_surface_info_khr
|
||||
{
|
||||
IDirect3DSurface9 *resource;
|
||||
HANDLE shared_handle;
|
||||
} cl_dx9_surface_info_khr;
|
||||
#endif
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
// Error Codes
|
||||
#define CL_INVALID_DX9_MEDIA_ADAPTER_KHR -1010
|
||||
#define CL_INVALID_DX9_MEDIA_SURFACE_KHR -1011
|
||||
#define CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR -1012
|
||||
#define CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR -1013
|
||||
|
||||
// cl_media_adapter_type_khr
|
||||
#define CL_ADAPTER_D3D9_KHR 0x2020
|
||||
#define CL_ADAPTER_D3D9EX_KHR 0x2021
|
||||
#define CL_ADAPTER_DXVA_KHR 0x2022
|
||||
|
||||
// cl_media_adapter_set_khr
|
||||
#define CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR 0x2023
|
||||
#define CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR 0x2024
|
||||
|
||||
// cl_context_info
|
||||
#define CL_CONTEXT_ADAPTER_D3D9_KHR 0x2025
|
||||
#define CL_CONTEXT_ADAPTER_D3D9EX_KHR 0x2026
|
||||
#define CL_CONTEXT_ADAPTER_DXVA_KHR 0x2027
|
||||
|
||||
// cl_mem_info
|
||||
#define CL_MEM_DX9_MEDIA_ADAPTER_TYPE_KHR 0x2028
|
||||
#define CL_MEM_DX9_MEDIA_SURFACE_INFO_KHR 0x2029
|
||||
|
||||
// cl_image_info
|
||||
#define CL_IMAGE_DX9_MEDIA_PLANE_KHR 0x202A
|
||||
|
||||
// cl_command_type
|
||||
#define CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR 0x202B
|
||||
#define CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR 0x202C
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromDX9MediaAdapterKHR_fn)(
|
||||
cl_platform_id platform,
|
||||
cl_uint num_media_adapters,
|
||||
cl_dx9_media_adapter_type_khr * media_adapter_type,
|
||||
void * media_adapters,
|
||||
cl_dx9_media_adapter_set_khr media_adapter_set,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * devices,
|
||||
cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromDX9MediaSurfaceKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
cl_dx9_media_adapter_type_khr adapter_type,
|
||||
void * surface_info,
|
||||
cl_uint plane,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireDX9MediaSurfacesKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseDX9MediaSurfacesKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __OPENCL_CL_DX9_MEDIA_SHARING_H
|
||||
|
||||
@@ -0,0 +1,489 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2008-2013 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
******************************************************************************/
|
||||
|
||||
/* $Revision: 14835 $ on $Date: 2011-05-26 11:32:00 -0700 (Thu, 26 May 2011) $ */
|
||||
|
||||
/* cl_ext.h contains OpenCL extensions which don't have external */
|
||||
/* (OpenGL, D3D) dependencies. */
|
||||
|
||||
#ifndef __CL_EXT_H
|
||||
#define __CL_EXT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenCL/cl.h>
|
||||
#include <AvailabilityMacros.h>
|
||||
#else
|
||||
#include <CL/cl.h>
|
||||
#endif
|
||||
|
||||
/* cl_khr_fp16 extension - no extension #define since it has no functions */
|
||||
#define CL_DEVICE_HALF_FP_CONFIG 0x1033
|
||||
|
||||
/* Memory object destruction
|
||||
*
|
||||
* Apple extension for use to manage externally allocated buffers used with cl_mem objects with CL_MEM_USE_HOST_PTR
|
||||
*
|
||||
* Registers a user callback function that will be called when the memory object is deleted and its resources
|
||||
* freed. Each call to clSetMemObjectCallbackFn registers the specified user callback function on a callback
|
||||
* stack associated with memobj. The registered user callback functions are called in the reverse order in
|
||||
* which they were registered. The user callback functions are called and then the memory object is deleted
|
||||
* and its resources freed. This provides a mechanism for the application (and libraries) using memobj to be
|
||||
* notified when the memory referenced by host_ptr, specified when the memory object is created and used as
|
||||
* the storage bits for the memory object, can be reused or freed.
|
||||
*
|
||||
* The application may not call CL api's with the cl_mem object passed to the pfn_notify.
|
||||
*
|
||||
* Please check for the "cl_APPLE_SetMemObjectDestructor" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS)
|
||||
* before using.
|
||||
*/
|
||||
#define cl_APPLE_SetMemObjectDestructor 1
|
||||
cl_int CL_API_ENTRY clSetMemObjectDestructorAPPLE( cl_mem /* memobj */,
|
||||
void (* /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/),
|
||||
void * /*user_data */ ) CL_EXT_SUFFIX__VERSION_1_0;
|
||||
|
||||
|
||||
/* Context Logging Functions
|
||||
*
|
||||
* The next three convenience functions are intended to be used as the pfn_notify parameter to clCreateContext().
|
||||
* Please check for the "cl_APPLE_ContextLoggingFunctions" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS)
|
||||
* before using.
|
||||
*
|
||||
* clLogMessagesToSystemLog fowards on all log messages to the Apple System Logger
|
||||
*/
|
||||
#define cl_APPLE_ContextLoggingFunctions 1
|
||||
extern void CL_API_ENTRY clLogMessagesToSystemLogAPPLE( const char * /* errstr */,
|
||||
const void * /* private_info */,
|
||||
size_t /* cb */,
|
||||
void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* clLogMessagesToStdout sends all log messages to the file descriptor stdout */
|
||||
extern void CL_API_ENTRY clLogMessagesToStdoutAPPLE( const char * /* errstr */,
|
||||
const void * /* private_info */,
|
||||
size_t /* cb */,
|
||||
void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* clLogMessagesToStderr sends all log messages to the file descriptor stderr */
|
||||
extern void CL_API_ENTRY clLogMessagesToStderrAPPLE( const char * /* errstr */,
|
||||
const void * /* private_info */,
|
||||
size_t /* cb */,
|
||||
void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0;
|
||||
|
||||
|
||||
/************************
|
||||
* cl_khr_icd extension *
|
||||
************************/
|
||||
#define cl_khr_icd 1
|
||||
|
||||
/* cl_platform_info */
|
||||
#define CL_PLATFORM_ICD_SUFFIX_KHR 0x0920
|
||||
|
||||
/* Additional Error Codes */
|
||||
#define CL_PLATFORM_NOT_FOUND_KHR -1001
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clIcdGetPlatformIDsKHR(cl_uint /* num_entries */,
|
||||
cl_platform_id * /* platforms */,
|
||||
cl_uint * /* num_platforms */);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clIcdGetPlatformIDsKHR_fn)(
|
||||
cl_uint /* num_entries */,
|
||||
cl_platform_id * /* platforms */,
|
||||
cl_uint * /* num_platforms */);
|
||||
|
||||
|
||||
/* Extension: cl_khr_image2D_buffer
|
||||
*
|
||||
* This extension allows a 2D image to be created from a cl_mem buffer without a copy.
|
||||
* The type associated with a 2D image created from a buffer in an OpenCL program is image2d_t.
|
||||
* Both the sampler and sampler-less read_image built-in functions are supported for 2D images
|
||||
* and 2D images created from a buffer. Similarly, the write_image built-ins are also supported
|
||||
* for 2D images created from a buffer.
|
||||
*
|
||||
* When the 2D image from buffer is created, the client must specify the width,
|
||||
* height, image format (i.e. channel order and channel data type) and optionally the row pitch
|
||||
*
|
||||
* The pitch specified must be a multiple of CL_DEVICE_IMAGE_PITCH_ALIGNMENT pixels.
|
||||
* The base address of the buffer must be aligned to CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT pixels.
|
||||
*/
|
||||
|
||||
/*************************************
|
||||
* cl_khr_initalize_memory extension *
|
||||
*************************************/
|
||||
|
||||
#define CL_CONTEXT_MEMORY_INITIALIZE_KHR 0x200E
|
||||
|
||||
|
||||
/**************************************
|
||||
* cl_khr_terminate_context extension *
|
||||
**************************************/
|
||||
|
||||
#define CL_DEVICE_TERMINATE_CAPABILITY_KHR 0x200F
|
||||
#define CL_CONTEXT_TERMINATE_KHR 0x2010
|
||||
|
||||
#define cl_khr_terminate_context 1
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clTerminateContextKHR(cl_context /* context */) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clTerminateContextKHR_fn)(cl_context /* context */) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
// <amd_internal>
|
||||
/******************************
|
||||
* cl_khr_subgroups extension *
|
||||
******************************/
|
||||
|
||||
#define cl_khr_subgroups 1
|
||||
|
||||
typedef cl_uint cl_kernel_sub_group_info;
|
||||
|
||||
#define CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE 0x2011
|
||||
#define CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE 0x2012
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetKernelSubGroupInfoKHR(cl_kernel /* kernel */,
|
||||
cl_device_id /* device */,
|
||||
cl_kernel_sub_group_info /* param_name */,
|
||||
size_t /* input_value_size */,
|
||||
const void * /* input_value */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetKernelSubGroupInfoKHR_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_device_id /* device */,
|
||||
cl_kernel_sub_group_info /* param_name */,
|
||||
size_t /* input_value_size */,
|
||||
const void * /* input_value */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
// </amd_internal>
|
||||
|
||||
/*
|
||||
* Extension: cl_khr_spir
|
||||
*
|
||||
* This extension adds support to create an OpenCL program object from a
|
||||
* Standard Portable Intermediate Representation (SPIR) instance
|
||||
*/
|
||||
|
||||
// KHR SPIR extension (Section 9.15.2 in the extension SPEC)
|
||||
// TODO: The values have been approved by khronos and waiting to be updated in official header file.
|
||||
#define CL_DEVICE_SPIR_VERSIONS 0x40E0
|
||||
#define CL_PROGRAM_BINARY_TYPE_INTERMEDIATE 0x40E1
|
||||
|
||||
/******************************************
|
||||
* cl_nv_device_attribute_query extension *
|
||||
******************************************/
|
||||
/* cl_nv_device_attribute_query extension - no extension #define since it has no functions */
|
||||
#define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000
|
||||
#define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001
|
||||
#define CL_DEVICE_REGISTERS_PER_BLOCK_NV 0x4002
|
||||
#define CL_DEVICE_WARP_SIZE_NV 0x4003
|
||||
#define CL_DEVICE_GPU_OVERLAP_NV 0x4004
|
||||
#define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005
|
||||
#define CL_DEVICE_INTEGRATED_MEMORY_NV 0x4006
|
||||
|
||||
/*********************************
|
||||
* cl_amd_device_memory_flags *
|
||||
*********************************/
|
||||
#define cl_amd_device_memory_flags 1
|
||||
#define CL_MEM_USE_PERSISTENT_MEM_AMD (1 << 6) // Alloc from GPU's CPU visible heap
|
||||
|
||||
/* cl_device_info */
|
||||
#define CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT 0x4032
|
||||
|
||||
/*********************************
|
||||
* cl_amd_device_attribute_query *
|
||||
*********************************/
|
||||
#define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD 0x4036
|
||||
#define CL_DEVICE_TOPOLOGY_AMD 0x4037
|
||||
#define CL_DEVICE_BOARD_NAME_AMD 0x4038
|
||||
#define CL_DEVICE_GLOBAL_FREE_MEMORY_AMD 0x4039
|
||||
#define CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD 0x4040
|
||||
#define CL_DEVICE_SIMD_WIDTH_AMD 0x4041
|
||||
#define CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD 0x4042
|
||||
#define CL_DEVICE_WAVEFRONT_WIDTH_AMD 0x4043
|
||||
#define CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD 0x4044
|
||||
#define CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD 0x4045
|
||||
#define CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD 0x4046
|
||||
#define CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD 0x4047
|
||||
#define CL_DEVICE_LOCAL_MEM_BANKS_AMD 0x4048
|
||||
#define CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD 0x4049
|
||||
#define CL_DEVICE_GFXIP_MAJOR_AMD 0x404A
|
||||
#define CL_DEVICE_GFXIP_MINOR_AMD 0x404B
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct { cl_uint type; cl_uint data[5]; } raw;
|
||||
struct { cl_uint type; cl_char unused[17]; cl_char bus; cl_char device; cl_char function; } pcie;
|
||||
} cl_device_topology_amd;
|
||||
|
||||
#define CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD 1
|
||||
|
||||
|
||||
// <amd_internal>
|
||||
/*************
|
||||
* cl_amd_hsa *
|
||||
**************/
|
||||
#define CL_HSA_ENABLED_AMD (1ull << 62)
|
||||
#define CL_HSA_DISABLED_AMD (1ull << 63)
|
||||
|
||||
/***************************
|
||||
* cl_amd_command_intercept *
|
||||
***************************/
|
||||
#define CL_CONTEXT_COMMAND_INTERCEPT_CALLBACK_AMD 0x403D
|
||||
#define CL_QUEUE_COMMAND_INTERCEPT_ENABLE_AMD (1ull << 63)
|
||||
|
||||
typedef cl_int (CL_CALLBACK * intercept_callback_fn)(cl_event, cl_int *);
|
||||
|
||||
/**************************
|
||||
* cl_amd_command_queue_info *
|
||||
**************************/
|
||||
#define CL_QUEUE_THREAD_HANDLE_AMD 0x403E
|
||||
|
||||
/***************************************
|
||||
* cl-gl depth buffer interop extension *
|
||||
****************************************/
|
||||
|
||||
#define CL_DEPTH 0x10BD
|
||||
#define CL_DEPTH_STENCIL 0x10BE
|
||||
#define CL_UNORM_INT24 0x10DF
|
||||
#define CL_GL_NUM_SAMPLES 0x2012
|
||||
// </amd_internal>
|
||||
|
||||
/**************************
|
||||
* cl_amd_offline_devices *
|
||||
**************************/
|
||||
#define CL_CONTEXT_OFFLINE_DEVICES_AMD 0x403F
|
||||
|
||||
#ifdef CL_VERSION_1_1
|
||||
/***********************************
|
||||
* cl_ext_device_fission extension *
|
||||
***********************************/
|
||||
#define cl_ext_device_fission 1
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clReleaseDeviceEXT( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL *clReleaseDeviceEXT_fn)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clRetainDeviceEXT( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL *clRetainDeviceEXT_fn)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_ulong cl_device_partition_property_ext;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clCreateSubDevicesEXT( cl_device_id /*in_device*/,
|
||||
const cl_device_partition_property_ext * /* properties */,
|
||||
cl_uint /*num_entries*/,
|
||||
cl_device_id * /*out_devices*/,
|
||||
cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
( CL_API_CALL * clCreateSubDevicesEXT_fn)( cl_device_id /*in_device*/,
|
||||
const cl_device_partition_property_ext * /* properties */,
|
||||
cl_uint /*num_entries*/,
|
||||
cl_device_id * /*out_devices*/,
|
||||
cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
/* cl_device_partition_property_ext */
|
||||
#define CL_DEVICE_PARTITION_EQUALLY_EXT 0x4050
|
||||
#define CL_DEVICE_PARTITION_BY_COUNTS_EXT 0x4051
|
||||
#define CL_DEVICE_PARTITION_BY_NAMES_EXT 0x4052
|
||||
#define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT 0x4053
|
||||
|
||||
/* clDeviceGetInfo selectors */
|
||||
#define CL_DEVICE_PARENT_DEVICE_EXT 0x4054
|
||||
#define CL_DEVICE_PARTITION_TYPES_EXT 0x4055
|
||||
#define CL_DEVICE_AFFINITY_DOMAINS_EXT 0x4056
|
||||
#define CL_DEVICE_REFERENCE_COUNT_EXT 0x4057
|
||||
#define CL_DEVICE_PARTITION_STYLE_EXT 0x4058
|
||||
|
||||
/* clGetImageInfo enum */
|
||||
#define CL_IMAGE_BYTE_PITCH_AMD 0x4059
|
||||
|
||||
/* error codes */
|
||||
#define CL_DEVICE_PARTITION_FAILED_EXT -1057
|
||||
#define CL_INVALID_PARTITION_COUNT_EXT -1058
|
||||
#define CL_INVALID_PARTITION_NAME_EXT -1059
|
||||
|
||||
/* CL_AFFINITY_DOMAINs */
|
||||
#define CL_AFFINITY_DOMAIN_L1_CACHE_EXT 0x1
|
||||
#define CL_AFFINITY_DOMAIN_L2_CACHE_EXT 0x2
|
||||
#define CL_AFFINITY_DOMAIN_L3_CACHE_EXT 0x3
|
||||
#define CL_AFFINITY_DOMAIN_L4_CACHE_EXT 0x4
|
||||
#define CL_AFFINITY_DOMAIN_NUMA_EXT 0x10
|
||||
#define CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT 0x100
|
||||
/* cl_device_partition_property_ext list terminators */
|
||||
#define CL_PROPERTIES_LIST_END_EXT ((cl_device_partition_property_ext) 0)
|
||||
#define CL_PARTITION_BY_COUNTS_LIST_END_EXT ((cl_device_partition_property_ext) 0)
|
||||
#define CL_PARTITION_BY_NAMES_LIST_END_EXT ((cl_device_partition_property_ext) 0 - 1)
|
||||
|
||||
/*********************************
|
||||
* cl_qcom_ext_host_ptr extension
|
||||
*********************************/
|
||||
|
||||
#define CL_MEM_EXT_HOST_PTR_QCOM (1 << 29)
|
||||
|
||||
#define CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM 0x40A0
|
||||
#define CL_DEVICE_PAGE_SIZE_QCOM 0x40A1
|
||||
#define CL_IMAGE_ROW_ALIGNMENT_QCOM 0x40A2
|
||||
#define CL_IMAGE_SLICE_ALIGNMENT_QCOM 0x40A3
|
||||
#define CL_MEM_HOST_UNCACHED_QCOM 0x40A4
|
||||
#define CL_MEM_HOST_WRITEBACK_QCOM 0x40A5
|
||||
#define CL_MEM_HOST_WRITETHROUGH_QCOM 0x40A6
|
||||
#define CL_MEM_HOST_WRITE_COMBINING_QCOM 0x40A7
|
||||
|
||||
typedef cl_uint cl_image_pitch_info_qcom;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetDeviceImageInfoQCOM(cl_device_id device,
|
||||
size_t image_width,
|
||||
size_t image_height,
|
||||
const cl_image_format *image_format,
|
||||
cl_image_pitch_info_qcom param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret);
|
||||
|
||||
typedef struct _cl_mem_ext_host_ptr
|
||||
{
|
||||
// Type of external memory allocation.
|
||||
// Legal values will be defined in layered extensions.
|
||||
cl_uint allocation_type;
|
||||
|
||||
// Host cache policy for this external memory allocation.
|
||||
cl_uint host_cache_policy;
|
||||
|
||||
} cl_mem_ext_host_ptr;
|
||||
|
||||
/*********************************
|
||||
* cl_qcom_ion_host_ptr extension
|
||||
*********************************/
|
||||
|
||||
#define CL_MEM_ION_HOST_PTR_QCOM 0x40A8
|
||||
|
||||
typedef struct _cl_mem_ion_host_ptr
|
||||
{
|
||||
// Type of external memory allocation.
|
||||
// Must be CL_MEM_ION_HOST_PTR_QCOM for ION allocations.
|
||||
cl_mem_ext_host_ptr ext_host_ptr;
|
||||
|
||||
// ION file descriptor
|
||||
int ion_filedesc;
|
||||
|
||||
// Host pointer to the ION allocated memory
|
||||
void* ion_hostptr;
|
||||
|
||||
} cl_mem_ion_host_ptr;
|
||||
|
||||
// <amd_internal>
|
||||
/*************************
|
||||
* cl_amd_object_metadata *
|
||||
**************************/
|
||||
#define cl_amd_object_metadata 1
|
||||
|
||||
typedef size_t cl_key_amd;
|
||||
|
||||
#define CL_INVALID_OBJECT_AMD 0x403A
|
||||
#define CL_INVALID_KEY_AMD 0x403B
|
||||
#define CL_PLATFORM_MAX_KEYS_AMD 0x403C
|
||||
|
||||
typedef CL_API_ENTRY cl_key_amd (CL_API_CALL * clCreateKeyAMD_fn)(
|
||||
cl_platform_id /* platform */,
|
||||
void (CL_CALLBACK * /* destructor */)( void* /* old_value */),
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL * clObjectGetValueForKeyAMD_fn)(
|
||||
void * /* object */,
|
||||
cl_key_amd /* key */,
|
||||
void ** /* ret_val */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL * clObjectSetValueForKeyAMD_fn)(
|
||||
void * /* object */,
|
||||
cl_key_amd /* key */,
|
||||
void * /* value */) CL_API_SUFFIX__VERSION_1_1;
|
||||
// </amd_internal>
|
||||
#endif /* CL_VERSION_1_1 */
|
||||
|
||||
#ifdef CL_VERSION_1_2
|
||||
/********************************
|
||||
* cl_amd_bus_addressable_memory *
|
||||
********************************/
|
||||
|
||||
/* cl_mem flag - bitfield */
|
||||
#define CL_MEM_BUS_ADDRESSABLE_AMD (1<<30)
|
||||
#define CL_MEM_EXTERNAL_PHYSICAL_AMD (1<<31)
|
||||
|
||||
#define CL_COMMAND_WAIT_SIGNAL_AMD 0x4080
|
||||
#define CL_COMMAND_WRITE_SIGNAL_AMD 0x4081
|
||||
#define CL_COMMAND_MAKE_BUFFERS_RESIDENT_AMD 0x4082
|
||||
|
||||
typedef struct _cl_bus_address_amd
|
||||
{
|
||||
cl_ulong surface_bus_address;
|
||||
cl_ulong marker_bus_address;
|
||||
} cl_bus_address_amd;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL * clEnqueueWaitSignalAMD_fn)( 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;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL * clEnqueueWriteSignalAMD_fn)( 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;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL * clEnqueueMakeBuffersResidentAMD_fn)( 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;
|
||||
|
||||
#endif /* CL_VERSION_1_2 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __CL_EXT_H */
|
||||
@@ -0,0 +1,162 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008 - 2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
#ifndef __OPENCL_CL_GL_H
|
||||
#define __OPENCL_CL_GL_H
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenCL/cl.h>
|
||||
#else
|
||||
#include <CL/cl.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef cl_uint cl_gl_object_type;
|
||||
typedef cl_uint cl_gl_texture_info;
|
||||
typedef cl_uint cl_gl_platform_info;
|
||||
typedef struct __GLsync *cl_GLsync;
|
||||
|
||||
/* cl_gl_object_type = 0x2000 - 0x200F enum values are currently taken */
|
||||
#define CL_GL_OBJECT_BUFFER 0x2000
|
||||
#define CL_GL_OBJECT_TEXTURE2D 0x2001
|
||||
#define CL_GL_OBJECT_TEXTURE3D 0x2002
|
||||
#define CL_GL_OBJECT_RENDERBUFFER 0x2003
|
||||
#define CL_GL_OBJECT_TEXTURE2D_ARRAY 0x200E
|
||||
#define CL_GL_OBJECT_TEXTURE1D 0x200F
|
||||
#define CL_GL_OBJECT_TEXTURE1D_ARRAY 0x2010
|
||||
#define CL_GL_OBJECT_TEXTURE_BUFFER 0x2011
|
||||
|
||||
/* cl_gl_texture_info */
|
||||
#define CL_GL_TEXTURE_TARGET 0x2004
|
||||
#define CL_GL_MIPMAP_LEVEL 0x2005
|
||||
#define CL_GL_NUM_SAMPLES 0x2012
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromGLBuffer(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLuint /* bufobj */,
|
||||
int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromGLTexture(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromGLRenderbuffer(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLuint /* renderbuffer */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetGLObjectInfo(cl_mem /* memobj */,
|
||||
cl_gl_object_type * /* gl_object_type */,
|
||||
cl_GLuint * /* gl_object_name */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetGLTextureInfo(cl_mem /* memobj */,
|
||||
cl_gl_texture_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
|
||||
clEnqueueAcquireGLObjects(cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
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
|
||||
clEnqueueReleaseGLObjects(cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
|
||||
// Deprecated OpenCL 1.1 APIs
|
||||
extern CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL
|
||||
clCreateFromGLTexture2D(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
|
||||
|
||||
extern CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL
|
||||
clCreateFromGLTexture3D(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
|
||||
|
||||
/* cl_khr_gl_sharing extension */
|
||||
|
||||
#define cl_khr_gl_sharing 1
|
||||
|
||||
typedef cl_uint cl_gl_context_info;
|
||||
|
||||
/* Additional Error Codes */
|
||||
#define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -1000
|
||||
|
||||
/* cl_gl_context_info */
|
||||
#define CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR 0x2006
|
||||
#define CL_DEVICES_FOR_GL_CONTEXT_KHR 0x2007
|
||||
|
||||
/* Additional cl_context_properties */
|
||||
#define CL_GL_CONTEXT_KHR 0x2008
|
||||
#define CL_EGL_DISPLAY_KHR 0x2009
|
||||
#define CL_GLX_DISPLAY_KHR 0x200A
|
||||
#define CL_WGL_HDC_KHR 0x200B
|
||||
#define CL_CGL_SHAREGROUP_KHR 0x200C
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetGLContextInfoKHR(const cl_context_properties * /* properties */,
|
||||
cl_gl_context_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoKHR_fn)(
|
||||
const cl_context_properties * properties,
|
||||
cl_gl_context_info param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_CL_GL_H */
|
||||
@@ -0,0 +1,69 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008-2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
/* $Revision: 14826 $ on $Date: 2011-05-26 07:40:43 -0700 (Thu, 26 May 2011) $ */
|
||||
|
||||
/* cl_gl_ext.h contains vendor (non-KHR) OpenCL extensions which have */
|
||||
/* OpenGL dependencies. */
|
||||
|
||||
#ifndef __OPENCL_CL_GL_EXT_H
|
||||
#define __OPENCL_CL_GL_EXT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenCL/cl_gl.h>
|
||||
#else
|
||||
#include <CL/cl_gl.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* For each extension, follow this template
|
||||
* cl_VEN_extname extension */
|
||||
/* #define cl_VEN_extname 1
|
||||
* ... define new types, if any
|
||||
* ... define new tokens, if any
|
||||
* ... define new APIs, if any
|
||||
*
|
||||
* If you need GLtypes here, mirror them with a cl_GLtype, rather than including a GL header
|
||||
* This allows us to avoid having to decide whether to include GL headers or GLES here.
|
||||
*/
|
||||
|
||||
/*
|
||||
* cl_khr_gl_event extension
|
||||
* See section 9.9 in the OpenCL 1.1 spec for more information
|
||||
*/
|
||||
#define CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR 0x200D
|
||||
|
||||
extern CL_API_ENTRY cl_event CL_API_CALL
|
||||
clCreateEventFromGLsyncKHR(cl_context /* context */,
|
||||
cl_GLsync /* cl_GLsync */,
|
||||
cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_CL_GL_EXT_H */
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,54 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2008-2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
******************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
#ifndef __OPENCL_H
|
||||
#define __OPENCL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
||||
#include <OpenCL/cl.h>
|
||||
#include <OpenCL/cl_gl.h>
|
||||
#include <OpenCL/cl_gl_ext.h>
|
||||
#include <OpenCL/cl_ext.h>
|
||||
|
||||
#else
|
||||
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_gl.h>
|
||||
#include <CL/cl_gl_ext.h>
|
||||
#include <CL/cl_ext.h>
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_H */
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) 2012 The Khronos Group Inc. All rights reserved.
|
||||
*
|
||||
* NOTICE TO KHRONOS MEMBER:
|
||||
*
|
||||
* AMD has assigned the copyright for this object code to Khronos.
|
||||
* This object code is subject to Khronos ownership rights under U.S. and
|
||||
* international Copyright laws.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any Khronos Member
|
||||
* obtaining a copy of this software and/or associated documentation files
|
||||
* (the "Materials"), to use, copy, modify and merge the Materials in object
|
||||
* form only and to publish, distribute and/or sell copies of the Materials
|
||||
* solely in object code form as part of conformant OpenCL API implementations,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* Khronos Members shall ensure that their respective ICD implementation,
|
||||
* that is installed over another Khronos Members' ICD implementation, will
|
||||
* continue to support all OpenCL devices (hardware and software) supported
|
||||
* by the replaced ICD implementation. For the purposes of this notice, "ICD"
|
||||
* shall mean a library that presents an implementation of the OpenCL API for
|
||||
* the purpose routing API calls to different vendor implementation.
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Materials.
|
||||
*
|
||||
* KHRONOS AND AMD MAKE NO REPRESENTATION ABOUT THE SUITABILITY OF THIS
|
||||
* SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
|
||||
* IMPLIED WARRANTY OF ANY KIND. KHRONOS AND AMD DISCLAIM ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* IN NO EVENT SHALL KHRONOS OR AMD BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
||||
* THE USE OR PERFORMANCE OF THIS SOURCE CODE.
|
||||
*
|
||||
* U.S. Government End Users. This source code is a "commercial item" as
|
||||
* that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of
|
||||
* "commercial computer software" and "commercial computer software
|
||||
* documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995)
|
||||
* and is provided to the U.S. Government only as a commercial end item.
|
||||
* Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
|
||||
* 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
|
||||
* source code with only those rights set forth herein.
|
||||
*/
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
#ifndef __SPIR_H
|
||||
#define __SPIR_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
// CLS is for CL SPIR.
|
||||
typedef enum {
|
||||
CLS_PRIVATE_AS = 0,
|
||||
CLS_GLOBAL_AS = 1,
|
||||
CLS_CONSTANT_AS = 2,
|
||||
CLS_LOCAL_AS = 3,
|
||||
CLS_GLOBAL_HOST_AS = 4,
|
||||
CLS_CONSTANT_HOST_AS = 5,
|
||||
CLS_REGION_AS_AMD = 16,
|
||||
} CLS_ADDRESS_SPACES;
|
||||
|
||||
// Table 13
|
||||
typedef enum {
|
||||
CLS_ADDRESS_MIRRORED_REPEAT = 0,
|
||||
CLS_ADDRESS_REPEAT = 1,
|
||||
CLS_ADDRESS_CLAMP_TO_EDGE = 2,
|
||||
CLS_ADDRESS_CLAMP = 3,
|
||||
CLS_ADDRESS_NONE = 4
|
||||
} CLS_ADDRESSING_MODES;
|
||||
|
||||
// Table 13
|
||||
typedef enum {
|
||||
CLS_FILTER_NEAREST = 0,
|
||||
CLS_FILTER_LINEAR = 1
|
||||
} CLS_FILTER_MODE;
|
||||
|
||||
// Table 13
|
||||
typedef enum {
|
||||
CLS_NORMALIZED_COORDS_TRUE = 0,
|
||||
CLS_NORMALIZED_COORDS_FALSE = 1
|
||||
} CLS_NORMALIZED_COORDS;
|
||||
|
||||
// Section 2.3
|
||||
typedef enum {
|
||||
CLS_READ_ONLY = 0,
|
||||
CLS_WRITE_ONLY = 1,
|
||||
CLS_READ_WRITE = 2,
|
||||
CLS_NONE = 3
|
||||
} CLS_ACCESS_QUALIFIERS;
|
||||
|
||||
// Table 14
|
||||
typedef enum {
|
||||
CLS_ARG_CONST = 1,
|
||||
CLS_ARG_RESTRICT = 2,
|
||||
CLS_ARG_VOLATILE = 4,
|
||||
CLS_ARG_NONE = 0,
|
||||
CLS_ARG_MASK = 0xf,
|
||||
CLS_ARG_PIPE = 8
|
||||
} CLS_ARGTYPE_QUALIFIERS;
|
||||
|
||||
static const char* SPIR_TRIPLE_32BIT = "spir-unknown-unknown";
|
||||
static const char* SPIR_TRIPLE_64BIT = "spir64-unknown-unknown";
|
||||
static const char* SPIR_DATA_LAYOUT_32BIT = "p:32:32:32-i1:8:8-i8:8:8"
|
||||
"-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16"
|
||||
"-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
|
||||
"-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024";
|
||||
static const char* SPIR_DATA_LAYOUT_64BIT = "p:64:64:64-i1:8:8-i8:8:8"
|
||||
"-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16"
|
||||
"-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
|
||||
"-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024";
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // __SPIR_H
|
||||
File diff soppresso perché troppo grande
Carica Diff
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,126 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008-2013 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
#ifndef __OPENCL_CL_D3D10_H
|
||||
#define __OPENCL_CL_D3D10_H
|
||||
|
||||
#include <d3d10.h>
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* cl_khr_d3d10_sharing */
|
||||
#define cl_khr_d3d10_sharing 1
|
||||
|
||||
typedef cl_uint cl_d3d10_device_source_khr;
|
||||
typedef cl_uint cl_d3d10_device_set_khr;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* Error Codes */
|
||||
#define CL_INVALID_D3D10_DEVICE_KHR -1002
|
||||
#define CL_INVALID_D3D10_RESOURCE_KHR -1003
|
||||
#define CL_D3D10_RESOURCE_ALREADY_ACQUIRED_KHR -1004
|
||||
#define CL_D3D10_RESOURCE_NOT_ACQUIRED_KHR -1005
|
||||
|
||||
/* cl_d3d10_device_source_nv */
|
||||
#define CL_D3D10_DEVICE_KHR 0x4010
|
||||
#define CL_D3D10_DXGI_ADAPTER_KHR 0x4011
|
||||
|
||||
/* cl_d3d10_device_set_nv */
|
||||
#define CL_PREFERRED_DEVICES_FOR_D3D10_KHR 0x4012
|
||||
#define CL_ALL_DEVICES_FOR_D3D10_KHR 0x4013
|
||||
|
||||
/* cl_context_info */
|
||||
#define CL_CONTEXT_D3D10_DEVICE_KHR 0x4014
|
||||
#define CL_CONTEXT_D3D10_PREFER_SHARED_RESOURCES_KHR 0x402C
|
||||
|
||||
/* cl_mem_info */
|
||||
#define CL_MEM_D3D10_RESOURCE_KHR 0x4015
|
||||
|
||||
/* cl_image_info */
|
||||
#define CL_IMAGE_D3D10_SUBRESOURCE_KHR 0x4016
|
||||
|
||||
/* cl_command_type */
|
||||
#define CL_COMMAND_ACQUIRE_D3D10_OBJECTS_KHR 0x4017
|
||||
#define CL_COMMAND_RELEASE_D3D10_OBJECTS_KHR 0x4018
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromD3D10KHR_fn)(
|
||||
cl_platform_id platform,
|
||||
cl_d3d10_device_source_khr d3d_device_source,
|
||||
void * d3d_object,
|
||||
cl_d3d10_device_set_khr d3d_device_set,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * devices,
|
||||
cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10BufferKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Buffer * resource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10Texture2DKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Texture2D * resource,
|
||||
UINT subresource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D10Texture3DKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D10Texture3D * resource,
|
||||
UINT subresource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireD3D10ObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D10ObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_CL_D3D10_H */
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008-2013 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
#ifndef __OPENCL_CL_D3D11_H
|
||||
#define __OPENCL_CL_D3D11_H
|
||||
|
||||
#include <d3d11.h>
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* cl_khr_d3d11_sharing */
|
||||
#define cl_khr_d3d11_sharing 1
|
||||
|
||||
typedef cl_uint cl_d3d11_device_source_khr;
|
||||
typedef cl_uint cl_d3d11_device_set_khr;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* Error Codes */
|
||||
#define CL_INVALID_D3D11_DEVICE_KHR -1006
|
||||
#define CL_INVALID_D3D11_RESOURCE_KHR -1007
|
||||
#define CL_D3D11_RESOURCE_ALREADY_ACQUIRED_KHR -1008
|
||||
#define CL_D3D11_RESOURCE_NOT_ACQUIRED_KHR -1009
|
||||
|
||||
/* cl_d3d11_device_source */
|
||||
#define CL_D3D11_DEVICE_KHR 0x4019
|
||||
#define CL_D3D11_DXGI_ADAPTER_KHR 0x401A
|
||||
|
||||
/* cl_d3d11_device_set */
|
||||
#define CL_PREFERRED_DEVICES_FOR_D3D11_KHR 0x401B
|
||||
#define CL_ALL_DEVICES_FOR_D3D11_KHR 0x401C
|
||||
|
||||
/* cl_context_info */
|
||||
#define CL_CONTEXT_D3D11_DEVICE_KHR 0x401D
|
||||
#define CL_CONTEXT_D3D11_PREFER_SHARED_RESOURCES_KHR 0x402D
|
||||
|
||||
/* cl_mem_info */
|
||||
#define CL_MEM_D3D11_RESOURCE_KHR 0x401E
|
||||
|
||||
/* cl_image_info */
|
||||
#define CL_IMAGE_D3D11_SUBRESOURCE_KHR 0x401F
|
||||
|
||||
/* cl_command_type */
|
||||
#define CL_COMMAND_ACQUIRE_D3D11_OBJECTS_KHR 0x4020
|
||||
#define CL_COMMAND_RELEASE_D3D11_OBJECTS_KHR 0x4021
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromD3D11KHR_fn)(
|
||||
cl_platform_id platform,
|
||||
cl_d3d11_device_source_khr d3d_device_source,
|
||||
void * d3d_object,
|
||||
cl_d3d11_device_set_khr d3d_device_set,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * devices,
|
||||
cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11BufferKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Buffer * resource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11Texture2DKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Texture2D * resource,
|
||||
UINT subresource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromD3D11Texture3DKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
ID3D11Texture3D * resource,
|
||||
UINT subresource,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireD3D11ObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseD3D11ObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_CL_D3D11_H */
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008-2013 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
#ifndef __OPENCL_CL_DX9_MEDIA_SHARING_H
|
||||
#define __OPENCL_CL_DX9_MEDIA_SHARING_H
|
||||
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
/* cl_khr_dx9_media_sharing */
|
||||
#define cl_khr_dx9_media_sharing 1
|
||||
|
||||
typedef cl_uint cl_dx9_media_adapter_type_khr;
|
||||
typedef cl_uint cl_dx9_media_adapter_set_khr;
|
||||
|
||||
#if defined(_WIN32)
|
||||
#include <d3d9.h>
|
||||
typedef struct _cl_dx9_surface_info_khr
|
||||
{
|
||||
IDirect3DSurface9 *resource;
|
||||
HANDLE shared_handle;
|
||||
} cl_dx9_surface_info_khr;
|
||||
#endif
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* Error Codes */
|
||||
#define CL_INVALID_DX9_MEDIA_ADAPTER_KHR -1010
|
||||
#define CL_INVALID_DX9_MEDIA_SURFACE_KHR -1011
|
||||
#define CL_DX9_MEDIA_SURFACE_ALREADY_ACQUIRED_KHR -1012
|
||||
#define CL_DX9_MEDIA_SURFACE_NOT_ACQUIRED_KHR -1013
|
||||
|
||||
/* cl_media_adapter_type_khr */
|
||||
#define CL_ADAPTER_D3D9_KHR 0x2020
|
||||
#define CL_ADAPTER_D3D9EX_KHR 0x2021
|
||||
#define CL_ADAPTER_DXVA_KHR 0x2022
|
||||
|
||||
/* cl_media_adapter_set_khr */
|
||||
#define CL_PREFERRED_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR 0x2023
|
||||
#define CL_ALL_DEVICES_FOR_DX9_MEDIA_ADAPTER_KHR 0x2024
|
||||
|
||||
/* cl_context_info */
|
||||
#define CL_CONTEXT_ADAPTER_D3D9_KHR 0x2025
|
||||
#define CL_CONTEXT_ADAPTER_D3D9EX_KHR 0x2026
|
||||
#define CL_CONTEXT_ADAPTER_DXVA_KHR 0x2027
|
||||
|
||||
/* cl_mem_info */
|
||||
#define CL_MEM_DX9_MEDIA_ADAPTER_TYPE_KHR 0x2028
|
||||
#define CL_MEM_DX9_MEDIA_SURFACE_INFO_KHR 0x2029
|
||||
|
||||
/* cl_image_info */
|
||||
#define CL_IMAGE_DX9_MEDIA_PLANE_KHR 0x202A
|
||||
|
||||
/* cl_command_type */
|
||||
#define CL_COMMAND_ACQUIRE_DX9_MEDIA_SURFACES_KHR 0x202B
|
||||
#define CL_COMMAND_RELEASE_DX9_MEDIA_SURFACES_KHR 0x202C
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetDeviceIDsFromDX9MediaAdapterKHR_fn)(
|
||||
cl_platform_id platform,
|
||||
cl_uint num_media_adapters,
|
||||
cl_dx9_media_adapter_type_khr * media_adapter_type,
|
||||
void * media_adapters,
|
||||
cl_dx9_media_adapter_set_khr media_adapter_set,
|
||||
cl_uint num_entries,
|
||||
cl_device_id * devices,
|
||||
cl_uint * num_devices) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromDX9MediaSurfaceKHR_fn)(
|
||||
cl_context context,
|
||||
cl_mem_flags flags,
|
||||
cl_dx9_media_adapter_type_khr adapter_type,
|
||||
void * surface_info,
|
||||
cl_uint plane,
|
||||
cl_int * errcode_ret) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireDX9MediaSurfacesKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseDX9MediaSurfacesKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_CL_DX9_MEDIA_SHARING_H */
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2008-2010 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __OPENCL_CL_EGL_H
|
||||
#define __OPENCL_CL_EGL_H
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
||||
#else
|
||||
#include <CL/cl.h>
|
||||
#include <EGL/egl.h>
|
||||
#include <EGL/eglext.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Command type for events created with clEnqueueAcquireEGLObjectsKHR */
|
||||
#define CL_COMMAND_EGL_FENCE_SYNC_OBJECT_KHR 0x202F
|
||||
#define CL_COMMAND_ACQUIRE_EGL_OBJECTS_KHR 0x202D
|
||||
#define CL_COMMAND_RELEASE_EGL_OBJECTS_KHR 0x202E
|
||||
|
||||
/* Error type for clCreateFromEGLImageKHR */
|
||||
#define CL_INVALID_EGL_OBJECT_KHR -1093
|
||||
#define CL_EGL_RESOURCE_NOT_ACQUIRED_KHR -1092
|
||||
|
||||
/* CLeglImageKHR is an opaque handle to an EGLImage */
|
||||
typedef void* CLeglImageKHR;
|
||||
|
||||
/* CLeglDisplayKHR is an opaque handle to an EGLDisplay */
|
||||
typedef void* CLeglDisplayKHR;
|
||||
|
||||
/* CLeglSyncKHR is an opaque handle to an EGLSync object */
|
||||
typedef void* CLeglSyncKHR;
|
||||
|
||||
/* properties passed to clCreateFromEGLImageKHR */
|
||||
typedef intptr_t cl_egl_image_properties_khr;
|
||||
|
||||
|
||||
#define cl_khr_egl_image 1
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromEGLImageKHR(cl_context /* context */,
|
||||
CLeglDisplayKHR /* egldisplay */,
|
||||
CLeglImageKHR /* eglimage */,
|
||||
cl_mem_flags /* flags */,
|
||||
const cl_egl_image_properties_khr * /* properties */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateFromEGLImageKHR_fn)(
|
||||
cl_context context,
|
||||
CLeglDisplayKHR egldisplay,
|
||||
CLeglImageKHR eglimage,
|
||||
cl_mem_flags flags,
|
||||
const cl_egl_image_properties_khr * properties,
|
||||
cl_int * errcode_ret);
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueAcquireEGLObjectsKHR(cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueAcquireEGLObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event);
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clEnqueueReleaseEGLObjectsKHR(cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clEnqueueReleaseEGLObjectsKHR_fn)(
|
||||
cl_command_queue command_queue,
|
||||
cl_uint num_objects,
|
||||
const cl_mem * mem_objects,
|
||||
cl_uint num_events_in_wait_list,
|
||||
const cl_event * event_wait_list,
|
||||
cl_event * event);
|
||||
|
||||
|
||||
#define cl_khr_egl_event 1
|
||||
|
||||
extern CL_API_ENTRY cl_event CL_API_CALL
|
||||
clCreateEventFromEGLSyncKHR(cl_context /* context */,
|
||||
CLeglSyncKHR /* sync */,
|
||||
CLeglDisplayKHR /* display */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_event (CL_API_CALL *clCreateEventFromEGLSyncKHR_fn)(
|
||||
cl_context context,
|
||||
CLeglSyncKHR sync,
|
||||
CLeglDisplayKHR display,
|
||||
cl_int * errcode_ret);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_CL_EGL_H */
|
||||
@@ -0,0 +1,492 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2008-2013 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
******************************************************************************/
|
||||
|
||||
/* $Revision: 14835 $ on $Date: 2011-05-26 11:32:00 -0700 (Thu, 26 May 2011) $ */
|
||||
|
||||
/* cl_ext.h contains OpenCL extensions which don't have external */
|
||||
/* (OpenGL, D3D) dependencies. */
|
||||
|
||||
#ifndef __CL_EXT_H
|
||||
#define __CL_EXT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenCL/cl.h>
|
||||
#include <AvailabilityMacros.h>
|
||||
#else
|
||||
#include <CL/cl.h>
|
||||
#endif
|
||||
|
||||
/* cl_khr_fp16 extension - no extension #define since it has no functions */
|
||||
#define CL_DEVICE_HALF_FP_CONFIG 0x1033
|
||||
|
||||
/* Memory object destruction
|
||||
*
|
||||
* Apple extension for use to manage externally allocated buffers used with cl_mem objects with CL_MEM_USE_HOST_PTR
|
||||
*
|
||||
* Registers a user callback function that will be called when the memory object is deleted and its resources
|
||||
* freed. Each call to clSetMemObjectCallbackFn registers the specified user callback function on a callback
|
||||
* stack associated with memobj. The registered user callback functions are called in the reverse order in
|
||||
* which they were registered. The user callback functions are called and then the memory object is deleted
|
||||
* and its resources freed. This provides a mechanism for the application (and libraries) using memobj to be
|
||||
* notified when the memory referenced by host_ptr, specified when the memory object is created and used as
|
||||
* the storage bits for the memory object, can be reused or freed.
|
||||
*
|
||||
* The application may not call CL api's with the cl_mem object passed to the pfn_notify.
|
||||
*
|
||||
* Please check for the "cl_APPLE_SetMemObjectDestructor" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS)
|
||||
* before using.
|
||||
*/
|
||||
#define cl_APPLE_SetMemObjectDestructor 1
|
||||
cl_int CL_API_ENTRY clSetMemObjectDestructorAPPLE( cl_mem /* memobj */,
|
||||
void (* /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/),
|
||||
void * /*user_data */ ) CL_EXT_SUFFIX__VERSION_1_0;
|
||||
|
||||
|
||||
/* Context Logging Functions
|
||||
*
|
||||
* The next three convenience functions are intended to be used as the pfn_notify parameter to clCreateContext().
|
||||
* Please check for the "cl_APPLE_ContextLoggingFunctions" extension using clGetDeviceInfo(CL_DEVICE_EXTENSIONS)
|
||||
* before using.
|
||||
*
|
||||
* clLogMessagesToSystemLog fowards on all log messages to the Apple System Logger
|
||||
*/
|
||||
#define cl_APPLE_ContextLoggingFunctions 1
|
||||
extern void CL_API_ENTRY clLogMessagesToSystemLogAPPLE( const char * /* errstr */,
|
||||
const void * /* private_info */,
|
||||
size_t /* cb */,
|
||||
void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* clLogMessagesToStdout sends all log messages to the file descriptor stdout */
|
||||
extern void CL_API_ENTRY clLogMessagesToStdoutAPPLE( const char * /* errstr */,
|
||||
const void * /* private_info */,
|
||||
size_t /* cb */,
|
||||
void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0;
|
||||
|
||||
/* clLogMessagesToStderr sends all log messages to the file descriptor stderr */
|
||||
extern void CL_API_ENTRY clLogMessagesToStderrAPPLE( const char * /* errstr */,
|
||||
const void * /* private_info */,
|
||||
size_t /* cb */,
|
||||
void * /* user_data */ ) CL_EXT_SUFFIX__VERSION_1_0;
|
||||
|
||||
|
||||
/************************
|
||||
* cl_khr_icd extension *
|
||||
************************/
|
||||
#define cl_khr_icd 1
|
||||
|
||||
/* cl_platform_info */
|
||||
#define CL_PLATFORM_ICD_SUFFIX_KHR 0x0920
|
||||
|
||||
/* Additional Error Codes */
|
||||
#define CL_PLATFORM_NOT_FOUND_KHR -1001
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clIcdGetPlatformIDsKHR(cl_uint /* num_entries */,
|
||||
cl_platform_id * /* platforms */,
|
||||
cl_uint * /* num_platforms */);
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clIcdGetPlatformIDsKHR_fn)(
|
||||
cl_uint /* num_entries */,
|
||||
cl_platform_id * /* platforms */,
|
||||
cl_uint * /* num_platforms */);
|
||||
|
||||
|
||||
/* Extension: cl_khr_image2D_buffer
|
||||
*
|
||||
* This extension allows a 2D image to be created from a cl_mem buffer without a copy.
|
||||
* The type associated with a 2D image created from a buffer in an OpenCL program is image2d_t.
|
||||
* Both the sampler and sampler-less read_image built-in functions are supported for 2D images
|
||||
* and 2D images created from a buffer. Similarly, the write_image built-ins are also supported
|
||||
* for 2D images created from a buffer.
|
||||
*
|
||||
* When the 2D image from buffer is created, the client must specify the width,
|
||||
* height, image format (i.e. channel order and channel data type) and optionally the row pitch
|
||||
*
|
||||
* The pitch specified must be a multiple of CL_DEVICE_IMAGE_PITCH_ALIGNMENT pixels.
|
||||
* The base address of the buffer must be aligned to CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT pixels.
|
||||
*/
|
||||
|
||||
/*************************************
|
||||
* cl_khr_initalize_memory extension *
|
||||
*************************************/
|
||||
|
||||
#define CL_CONTEXT_MEMORY_INITIALIZE_KHR 0x200E
|
||||
|
||||
|
||||
/**************************************
|
||||
* cl_khr_terminate_context extension *
|
||||
**************************************/
|
||||
|
||||
#define CL_DEVICE_TERMINATE_CAPABILITY_KHR 0x200F
|
||||
#define CL_CONTEXT_TERMINATE_KHR 0x2010
|
||||
|
||||
#define cl_khr_terminate_context 1
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL clTerminateContextKHR(cl_context /* context */) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clTerminateContextKHR_fn)(cl_context /* context */) CL_EXT_SUFFIX__VERSION_1_2;
|
||||
|
||||
// <amd_internal>
|
||||
/******************************
|
||||
* cl_khr_subgroups extension *
|
||||
******************************/
|
||||
|
||||
#define cl_khr_subgroups 1
|
||||
|
||||
typedef cl_uint cl_kernel_sub_group_info;
|
||||
|
||||
#define CL_KERNEL_MAX_SUB_GROUP_SIZE_FOR_NDRANGE 0x2011
|
||||
#define CL_KERNEL_SUB_GROUP_COUNT_FOR_NDRANGE 0x2012
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetKernelSubGroupInfoKHR(cl_kernel /* kernel */,
|
||||
cl_device_id /* device */,
|
||||
cl_kernel_sub_group_info /* param_name */,
|
||||
size_t /* input_value_size */,
|
||||
const void * /* input_value */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetKernelSubGroupInfoKHR_fn)(
|
||||
cl_kernel /* kernel */,
|
||||
cl_device_id /* device */,
|
||||
cl_kernel_sub_group_info /* param_name */,
|
||||
size_t /* input_value_size */,
|
||||
const void * /* input_value */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
// </amd_internal>
|
||||
|
||||
/*
|
||||
* Extension: cl_khr_spir
|
||||
*
|
||||
* This extension adds support to create an OpenCL program object from a
|
||||
* Standard Portable Intermediate Representation (SPIR) instance
|
||||
*/
|
||||
|
||||
#define CL_DEVICE_SPIR_VERSIONS 0x40E0
|
||||
#define CL_PROGRAM_BINARY_TYPE_INTERMEDIATE 0x40E1
|
||||
|
||||
|
||||
/******************************************
|
||||
* cl_nv_device_attribute_query extension *
|
||||
******************************************/
|
||||
/* cl_nv_device_attribute_query extension - no extension #define since it has no functions */
|
||||
#define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV 0x4000
|
||||
#define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV 0x4001
|
||||
#define CL_DEVICE_REGISTERS_PER_BLOCK_NV 0x4002
|
||||
#define CL_DEVICE_WARP_SIZE_NV 0x4003
|
||||
#define CL_DEVICE_GPU_OVERLAP_NV 0x4004
|
||||
#define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV 0x4005
|
||||
#define CL_DEVICE_INTEGRATED_MEMORY_NV 0x4006
|
||||
|
||||
/*********************************
|
||||
* cl_amd_device_memory_flags *
|
||||
*********************************/
|
||||
#define cl_amd_device_memory_flags 1
|
||||
#define CL_MEM_USE_PERSISTENT_MEM_AMD (1 << 6) // Alloc from GPU's CPU visible heap
|
||||
|
||||
/* cl_device_info */
|
||||
#define CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT 0x4032
|
||||
|
||||
/*********************************
|
||||
* cl_amd_device_attribute_query *
|
||||
*********************************/
|
||||
#define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD 0x4036
|
||||
#define CL_DEVICE_TOPOLOGY_AMD 0x4037
|
||||
#define CL_DEVICE_BOARD_NAME_AMD 0x4038
|
||||
#define CL_DEVICE_GLOBAL_FREE_MEMORY_AMD 0x4039
|
||||
#define CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD 0x4040
|
||||
#define CL_DEVICE_SIMD_WIDTH_AMD 0x4041
|
||||
#define CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD 0x4042
|
||||
#define CL_DEVICE_WAVEFRONT_WIDTH_AMD 0x4043
|
||||
#define CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD 0x4044
|
||||
#define CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD 0x4045
|
||||
#define CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD 0x4046
|
||||
#define CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD 0x4047
|
||||
#define CL_DEVICE_LOCAL_MEM_BANKS_AMD 0x4048
|
||||
#define CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD 0x4049
|
||||
#define CL_DEVICE_GFXIP_MAJOR_AMD 0x404A
|
||||
#define CL_DEVICE_GFXIP_MINOR_AMD 0x404B
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct { cl_uint type; cl_uint data[5]; } raw;
|
||||
struct { cl_uint type; cl_char unused[17]; cl_char bus; cl_char device; cl_char function; } pcie;
|
||||
} cl_device_topology_amd;
|
||||
|
||||
#define CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD 1
|
||||
|
||||
/*************
|
||||
* cl_amd_hsa *
|
||||
**************/
|
||||
#define CL_HSA_ENABLED_AMD (1ull << 62)
|
||||
#define CL_HSA_DISABLED_AMD (1ull << 63)
|
||||
|
||||
// <amd_internal>
|
||||
/***************************
|
||||
* cl_amd_command_intercept *
|
||||
***************************/
|
||||
#define CL_CONTEXT_COMMAND_INTERCEPT_CALLBACK_AMD 0x403D
|
||||
#define CL_QUEUE_COMMAND_INTERCEPT_ENABLE_AMD (1ull << 63)
|
||||
|
||||
typedef cl_int (CL_CALLBACK * intercept_callback_fn)(cl_event, cl_int *);
|
||||
|
||||
/**************************
|
||||
* cl_amd_command_queue_info *
|
||||
**************************/
|
||||
#define CL_QUEUE_THREAD_HANDLE_AMD 0x403E
|
||||
|
||||
/***************************************
|
||||
* cl-gl depth buffer interop extension *
|
||||
****************************************/
|
||||
|
||||
#define CL_DEPTH 0x10BD
|
||||
#define CL_DEPTH_STENCIL 0x10BE
|
||||
#define CL_UNORM_INT24 0x10DF
|
||||
#define CL_GL_NUM_SAMPLES 0x2012
|
||||
// </amd_internal>
|
||||
|
||||
/**************************
|
||||
* cl_amd_offline_devices *
|
||||
**************************/
|
||||
#define CL_CONTEXT_OFFLINE_DEVICES_AMD 0x403F
|
||||
|
||||
/*********************************
|
||||
* cl_arm_printf extension
|
||||
*********************************/
|
||||
#define CL_PRINTF_CALLBACK_ARM 0x40B0
|
||||
#define CL_PRINTF_BUFFERSIZE_ARM 0x40B1
|
||||
|
||||
#ifdef CL_VERSION_1_1
|
||||
/***********************************
|
||||
* cl_ext_device_fission extension *
|
||||
***********************************/
|
||||
#define cl_ext_device_fission 1
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clReleaseDeviceEXT( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL *clReleaseDeviceEXT_fn)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clRetainDeviceEXT( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL *clRetainDeviceEXT_fn)( cl_device_id /*device*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef cl_ulong cl_device_partition_property_ext;
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clCreateSubDevicesEXT( cl_device_id /*in_device*/,
|
||||
const cl_device_partition_property_ext * /* properties */,
|
||||
cl_uint /*num_entries*/,
|
||||
cl_device_id * /*out_devices*/,
|
||||
cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
( CL_API_CALL * clCreateSubDevicesEXT_fn)( cl_device_id /*in_device*/,
|
||||
const cl_device_partition_property_ext * /* properties */,
|
||||
cl_uint /*num_entries*/,
|
||||
cl_device_id * /*out_devices*/,
|
||||
cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
/* cl_device_partition_property_ext */
|
||||
#define CL_DEVICE_PARTITION_EQUALLY_EXT 0x4050
|
||||
#define CL_DEVICE_PARTITION_BY_COUNTS_EXT 0x4051
|
||||
#define CL_DEVICE_PARTITION_BY_NAMES_EXT 0x4052
|
||||
#define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT 0x4053
|
||||
|
||||
/* clDeviceGetInfo selectors */
|
||||
#define CL_DEVICE_PARENT_DEVICE_EXT 0x4054
|
||||
#define CL_DEVICE_PARTITION_TYPES_EXT 0x4055
|
||||
#define CL_DEVICE_AFFINITY_DOMAINS_EXT 0x4056
|
||||
#define CL_DEVICE_REFERENCE_COUNT_EXT 0x4057
|
||||
#define CL_DEVICE_PARTITION_STYLE_EXT 0x4058
|
||||
|
||||
/* clGetImageInfo enum */
|
||||
#define CL_IMAGE_BYTE_PITCH_AMD 0x4059
|
||||
|
||||
/* error codes */
|
||||
#define CL_DEVICE_PARTITION_FAILED_EXT -1057
|
||||
#define CL_INVALID_PARTITION_COUNT_EXT -1058
|
||||
#define CL_INVALID_PARTITION_NAME_EXT -1059
|
||||
|
||||
/* CL_AFFINITY_DOMAINs */
|
||||
#define CL_AFFINITY_DOMAIN_L1_CACHE_EXT 0x1
|
||||
#define CL_AFFINITY_DOMAIN_L2_CACHE_EXT 0x2
|
||||
#define CL_AFFINITY_DOMAIN_L3_CACHE_EXT 0x3
|
||||
#define CL_AFFINITY_DOMAIN_L4_CACHE_EXT 0x4
|
||||
#define CL_AFFINITY_DOMAIN_NUMA_EXT 0x10
|
||||
#define CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT 0x100
|
||||
/* cl_device_partition_property_ext list terminators */
|
||||
#define CL_PROPERTIES_LIST_END_EXT ((cl_device_partition_property_ext) 0)
|
||||
#define CL_PARTITION_BY_COUNTS_LIST_END_EXT ((cl_device_partition_property_ext) 0)
|
||||
#define CL_PARTITION_BY_NAMES_LIST_END_EXT ((cl_device_partition_property_ext) 0 - 1)
|
||||
|
||||
/*********************************
|
||||
* cl_qcom_ext_host_ptr extension
|
||||
*********************************/
|
||||
|
||||
#define CL_MEM_EXT_HOST_PTR_QCOM (1 << 29)
|
||||
|
||||
#define CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM 0x40A0
|
||||
#define CL_DEVICE_PAGE_SIZE_QCOM 0x40A1
|
||||
#define CL_IMAGE_ROW_ALIGNMENT_QCOM 0x40A2
|
||||
#define CL_IMAGE_SLICE_ALIGNMENT_QCOM 0x40A3
|
||||
#define CL_MEM_HOST_UNCACHED_QCOM 0x40A4
|
||||
#define CL_MEM_HOST_WRITEBACK_QCOM 0x40A5
|
||||
#define CL_MEM_HOST_WRITETHROUGH_QCOM 0x40A6
|
||||
#define CL_MEM_HOST_WRITE_COMBINING_QCOM 0x40A7
|
||||
|
||||
typedef cl_uint cl_image_pitch_info_qcom;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetDeviceImageInfoQCOM(cl_device_id device,
|
||||
size_t image_width,
|
||||
size_t image_height,
|
||||
const cl_image_format *image_format,
|
||||
cl_image_pitch_info_qcom param_name,
|
||||
size_t param_value_size,
|
||||
void *param_value,
|
||||
size_t *param_value_size_ret);
|
||||
|
||||
typedef struct _cl_mem_ext_host_ptr
|
||||
{
|
||||
/* Type of external memory allocation. */
|
||||
/* Legal values will be defined in layered extensions. */
|
||||
cl_uint allocation_type;
|
||||
|
||||
/* Host cache policy for this external memory allocation. */
|
||||
cl_uint host_cache_policy;
|
||||
|
||||
} cl_mem_ext_host_ptr;
|
||||
|
||||
/*********************************
|
||||
* cl_qcom_ion_host_ptr extension
|
||||
*********************************/
|
||||
|
||||
#define CL_MEM_ION_HOST_PTR_QCOM 0x40A8
|
||||
|
||||
typedef struct _cl_mem_ion_host_ptr
|
||||
{
|
||||
/* Type of external memory allocation. */
|
||||
/* Must be CL_MEM_ION_HOST_PTR_QCOM for ION allocations. */
|
||||
cl_mem_ext_host_ptr ext_host_ptr;
|
||||
|
||||
/* ION file descriptor */
|
||||
int ion_filedesc;
|
||||
|
||||
/* Host pointer to the ION allocated memory */
|
||||
void* ion_hostptr;
|
||||
|
||||
} cl_mem_ion_host_ptr;
|
||||
|
||||
// <amd_internal>
|
||||
/*************************
|
||||
* cl_amd_object_metadata *
|
||||
**************************/
|
||||
#define cl_amd_object_metadata 1
|
||||
|
||||
typedef size_t cl_key_amd;
|
||||
|
||||
#define CL_INVALID_OBJECT_AMD 0x403A
|
||||
#define CL_INVALID_KEY_AMD 0x403B
|
||||
#define CL_PLATFORM_MAX_KEYS_AMD 0x403C
|
||||
|
||||
typedef CL_API_ENTRY cl_key_amd (CL_API_CALL * clCreateKeyAMD_fn)(
|
||||
cl_platform_id /* platform */,
|
||||
void (CL_CALLBACK * /* destructor */)( void* /* old_value */),
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL * clObjectGetValueForKeyAMD_fn)(
|
||||
void * /* object */,
|
||||
cl_key_amd /* key */,
|
||||
void ** /* ret_val */) CL_API_SUFFIX__VERSION_1_1;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL * clObjectSetValueForKeyAMD_fn)(
|
||||
void * /* object */,
|
||||
cl_key_amd /* key */,
|
||||
void * /* value */) CL_API_SUFFIX__VERSION_1_1;
|
||||
// </amd_internal>
|
||||
#endif /* CL_VERSION_1_1 */
|
||||
|
||||
#ifdef CL_VERSION_1_2
|
||||
/********************************
|
||||
* cl_amd_bus_addressable_memory *
|
||||
********************************/
|
||||
|
||||
/* cl_mem flag - bitfield */
|
||||
#define CL_MEM_BUS_ADDRESSABLE_AMD (1<<30)
|
||||
#define CL_MEM_EXTERNAL_PHYSICAL_AMD (1<<31)
|
||||
|
||||
#define CL_COMMAND_WAIT_SIGNAL_AMD 0x4080
|
||||
#define CL_COMMAND_WRITE_SIGNAL_AMD 0x4081
|
||||
#define CL_COMMAND_MAKE_BUFFERS_RESIDENT_AMD 0x4082
|
||||
|
||||
typedef struct _cl_bus_address_amd
|
||||
{
|
||||
cl_ulong surface_bus_address;
|
||||
cl_ulong marker_bus_address;
|
||||
} cl_bus_address_amd;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL * clEnqueueWaitSignalAMD_fn)( 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;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL * clEnqueueWriteSignalAMD_fn)( 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;
|
||||
|
||||
typedef CL_API_ENTRY cl_int
|
||||
(CL_API_CALL * clEnqueueMakeBuffersResidentAMD_fn)( 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;
|
||||
#endif /* CL_VERSION_1_2 */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* __CL_EXT_H */
|
||||
@@ -0,0 +1,162 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008 - 2013 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
#ifndef __OPENCL_CL_GL_H
|
||||
#define __OPENCL_CL_GL_H
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenCL/cl.h>
|
||||
#else
|
||||
#include <CL/cl.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef cl_uint cl_gl_object_type;
|
||||
typedef cl_uint cl_gl_texture_info;
|
||||
typedef cl_uint cl_gl_platform_info;
|
||||
typedef struct __GLsync *cl_GLsync;
|
||||
|
||||
/* cl_gl_object_type = 0x2000 - 0x200F enum values are currently taken */
|
||||
#define CL_GL_OBJECT_BUFFER 0x2000
|
||||
#define CL_GL_OBJECT_TEXTURE2D 0x2001
|
||||
#define CL_GL_OBJECT_TEXTURE3D 0x2002
|
||||
#define CL_GL_OBJECT_RENDERBUFFER 0x2003
|
||||
#define CL_GL_OBJECT_TEXTURE2D_ARRAY 0x200E
|
||||
#define CL_GL_OBJECT_TEXTURE1D 0x200F
|
||||
#define CL_GL_OBJECT_TEXTURE1D_ARRAY 0x2010
|
||||
#define CL_GL_OBJECT_TEXTURE_BUFFER 0x2011
|
||||
|
||||
/* cl_gl_texture_info */
|
||||
#define CL_GL_TEXTURE_TARGET 0x2004
|
||||
#define CL_GL_MIPMAP_LEVEL 0x2005
|
||||
#define CL_GL_NUM_SAMPLES 0x2012
|
||||
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromGLBuffer(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLuint /* bufobj */,
|
||||
int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromGLTexture(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_2;
|
||||
|
||||
extern CL_API_ENTRY cl_mem CL_API_CALL
|
||||
clCreateFromGLRenderbuffer(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLuint /* renderbuffer */,
|
||||
cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetGLObjectInfo(cl_mem /* memobj */,
|
||||
cl_gl_object_type * /* gl_object_type */,
|
||||
cl_GLuint * /* gl_object_name */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetGLTextureInfo(cl_mem /* memobj */,
|
||||
cl_gl_texture_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
|
||||
clEnqueueAcquireGLObjects(cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
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
|
||||
clEnqueueReleaseGLObjects(cl_command_queue /* command_queue */,
|
||||
cl_uint /* num_objects */,
|
||||
const cl_mem * /* mem_objects */,
|
||||
cl_uint /* num_events_in_wait_list */,
|
||||
const cl_event * /* event_wait_list */,
|
||||
cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
|
||||
/* Deprecated OpenCL 1.1 APIs */
|
||||
extern CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL
|
||||
clCreateFromGLTexture2D(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
|
||||
|
||||
extern CL_API_ENTRY CL_EXT_PREFIX__VERSION_1_1_DEPRECATED cl_mem CL_API_CALL
|
||||
clCreateFromGLTexture3D(cl_context /* context */,
|
||||
cl_mem_flags /* flags */,
|
||||
cl_GLenum /* target */,
|
||||
cl_GLint /* miplevel */,
|
||||
cl_GLuint /* texture */,
|
||||
cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1_DEPRECATED;
|
||||
|
||||
/* cl_khr_gl_sharing extension */
|
||||
|
||||
#define cl_khr_gl_sharing 1
|
||||
|
||||
typedef cl_uint cl_gl_context_info;
|
||||
|
||||
/* Additional Error Codes */
|
||||
#define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -1000
|
||||
|
||||
/* cl_gl_context_info */
|
||||
#define CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR 0x2006
|
||||
#define CL_DEVICES_FOR_GL_CONTEXT_KHR 0x2007
|
||||
|
||||
/* Additional cl_context_properties */
|
||||
#define CL_GL_CONTEXT_KHR 0x2008
|
||||
#define CL_EGL_DISPLAY_KHR 0x2009
|
||||
#define CL_GLX_DISPLAY_KHR 0x200A
|
||||
#define CL_WGL_HDC_KHR 0x200B
|
||||
#define CL_CGL_SHAREGROUP_KHR 0x200C
|
||||
|
||||
extern CL_API_ENTRY cl_int CL_API_CALL
|
||||
clGetGLContextInfoKHR(const cl_context_properties * /* properties */,
|
||||
cl_gl_context_info /* param_name */,
|
||||
size_t /* param_value_size */,
|
||||
void * /* param_value */,
|
||||
size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetGLContextInfoKHR_fn)(
|
||||
const cl_context_properties * properties,
|
||||
cl_gl_context_info param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_CL_GL_H */
|
||||
@@ -0,0 +1,69 @@
|
||||
/**********************************************************************************
|
||||
* Copyright (c) 2008-2013 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
**********************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
/* cl_gl_ext.h contains vendor (non-KHR) OpenCL extensions which have */
|
||||
/* OpenGL dependencies. */
|
||||
|
||||
#ifndef __OPENCL_CL_GL_EXT_H
|
||||
#define __OPENCL_CL_GL_EXT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenCL/cl_gl.h>
|
||||
#else
|
||||
#include <CL/cl_gl.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* For each extension, follow this template
|
||||
* cl_VEN_extname extension */
|
||||
/* #define cl_VEN_extname 1
|
||||
* ... define new types, if any
|
||||
* ... define new tokens, if any
|
||||
* ... define new APIs, if any
|
||||
*
|
||||
* If you need GLtypes here, mirror them with a cl_GLtype, rather than including a GL header
|
||||
* This allows us to avoid having to decide whether to include GL headers or GLES here.
|
||||
*/
|
||||
|
||||
/*
|
||||
* cl_khr_gl_event extension
|
||||
* See section 9.9 in the OpenCL 1.1 spec for more information
|
||||
*/
|
||||
#define CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR 0x200D
|
||||
|
||||
extern CL_API_ENTRY cl_event CL_API_CALL
|
||||
clCreateEventFromGLsyncKHR(cl_context /* context */,
|
||||
cl_GLsync /* cl_GLsync */,
|
||||
cl_int * /* errcode_ret */) CL_EXT_SUFFIX__VERSION_1_1;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_CL_GL_EXT_H */
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,54 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2008-2013 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and/or associated documentation files (the
|
||||
* "Materials"), to deal in the Materials without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
* permit persons to whom the Materials are furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
******************************************************************************/
|
||||
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
|
||||
#ifndef __OPENCL_H
|
||||
#define __OPENCL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __APPLE__
|
||||
|
||||
#include <OpenCL/cl.h>
|
||||
#include <OpenCL/cl_gl.h>
|
||||
#include <OpenCL/cl_gl_ext.h>
|
||||
#include <OpenCL/cl_ext.h>
|
||||
|
||||
#else
|
||||
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_gl.h>
|
||||
#include <CL/cl_gl_ext.h>
|
||||
#include <CL/cl_ext.h>
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __OPENCL_H */
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) 2012 The Khronos Group Inc. All rights reserved.
|
||||
*
|
||||
* NOTICE TO KHRONOS MEMBER:
|
||||
*
|
||||
* AMD has assigned the copyright for this object code to Khronos.
|
||||
* This object code is subject to Khronos ownership rights under U.S. and
|
||||
* international Copyright laws.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any Khronos Member
|
||||
* obtaining a copy of this software and/or associated documentation files
|
||||
* (the "Materials"), to use, copy, modify and merge the Materials in object
|
||||
* form only and to publish, distribute and/or sell copies of the Materials
|
||||
* solely in object code form as part of conformant OpenCL API implementations,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* Khronos Members shall ensure that their respective ICD implementation,
|
||||
* that is installed over another Khronos Members' ICD implementation, will
|
||||
* continue to support all OpenCL devices (hardware and software) supported
|
||||
* by the replaced ICD implementation. For the purposes of this notice, "ICD"
|
||||
* shall mean a library that presents an implementation of the OpenCL API for
|
||||
* the purpose routing API calls to different vendor implementation.
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Materials.
|
||||
*
|
||||
* KHRONOS AND AMD MAKE NO REPRESENTATION ABOUT THE SUITABILITY OF THIS
|
||||
* SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
|
||||
* IMPLIED WARRANTY OF ANY KIND. KHRONOS AND AMD DISCLAIM ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* IN NO EVENT SHALL KHRONOS OR AMD BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
|
||||
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
|
||||
* THE USE OR PERFORMANCE OF THIS SOURCE CODE.
|
||||
*
|
||||
* U.S. Government End Users. This source code is a "commercial item" as
|
||||
* that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of
|
||||
* "commercial computer software" and "commercial computer software
|
||||
* documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995)
|
||||
* and is provided to the U.S. Government only as a commercial end item.
|
||||
* Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
|
||||
* 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
|
||||
* source code with only those rights set forth herein.
|
||||
*/
|
||||
/* $Revision: 11708 $ on $Date: 2010-06-13 23:36:24 -0700 (Sun, 13 Jun 2010) $ */
|
||||
#ifndef __SPIR_H
|
||||
#define __SPIR_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
// CLS is for CL SPIR.
|
||||
typedef enum {
|
||||
CLS_PRIVATE_AS = 0,
|
||||
CLS_GLOBAL_AS = 1,
|
||||
CLS_CONSTANT_AS = 2,
|
||||
CLS_LOCAL_AS = 3,
|
||||
CLS_GLOBAL_HOST_AS = 4,
|
||||
CLS_CONSTANT_HOST_AS = 5,
|
||||
CLS_REGION_AS_AMD = 16,
|
||||
} CLS_ADDRESS_SPACES;
|
||||
|
||||
// Table 13
|
||||
typedef enum {
|
||||
CLS_ADDRESS_MIRRORED_REPEAT = 0,
|
||||
CLS_ADDRESS_REPEAT = 1,
|
||||
CLS_ADDRESS_CLAMP_TO_EDGE = 2,
|
||||
CLS_ADDRESS_CLAMP = 3,
|
||||
CLS_ADDRESS_NONE = 4
|
||||
} CLS_ADDRESSING_MODES;
|
||||
|
||||
// Table 13
|
||||
typedef enum {
|
||||
CLS_FILTER_NEAREST = 0,
|
||||
CLS_FILTER_LINEAR = 1
|
||||
} CLS_FILTER_MODE;
|
||||
|
||||
// Table 13
|
||||
typedef enum {
|
||||
CLS_NORMALIZED_COORDS_TRUE = 0,
|
||||
CLS_NORMALIZED_COORDS_FALSE = 1
|
||||
} CLS_NORMALIZED_COORDS;
|
||||
|
||||
// Section 2.3
|
||||
typedef enum {
|
||||
CLS_READ_ONLY = 0,
|
||||
CLS_WRITE_ONLY = 1,
|
||||
CLS_READ_WRITE = 2,
|
||||
CLS_NONE = 3
|
||||
} CLS_ACCESS_QUALIFIERS;
|
||||
|
||||
// Table 14
|
||||
typedef enum {
|
||||
CLS_ARG_CONST = 1,
|
||||
CLS_ARG_RESTRICT = 2,
|
||||
CLS_ARG_VOLATILE = 4,
|
||||
CLS_ARG_NONE = 0,
|
||||
CLS_ARG_MASK = 0xf,
|
||||
CLS_ARG_PIPE = 8
|
||||
} CLS_ARGTYPE_QUALIFIERS;
|
||||
|
||||
static const char* SPIR_TRIPLE_32BIT = "spir-unknown-unknown";
|
||||
static const char* SPIR_TRIPLE_64BIT = "spir64-unknown-unknown";
|
||||
static const char* SPIR_DATA_LAYOUT_32BIT = "p:32:32:32-i1:8:8-i8:8:8"
|
||||
"-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16"
|
||||
"-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
|
||||
"-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024";
|
||||
static const char* SPIR_DATA_LAYOUT_64BIT = "p:64:64:64-i1:8:8-i8:8:8"
|
||||
"-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16"
|
||||
"-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
|
||||
"-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024";
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // __SPIR_H
|
||||
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (c) 2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software source and associated documentation files (the "Materials"),
|
||||
* to use, copy, modify and compile the Materials to create a binary under the
|
||||
* following terms and conditions:
|
||||
*
|
||||
* 1. The Materials shall NOT be distributed to any third party;
|
||||
*
|
||||
* 2. The binary may be distributed without restriction, including without
|
||||
* limitation the rights to use, copy, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies, and to permit persons to whom the binary is furnished to
|
||||
* do so;
|
||||
*
|
||||
* 3. All modifications to the Materials used to create a binary that is
|
||||
* distributed to third parties shall be provided to Khronos with an
|
||||
* unrestricted license to use for the purposes of implementing bug fixes and
|
||||
* enhancements to the Materials;
|
||||
*
|
||||
* 4. If the binary is used as part of an OpenCL(TM) implementation, whether
|
||||
* binary is distributed together with or separately to that implementation,
|
||||
* then recipient must become an OpenCL Adopter and follow the published OpenCL
|
||||
* conformance process for that implementation, details at:
|
||||
* http://www.khronos.org/conformance/;
|
||||
*
|
||||
* 5. The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN
|
||||
* THE MATERIALS.
|
||||
*
|
||||
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#ifdef RC_INVOKED
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 2,0,1,0
|
||||
PRODUCTVERSION 2,0,1,0
|
||||
FILETYPE VFT_DLL
|
||||
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "FileDescription" ,"OpenCL Client DLL"
|
||||
VALUE "ProductName" ,"Khronos OpenCL ICD"
|
||||
VALUE "LegalCopyright" ,"Copyright \251 The Khronos Group Inc 2014"
|
||||
VALUE "FileVersion" ,"2.0.1.0"
|
||||
|
||||
VALUE "CompanyName" ,"Khronos Group"
|
||||
VALUE "InternalName" ,"OpenCL"
|
||||
VALUE "OriginalFilename","OpenCL.dll"
|
||||
END
|
||||
END
|
||||
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
// extend this line for localized versions
|
||||
VALUE "Translation", 0x0409, 0x04E4
|
||||
END
|
||||
END
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,215 @@
|
||||
/*
|
||||
* Copyright (c) 2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software source and associated documentation files (the "Materials"),
|
||||
* to use, copy, modify and compile the Materials to create a binary under the
|
||||
* following terms and conditions:
|
||||
*
|
||||
* 1. The Materials shall NOT be distributed to any third party;
|
||||
*
|
||||
* 2. The binary may be distributed without restriction, including without
|
||||
* limitation the rights to use, copy, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies, and to permit persons to whom the binary is furnished to
|
||||
* do so;
|
||||
*
|
||||
* 3. All modifications to the Materials used to create a binary that is
|
||||
* distributed to third parties shall be provided to Khronos with an
|
||||
* unrestricted license to use for the purposes of implementing bug fixes and
|
||||
* enhancements to the Materials;
|
||||
*
|
||||
* 4. If the binary is used as part of an OpenCL(TM) implementation, whether
|
||||
* binary is distributed together with or separately to that implementation,
|
||||
* then recipient must become an OpenCL Adopter and follow the published OpenCL
|
||||
* conformance process for that implementation, details at:
|
||||
* http://www.khronos.org/conformance/;
|
||||
*
|
||||
* 5. The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN
|
||||
* THE MATERIALS.
|
||||
*
|
||||
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||||
*/
|
||||
|
||||
#include "icd.h"
|
||||
#include "icd_dispatch.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
KHRicdState khrIcdState = {0};
|
||||
|
||||
// entrypoint to initialize the ICD and add all vendors
|
||||
void khrIcdInitialize(void)
|
||||
{
|
||||
// make sure we don't double-initialize
|
||||
if (khrIcdState.initialized)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// khrIcdOsVendorsEnumerate is atomic
|
||||
khrIcdState.initialized = khrIcdOsVendorsEnumerate();
|
||||
}
|
||||
|
||||
void khrIcdVendorAdd(const char *libraryName)
|
||||
{
|
||||
void *library = NULL;
|
||||
cl_int result = CL_SUCCESS;
|
||||
pfn_clGetExtensionFunctionAddress p_clGetExtensionFunctionAddress = NULL;
|
||||
pfn_clIcdGetPlatformIDs p_clIcdGetPlatformIDs = NULL;
|
||||
cl_uint i = 0;
|
||||
cl_uint platformCount = 0;
|
||||
cl_platform_id *platforms = NULL;
|
||||
|
||||
// require that the library name be valid
|
||||
if (!libraryName)
|
||||
{
|
||||
goto Done;
|
||||
}
|
||||
KHR_ICD_TRACE("attempting to add vendor %s...\n", libraryName);
|
||||
|
||||
// load its library and query its function pointers
|
||||
library = khrIcdOsLibraryLoad(libraryName);
|
||||
if (!library)
|
||||
{
|
||||
KHR_ICD_TRACE("failed to load library %s\n", libraryName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
// get the library's clGetExtensionFunctionAddress pointer
|
||||
p_clGetExtensionFunctionAddress = khrIcdOsLibraryGetFunctionAddress(library, "clGetExtensionFunctionAddress");
|
||||
if (!p_clGetExtensionFunctionAddress)
|
||||
{
|
||||
KHR_ICD_TRACE("failed to get function address clGetExtensionFunctionAddress\n");
|
||||
goto Done;
|
||||
}
|
||||
|
||||
// use that function to get the clIcdGetPlatformIDsKHR function pointer
|
||||
p_clIcdGetPlatformIDs = p_clGetExtensionFunctionAddress("clIcdGetPlatformIDsKHR");
|
||||
if (!p_clIcdGetPlatformIDs)
|
||||
{
|
||||
KHR_ICD_TRACE("failed to get extension function address clIcdGetPlatformIDsKHR\n");
|
||||
goto Done;
|
||||
}
|
||||
|
||||
// query the number of platforms available and allocate space to store them
|
||||
result = p_clIcdGetPlatformIDs(0, NULL, &platformCount);
|
||||
if (CL_SUCCESS != result)
|
||||
{
|
||||
KHR_ICD_TRACE("failed clIcdGetPlatformIDs\n");
|
||||
goto Done;
|
||||
}
|
||||
platforms = (cl_platform_id *)malloc(platformCount * sizeof(cl_platform_id) );
|
||||
if (!platforms)
|
||||
{
|
||||
KHR_ICD_TRACE("failed to allocate memory\n");
|
||||
goto Done;
|
||||
}
|
||||
memset(platforms, 0, platformCount * sizeof(cl_platform_id) );
|
||||
result = p_clIcdGetPlatformIDs(platformCount, platforms, NULL);
|
||||
if (CL_SUCCESS != result)
|
||||
{
|
||||
KHR_ICD_TRACE("failed clIcdGetPlatformIDs\n");
|
||||
goto Done;
|
||||
}
|
||||
|
||||
// for each platform, add it
|
||||
for (i = 0; i < platformCount; ++i)
|
||||
{
|
||||
KHRicdVendor* vendor = NULL;
|
||||
char *suffix;
|
||||
size_t suffixSize;
|
||||
|
||||
// call clGetPlatformInfo on the returned platform to get the suffix
|
||||
if (!platforms[i])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
result = platforms[i]->dispatch->clGetPlatformInfo(
|
||||
platforms[i],
|
||||
CL_PLATFORM_ICD_SUFFIX_KHR,
|
||||
0,
|
||||
NULL,
|
||||
&suffixSize);
|
||||
if (CL_SUCCESS != result)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
suffix = (char *)malloc(suffixSize);
|
||||
if (!suffix)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
result = platforms[i]->dispatch->clGetPlatformInfo(
|
||||
platforms[i],
|
||||
CL_PLATFORM_ICD_SUFFIX_KHR,
|
||||
suffixSize,
|
||||
suffix,
|
||||
NULL);
|
||||
if (CL_SUCCESS != result)
|
||||
{
|
||||
free(suffix);
|
||||
continue;
|
||||
}
|
||||
|
||||
// allocate a structure for the vendor
|
||||
vendor = (KHRicdVendor*)malloc(sizeof(*vendor) );
|
||||
if (!vendor)
|
||||
{
|
||||
free(suffix);
|
||||
KHR_ICD_TRACE("failed to allocate memory\n");
|
||||
continue;
|
||||
}
|
||||
memset(vendor, 0, sizeof(*vendor) );
|
||||
|
||||
// populate vendor data
|
||||
vendor->library = khrIcdOsLibraryLoad(libraryName);
|
||||
if (!vendor->library)
|
||||
{
|
||||
free(suffix);
|
||||
free(vendor);
|
||||
KHR_ICD_TRACE("failed get platform handle to library\n");
|
||||
continue;
|
||||
}
|
||||
vendor->clGetExtensionFunctionAddress = p_clGetExtensionFunctionAddress;
|
||||
vendor->platform = platforms[i];
|
||||
vendor->suffix = suffix;
|
||||
|
||||
// add this vendor to the list of vendors at the tail
|
||||
{
|
||||
KHRicdVendor **prevNextPointer = NULL;
|
||||
for (prevNextPointer = &khrIcdState.vendors; *prevNextPointer; prevNextPointer = &( (*prevNextPointer)->next) );
|
||||
*prevNextPointer = vendor;
|
||||
}
|
||||
|
||||
KHR_ICD_TRACE("successfully added vendor %s with suffix %s\n", libraryName, suffix);
|
||||
|
||||
}
|
||||
|
||||
Done:
|
||||
|
||||
if (library)
|
||||
{
|
||||
khrIcdOsLibraryUnload(library);
|
||||
}
|
||||
}
|
||||
|
||||
void khrIcdContextPropertiesGetPlatform(const cl_context_properties *properties, cl_platform_id *outPlatform)
|
||||
{
|
||||
const cl_context_properties *property = (cl_context_properties *)NULL;
|
||||
*outPlatform = NULL;
|
||||
for (property = properties; property && property[0]; property += 2)
|
||||
{
|
||||
if ((cl_context_properties)CL_CONTEXT_PLATFORM == property[0])
|
||||
{
|
||||
*outPlatform = (cl_platform_id)property[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,272 @@
|
||||
/*
|
||||
* Copyright (c) 2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software source and associated documentation files (the "Materials"),
|
||||
* to use, copy, modify and compile the Materials to create a binary under the
|
||||
* following terms and conditions:
|
||||
*
|
||||
* 1. The Materials shall NOT be distributed to any third party;
|
||||
*
|
||||
* 2. The binary may be distributed without restriction, including without
|
||||
* limitation the rights to use, copy, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies, and to permit persons to whom the binary is furnished to
|
||||
* do so;
|
||||
*
|
||||
* 3. All modifications to the Materials used to create a binary that is
|
||||
* distributed to third parties shall be provided to Khronos with an
|
||||
* unrestricted license to use for the purposes of implementing bug fixes and
|
||||
* enhancements to the Materials;
|
||||
*
|
||||
* 4. If the binary is used as part of an OpenCL(TM) implementation, whether
|
||||
* binary is distributed together with or separately to that implementation,
|
||||
* then recipient must become an OpenCL Adopter and follow the published OpenCL
|
||||
* conformance process for that implementation, details at:
|
||||
* http://www.khronos.org/conformance/;
|
||||
*
|
||||
* 5. The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN
|
||||
* THE MATERIALS.
|
||||
*
|
||||
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||||
*/
|
||||
|
||||
#ifndef _ICD_H_
|
||||
#define _ICD_H_
|
||||
|
||||
#include <CL/cl.h>
|
||||
#include <CL/cl_ext.h>
|
||||
|
||||
#include "icd_dispatch.h"
|
||||
|
||||
/*
|
||||
*
|
||||
* vendor dispatch table structure
|
||||
*
|
||||
*/
|
||||
|
||||
struct _cl_object
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_platform_id
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_device_id
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_context
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_command_queue
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_mem
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_program
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_kernel
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_event
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_sampler
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
struct _cl_counter
|
||||
{
|
||||
KHRicdVendorDispatch *dispatch;
|
||||
};
|
||||
|
||||
/*
|
||||
* type definitions
|
||||
*/
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *pfn_clIcdGetPlatformIDs)(
|
||||
cl_uint num_entries,
|
||||
cl_platform_id *platforms,
|
||||
cl_uint *num_platforms) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY cl_int (CL_API_CALL *pfn_clGetPlatformInfo)(
|
||||
cl_platform_id platform,
|
||||
cl_platform_info param_name,
|
||||
size_t param_value_size,
|
||||
void * param_value,
|
||||
size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef CL_API_ENTRY void *(CL_API_CALL *pfn_clGetExtensionFunctionAddress)(
|
||||
const char *function_name) CL_API_SUFFIX__VERSION_1_0;
|
||||
|
||||
typedef struct KHRicdVendorRec KHRicdVendor;
|
||||
typedef struct KHRicdStateRec KHRicdState;
|
||||
|
||||
/*
|
||||
* KHRicdVendor
|
||||
*
|
||||
* Data for a single ICD vendor platform.
|
||||
*/
|
||||
struct KHRicdVendorRec
|
||||
{
|
||||
// the loaded library object (true type varies on Linux versus Windows)
|
||||
void *library;
|
||||
|
||||
// the extension suffix for this platform
|
||||
char *suffix;
|
||||
|
||||
// function pointer to the ICD platform IDs extracted from the library
|
||||
pfn_clGetExtensionFunctionAddress clGetExtensionFunctionAddress;
|
||||
|
||||
// the platform retrieved from clGetIcdPlatformIDsKHR
|
||||
cl_platform_id platform;
|
||||
|
||||
// next vendor in the list vendors
|
||||
KHRicdVendor *next;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* KHRicdState
|
||||
*
|
||||
* The global state of all vendors
|
||||
*
|
||||
* TODO: write access to this structure needs to be protected via a mutex
|
||||
*/
|
||||
|
||||
struct KHRicdStateRec
|
||||
{
|
||||
// has this structure been initialized
|
||||
cl_bool initialized;
|
||||
|
||||
// the list of vendors which have been loaded
|
||||
KHRicdVendor *vendors;
|
||||
};
|
||||
|
||||
// the global state
|
||||
extern KHRicdState khrIcdState;
|
||||
|
||||
/*
|
||||
* khrIcd interface
|
||||
*/
|
||||
|
||||
// read vendors from system configuration and store the data
|
||||
// loaded into khrIcdState. this will call the OS-specific
|
||||
// function khrIcdEnumerateVendors. this is called at every
|
||||
// dispatch function which may be a valid first call into the
|
||||
// API (e.g, getPlatformIDs, etc).
|
||||
void khrIcdInitialize(void);
|
||||
|
||||
// go through the list of vendors (in /etc/OpenCL.conf or through
|
||||
// the registry) and call khrIcdVendorAdd for each vendor encountered
|
||||
// n.b, this call is OS-specific
|
||||
cl_bool khrIcdOsVendorsEnumerate(void);
|
||||
|
||||
// add a vendor's implementation to the list of libraries
|
||||
void khrIcdVendorAdd(const char *libraryName);
|
||||
|
||||
// dynamically load a library. returns NULL on failure
|
||||
// n.b, this call is OS-specific
|
||||
void *khrIcdOsLibraryLoad(const char *libraryName);
|
||||
|
||||
// get a function pointer from a loaded library. returns NULL on failure.
|
||||
// n.b, this call is OS-specific
|
||||
void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName);
|
||||
|
||||
// unload a library.
|
||||
// n.b, this call is OS-specific
|
||||
void khrIcdOsLibraryUnload(void *library);
|
||||
|
||||
// parse properties and determine the platform to use from them
|
||||
void khrIcdContextPropertiesGetPlatform(
|
||||
const cl_context_properties *properties,
|
||||
cl_platform_id *outPlatform);
|
||||
|
||||
// internal tracing macros
|
||||
#if 0
|
||||
#include <stdio.h>
|
||||
#define KHR_ICD_TRACE(...) \
|
||||
do \
|
||||
{ \
|
||||
fprintf(stderr, "KHR ICD trace at %s:%d: ", __FILE__, __LINE__); \
|
||||
fprintf(stderr, __VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define KHR_ICD_ASSERT(x) \
|
||||
do \
|
||||
{ \
|
||||
if (!(x)) \
|
||||
{ \
|
||||
fprintf(stderr, "KHR ICD assert at %s:%d: %s failed", __FILE__, __LINE__, #x); \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
#define KHR_ICD_TRACE(...)
|
||||
#define KHR_ICD_ASSERT(x)
|
||||
#endif
|
||||
|
||||
// if handle is NULL then return
|
||||
#define KHR_ICD_VALIDATE_HANDLE(handle) \
|
||||
do \
|
||||
{ \
|
||||
if (!handle) \
|
||||
{ \
|
||||
return; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
// if handle is NULL then return invalid_handle_error_code
|
||||
#define KHR_ICD_VALIDATE_HANDLE_RETURN_ERROR(handle,invalid_handle_error_code) \
|
||||
do \
|
||||
{ \
|
||||
if (!handle) \
|
||||
{ \
|
||||
return invalid_handle_error_code; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
// if handle is NULL then set errcode_ret to invalid_handle_error and return NULL
|
||||
// (NULL being an invalid handle)
|
||||
#define KHR_ICD_VALIDATE_HANDLE_RETURN_HANDLE(handle,invalid_handle_error) \
|
||||
do \
|
||||
{ \
|
||||
if (!handle) \
|
||||
{ \
|
||||
if (errcode_ret) \
|
||||
{ \
|
||||
*errcode_ret = invalid_handle_error; \
|
||||
} \
|
||||
return NULL; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff soppresso perché troppo grande
Carica Diff
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,191 @@
|
||||
/*
|
||||
* Copyright (c) 2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software source and associated documentation files (the "Materials"),
|
||||
* to use, copy, modify and compile the Materials to create a binary under the
|
||||
* following terms and conditions:
|
||||
*
|
||||
* 1. The Materials shall NOT be distributed to any third party;
|
||||
*
|
||||
* 2. The binary may be distributed without restriction, including without
|
||||
* limitation the rights to use, copy, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies, and to permit persons to whom the binary is furnished to
|
||||
* do so;
|
||||
*
|
||||
* 3. All modifications to the Materials used to create a binary that is
|
||||
* distributed to third parties shall be provided to Khronos with an
|
||||
* unrestricted license to use for the purposes of implementing bug fixes and
|
||||
* enhancements to the Materials;
|
||||
*
|
||||
* 4. If the binary is used as part of an OpenCL(TM) implementation, whether
|
||||
* binary is distributed together with or separately to that implementation,
|
||||
* then recipient must become an OpenCL Adopter and follow the published OpenCL
|
||||
* conformance process for that implementation, details at:
|
||||
* http://www.khronos.org/conformance/;
|
||||
*
|
||||
* 5. The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN
|
||||
* THE MATERIALS.
|
||||
*
|
||||
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||||
*/
|
||||
|
||||
#include "icd.h"
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <pthread.h>
|
||||
|
||||
/*
|
||||
*
|
||||
* Vendor enumeration functions
|
||||
*
|
||||
*/
|
||||
static pthread_once_t InitOnce = PTHREAD_ONCE_INIT;
|
||||
|
||||
// go through the list of vendors in the two configuration files
|
||||
void khrIcdOsVendorsEnumerateCallBack(void)
|
||||
{
|
||||
DIR *dir = NULL;
|
||||
struct dirent *dirEntry = NULL;
|
||||
char *vendorPath;
|
||||
|
||||
vendorPath = getenv("OPENCL_VENDOR_PATH");
|
||||
if (vendorPath == NULL)
|
||||
{
|
||||
vendorPath = "/etc/OpenCL/vendors";
|
||||
}
|
||||
|
||||
// open the directory
|
||||
dir = opendir(vendorPath);
|
||||
if (NULL == dir)
|
||||
{
|
||||
KHR_ICD_TRACE("Failed to open path %s\n", vendorPath);
|
||||
goto Cleanup;
|
||||
}
|
||||
|
||||
// attempt to load all files in the directory
|
||||
for (dirEntry = readdir(dir); dirEntry; dirEntry = readdir(dir) )
|
||||
{
|
||||
switch(dirEntry->d_type)
|
||||
{
|
||||
case DT_UNKNOWN:
|
||||
case DT_REG:
|
||||
case DT_LNK:
|
||||
{
|
||||
const char* extension = ".icd";
|
||||
FILE *fin = NULL;
|
||||
char* fileName = NULL;
|
||||
char* buffer = NULL;
|
||||
long bufferSize = 0;
|
||||
|
||||
// make sure the file name ends in .icd
|
||||
if (strlen(extension) > strlen(dirEntry->d_name) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (strcmp(dirEntry->d_name + strlen(dirEntry->d_name) - strlen(extension), extension) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// allocate space for the full path of the vendor library name
|
||||
fileName = malloc(strlen(dirEntry->d_name) + 1 + strlen(vendorPath) + 1);
|
||||
if (!fileName)
|
||||
{
|
||||
KHR_ICD_TRACE("Failed allocate space for ICD file path\n");
|
||||
break;
|
||||
}
|
||||
sprintf(fileName, "%s/%s", vendorPath, dirEntry->d_name);
|
||||
|
||||
// open the file and read its contents
|
||||
fin = fopen(fileName, "r");
|
||||
if (!fin)
|
||||
{
|
||||
free(fileName);
|
||||
break;
|
||||
}
|
||||
fseek(fin, 0, SEEK_END);
|
||||
bufferSize = ftell(fin);
|
||||
|
||||
buffer = malloc(bufferSize+1);
|
||||
if (!buffer)
|
||||
{
|
||||
free(fileName);
|
||||
fclose(fin);
|
||||
break;
|
||||
}
|
||||
memset(buffer, 0, bufferSize+1);
|
||||
fseek(fin, 0, SEEK_SET);
|
||||
if (bufferSize != (long)fread(buffer, 1, bufferSize, fin) )
|
||||
{
|
||||
free(fileName);
|
||||
free(buffer);
|
||||
fclose(fin);
|
||||
break;
|
||||
}
|
||||
// ignore a newline at the end of the file
|
||||
if (buffer[bufferSize-1] == '\n') buffer[bufferSize-1] = '\0';
|
||||
|
||||
// load the string read from the file
|
||||
khrIcdVendorAdd(buffer);
|
||||
|
||||
free(fileName);
|
||||
free(buffer);
|
||||
fclose(fin);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Cleanup:
|
||||
|
||||
// free resources and exit
|
||||
if (dir)
|
||||
{
|
||||
closedir(dir);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* Dynamic library loading functions
|
||||
*
|
||||
*/
|
||||
|
||||
// dynamically load a library. returns NULL on failure
|
||||
void *khrIcdOsLibraryLoad(const char *libraryName)
|
||||
{
|
||||
return dlopen (libraryName, RTLD_NOW);
|
||||
}
|
||||
|
||||
// get a function pointer from a loaded library. returns NULL on failure.
|
||||
void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName)
|
||||
{
|
||||
return dlsym(library, functionName);
|
||||
}
|
||||
|
||||
// unload a library
|
||||
void khrIcdOsLibraryUnload(void *library)
|
||||
{
|
||||
dlclose(library);
|
||||
}
|
||||
|
||||
cl_bool khrIcdOsVendorsEnumerate(void)
|
||||
{
|
||||
pthread_once(&InitOnce, khrIcdOsVendorsEnumerateCallBack);
|
||||
return CL_TRUE;
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
* Copyright (c) 2012 The Khronos Group Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software source and associated documentation files (the "Materials"),
|
||||
* to use, copy, modify and compile the Materials to create a binary under the
|
||||
* following terms and conditions:
|
||||
*
|
||||
* 1. The Materials shall NOT be distributed to any third party;
|
||||
*
|
||||
* 2. The binary may be distributed without restriction, including without
|
||||
* limitation the rights to use, copy, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies, and to permit persons to whom the binary is furnished to
|
||||
* do so;
|
||||
*
|
||||
* 3. All modifications to the Materials used to create a binary that is
|
||||
* distributed to third parties shall be provided to Khronos with an
|
||||
* unrestricted license to use for the purposes of implementing bug fixes and
|
||||
* enhancements to the Materials;
|
||||
*
|
||||
* 4. If the binary is used as part of an OpenCL(TM) implementation, whether
|
||||
* binary is distributed together with or separately to that implementation,
|
||||
* then recipient must become an OpenCL Adopter and follow the published OpenCL
|
||||
* conformance process for that implementation, details at:
|
||||
* http://www.khronos.org/conformance/;
|
||||
*
|
||||
* 5. The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Materials.
|
||||
*
|
||||
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN
|
||||
* THE MATERIALS.
|
||||
*
|
||||
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||||
*/
|
||||
|
||||
#include "icd.h"
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
#include <winreg.h>
|
||||
#include <WinBase.h>
|
||||
|
||||
/*
|
||||
*
|
||||
* Vendor enumeration functions
|
||||
*
|
||||
*/
|
||||
static INIT_ONCE InitOnce = INIT_ONCE_STATIC_INIT;
|
||||
|
||||
// go through the list of vendors in the registry and call khrIcdVendorAdd
|
||||
// for each vendor encountered
|
||||
BOOL CALLBACK khrIcdOsVendorsEnumerateCallBack(
|
||||
_Inout_ PINIT_ONCE InitOnce,
|
||||
_Inout_opt_ PVOID Parameter,
|
||||
_Out_opt_ PVOID *Context)
|
||||
{
|
||||
LONG result;
|
||||
const char* platformsName = "SOFTWARE\\Khronos\\OpenCL\\Vendors";
|
||||
HKEY platformsKey = NULL;
|
||||
DWORD dwIndex;
|
||||
|
||||
KHR_ICD_TRACE("Opening key HKLM\\%s...\n", platformsName);
|
||||
result = RegOpenKeyExA(
|
||||
HKEY_LOCAL_MACHINE,
|
||||
platformsName,
|
||||
0,
|
||||
KEY_READ,
|
||||
&platformsKey);
|
||||
if (ERROR_SUCCESS != result)
|
||||
{
|
||||
KHR_ICD_TRACE("Failed to open platforms key %s, continuing\n", platformsName);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// for each value
|
||||
for (dwIndex = 0;; ++dwIndex)
|
||||
{
|
||||
char cszLibraryName[1024] = {0};
|
||||
DWORD dwLibraryNameSize = sizeof(cszLibraryName);
|
||||
DWORD dwLibraryNameType = 0;
|
||||
DWORD dwValue = 0;
|
||||
DWORD dwValueSize = sizeof(dwValue);
|
||||
|
||||
// read the value name
|
||||
KHR_ICD_TRACE("Reading value %d...\n", dwIndex);
|
||||
result = RegEnumValueA(
|
||||
platformsKey,
|
||||
dwIndex,
|
||||
cszLibraryName,
|
||||
&dwLibraryNameSize,
|
||||
NULL,
|
||||
&dwLibraryNameType,
|
||||
(LPBYTE)&dwValue,
|
||||
&dwValueSize);
|
||||
// if RegEnumKeyEx fails, we are done with the enumeration
|
||||
if (ERROR_SUCCESS != result)
|
||||
{
|
||||
KHR_ICD_TRACE("Failed to read value %d, done reading key.\n", dwIndex);
|
||||
break;
|
||||
}
|
||||
KHR_ICD_TRACE("Value %s found...\n", cszLibraryName);
|
||||
|
||||
// Require that the value be a DWORD and equal zero
|
||||
if (REG_DWORD != dwLibraryNameType)
|
||||
{
|
||||
KHR_ICD_TRACE("Value not a DWORD, skipping\n");
|
||||
continue;
|
||||
}
|
||||
if (dwValue)
|
||||
{
|
||||
KHR_ICD_TRACE("Value not zero, skipping\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
// add the library
|
||||
khrIcdVendorAdd(cszLibraryName);
|
||||
}
|
||||
|
||||
result = RegCloseKey(platformsKey);
|
||||
if (ERROR_SUCCESS != result)
|
||||
{
|
||||
KHR_ICD_TRACE("Failed to close platforms key %s, ignoring\n", platformsName);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* Dynamic library loading functions
|
||||
*
|
||||
*/
|
||||
|
||||
// dynamically load a library. returns NULL on failure
|
||||
void *khrIcdOsLibraryLoad(const char *libraryName)
|
||||
{
|
||||
return (void *)LoadLibraryA(libraryName);
|
||||
}
|
||||
|
||||
// get a function pointer from a loaded library. returns NULL on failure.
|
||||
void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName)
|
||||
{
|
||||
if (!library || !functionName)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return GetProcAddress( (HMODULE)library, functionName);
|
||||
}
|
||||
|
||||
// unload a library.
|
||||
void khrIcdOsLibraryUnload(void *library)
|
||||
{
|
||||
FreeLibrary( (HMODULE)library);
|
||||
}
|
||||
|
||||
cl_bool khrIcdOsVendorsEnumerate(void)
|
||||
{
|
||||
InitOnceExecuteOnce(&InitOnce, khrIcdOsVendorsEnumerateCallBack, NULL, NULL);
|
||||
return CL_TRUE;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
Fri Jul 4 09:40:50 EDT 2014
|
||||
File diff soppresso perché troppo grande
Carica Diff
@@ -0,0 +1,837 @@
|
||||
/* ============================================================
|
||||
|
||||
Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Redistribution and use of this material is permitted under the following
|
||||
conditions:
|
||||
|
||||
Redistributions must retain the above copyright notice and all terms of this
|
||||
license.
|
||||
|
||||
In no event shall anyone redistributing or accessing or using this material
|
||||
commence or participate in any arbitration or legal action relating to this
|
||||
material against Advanced Micro Devices, Inc. or any copyright holders or
|
||||
contributors. The foregoing shall survive any expiration or termination of
|
||||
this license or any agreement or access or use related to this material.
|
||||
|
||||
ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION
|
||||
OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL.
|
||||
|
||||
THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT
|
||||
HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY
|
||||
REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO
|
||||
SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERA TION, OR THAT IT IS FREE
|
||||
FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER
|
||||
EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED
|
||||
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||
ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT.
|
||||
IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY
|
||||
ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES,
|
||||
INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS
|
||||
(US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS
|
||||
THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND
|
||||
ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES,
|
||||
OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE
|
||||
FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE
|
||||
CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR
|
||||
DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR
|
||||
CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE
|
||||
THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL
|
||||
SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR
|
||||
ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS
|
||||
MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO
|
||||
RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER
|
||||
COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH
|
||||
AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS
|
||||
DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S.
|
||||
MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED,
|
||||
EXPORTED AND/OR RE-EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS,
|
||||
INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS,
|
||||
COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS.
|
||||
MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY
|
||||
LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL.
|
||||
|
||||
NOTICE REGARDING THE U.S. GOVERNMENT AND DOD AGENCIES: This material is
|
||||
provided with "RESTRICTED RIGHTS" and/or "LIMITED RIGHTS" as applicable to
|
||||
computer software and technical data, respectively. Use, duplication,
|
||||
distribution or disclosure by the U.S. Government and/or DOD agencies is
|
||||
subject to the full extent of restrictions in all applicable regulations,
|
||||
including those found at FAR52.227 and DFARS252.227 et seq. and any successor
|
||||
regulations thereof. Use of this material by the U.S. Government and/or DOD
|
||||
agencies is acknowledgment of the proprietary rights of any copyright holders
|
||||
and contributors, including those of Advanced Micro Devices, Inc., as well as
|
||||
the provisions of FAR52.227-14 through 23 regarding privately developed and/or
|
||||
commercial computer software.
|
||||
|
||||
This license forms the entire agreement regarding the subject matter hereof and
|
||||
supersedes all proposals and prior discussions and writings between the parties
|
||||
with respect thereto. This license does not affect any ownership, rights, title,
|
||||
or interest in, or relating to, this material. No terms of this license can be
|
||||
modified or waived, and no breach of this license can be excused, unless done
|
||||
so in a writing signed by all affected parties. Each term of this license is
|
||||
separately enforceable. If any term of this license is determined to be or
|
||||
becomes unenforceable or illegal, such term shall be reformed to the minimum
|
||||
extent necessary in order for this license to remain in effect in accordance
|
||||
with its terms as modified by such reformation. This license shall be governed
|
||||
by and construed in accordance with the laws of the State of Texas without
|
||||
regard to rules on conflicts of law of any state or jurisdiction or the United
|
||||
Nations Convention on the International Sale of Goods. All disputes arising out
|
||||
of this license shall be subject to the jurisdiction of the federal and state
|
||||
courts in Austin, Texas, and all defenses are hereby waived concerning personal
|
||||
jurisdiction and venue of these courts.
|
||||
|
||||
============================================================ */
|
||||
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#if !defined(_WIN32)
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#define __CL_ENABLE_EXCEPTIONS
|
||||
#define __MAX_DEFAULT_VECTOR_SIZE 50
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable: 4290)
|
||||
#endif
|
||||
#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
|
||||
#define CL_USE_DEPRECATED_OPENCL_2_0_APIS
|
||||
#include "cl.hpp"
|
||||
|
||||
bool verbose = false;
|
||||
|
||||
inline
|
||||
void
|
||||
checkErr(cl_int err, const char * name)
|
||||
{
|
||||
if (err != CL_SUCCESS) {
|
||||
std::cerr << "ERROR: " << name << " (" << err << ")" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
/* Error flag */
|
||||
cl_int status = 0;
|
||||
cl_int err;
|
||||
|
||||
//parse input
|
||||
for(int i = 1; i < argc; i++){
|
||||
if ((strcmp(argv[i], "-v") == 0) ||
|
||||
(strcmp(argv[i], "--verbose") == 0)){
|
||||
verbose = true;
|
||||
} else if ((strcmp(argv[i], "-h") == 0) ||
|
||||
(strcmp(argv[i], "--help") == 0)){
|
||||
std::cout << "Usage is: " << argv[0] << " [-v|--verbose]" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Platform info
|
||||
std::vector<cl::Platform> platforms;
|
||||
err = cl::Platform::get(&platforms);
|
||||
|
||||
checkErr(
|
||||
err && (platforms.size() == 0 ? -1 : CL_SUCCESS),
|
||||
"cl::Platform::get()");
|
||||
|
||||
try {
|
||||
// Iteratate over platforms
|
||||
std::cout << "Number of platforms:\t\t\t\t "
|
||||
<< platforms.size()
|
||||
<< std::endl;
|
||||
for (std::vector<cl::Platform>::iterator i = platforms.begin();
|
||||
i != platforms.end();
|
||||
++i) {
|
||||
const cl::Platform& platform = *i;
|
||||
|
||||
std::cout << " Platform Profile:\t\t\t\t "
|
||||
<< platform.getInfo<CL_PLATFORM_PROFILE>().c_str()
|
||||
<< std::endl;
|
||||
std::cout << " Platform Version:\t\t\t\t "
|
||||
<< platform.getInfo<CL_PLATFORM_VERSION>().c_str()
|
||||
<< std::endl;
|
||||
std::cout << " Platform Name:\t\t\t\t "
|
||||
<< platform.getInfo<CL_PLATFORM_NAME>().c_str()
|
||||
<< std::endl;
|
||||
std::cout << " Platform Vendor:\t\t\t\t "
|
||||
<< platform.getInfo<CL_PLATFORM_VENDOR>().c_str() << std::endl;
|
||||
if (platform.getInfo<CL_PLATFORM_EXTENSIONS>().size() > 0) {
|
||||
std::cout << " Platform Extensions:\t\t\t\t "
|
||||
<< platform.getInfo<CL_PLATFORM_EXTENSIONS>().c_str()
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << std::endl << std:: endl;
|
||||
// Now Iteratate over each platform and its devices
|
||||
for (std::vector<cl::Platform>::iterator p = platforms.begin();
|
||||
p != platforms.end();
|
||||
++p) {
|
||||
const cl::Platform& platform = *p;
|
||||
std::cout << " Platform Name:\t\t\t\t "
|
||||
<< platform.getInfo<CL_PLATFORM_NAME>().c_str()
|
||||
<< std::endl;
|
||||
|
||||
std::vector<cl::Device> devices;
|
||||
platform.getDevices(CL_DEVICE_TYPE_ALL, &devices);
|
||||
|
||||
// Get OpenCL version
|
||||
std::string platformVersionStr = platform.getInfo<CL_PLATFORM_VERSION>();
|
||||
std::string openclVerstionStr(platformVersionStr.c_str());
|
||||
size_t vStart = openclVerstionStr.find(" ", 0);
|
||||
size_t vEnd = openclVerstionStr.find(" ", vStart + 1);
|
||||
std::string vStrVal = openclVerstionStr.substr(vStart + 1, vEnd - vStart - 1);
|
||||
|
||||
std::cout << "Number of devices:\t\t\t\t " << devices.size() << std::endl;
|
||||
for (std::vector<cl::Device>::iterator i = devices.begin();
|
||||
i != devices.end();
|
||||
++i) {
|
||||
const cl::Device& device = *i;
|
||||
/* Get device name */
|
||||
std::string deviceName = device.getInfo<CL_DEVICE_NAME>();
|
||||
cl_device_type dtype = device.getInfo<CL_DEVICE_TYPE>();
|
||||
|
||||
/* Get CAL driver version in int */
|
||||
std::string driverVersion = device.getInfo<CL_DRIVER_VERSION>();
|
||||
std::string calVersion(driverVersion.c_str());
|
||||
calVersion = calVersion.substr(calVersion.find_last_of(".") + 1);
|
||||
int version = atoi(calVersion.c_str());
|
||||
|
||||
std::cout << " Device Type:\t\t\t\t\t " ;
|
||||
switch (dtype) {
|
||||
case CL_DEVICE_TYPE_ACCELERATOR:
|
||||
std::cout << "CL_DEVICE_TYPE_ACCRLERATOR" << std::endl;
|
||||
break;
|
||||
case CL_DEVICE_TYPE_CPU:
|
||||
std::cout << "CL_DEVICE_TYPE_CPU" << std::endl;
|
||||
break;
|
||||
case CL_DEVICE_TYPE_DEFAULT:
|
||||
std::cout << "CL_DEVICE_TYPE_DEFAULT" << std::endl;
|
||||
break;
|
||||
case CL_DEVICE_TYPE_GPU:
|
||||
std::cout << "CL_DEVICE_TYPE_GPU" << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
std::cout << " Vendor ID:\t\t\t\t\t "
|
||||
<< std::hex
|
||||
<< device.getInfo<CL_DEVICE_VENDOR_ID>()
|
||||
<< "h"
|
||||
<< std::dec
|
||||
<< std::endl;
|
||||
|
||||
bool isAMDPlatform = (strcmp(platform.getInfo<CL_PLATFORM_NAME>().c_str(), "AMD Accelerated Parallel Processing") == 0) ? true : false;
|
||||
if (isAMDPlatform)
|
||||
{
|
||||
std::string boardName;
|
||||
device.getInfo(CL_DEVICE_BOARD_NAME_AMD, &boardName);
|
||||
std::cout << " Board name:\t\t\t\t\t "
|
||||
<< boardName.c_str()
|
||||
<< std::endl;
|
||||
|
||||
cl_device_topology_amd topology;
|
||||
err = device.getInfo(CL_DEVICE_TOPOLOGY_AMD, &topology);
|
||||
if (topology.raw.type == CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD) {
|
||||
std::cout << " Device Topology:\t\t\t\t "
|
||||
<< "PCI[ B#" << (int)topology.pcie.bus
|
||||
<< ", D#" << (int)topology.pcie.device
|
||||
<< ", F#" << (int)topology.pcie.function
|
||||
<< " ]" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << " Max compute units:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_COMPUTE_UNITS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max work items dimensions:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS>()
|
||||
<< std::endl;
|
||||
|
||||
std::vector< ::size_t> witems =
|
||||
device.getInfo<CL_DEVICE_MAX_WORK_ITEM_SIZES>();
|
||||
for (unsigned int x = 0;
|
||||
x < device.getInfo<CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS>();
|
||||
x++) {
|
||||
std::cout << " Max work items["
|
||||
<< x << "]:\t\t\t\t "
|
||||
<< witems[x]
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
std::cout << " Max work group size:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_WORK_GROUP_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred vector width char:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred vector width short:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred vector width int:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred vector width long:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred vector width float:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred vector width double:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE>()
|
||||
<< std::endl;
|
||||
|
||||
#ifdef CL_VERSION_1_1
|
||||
if(vStrVal.compare("1.0") > 0)
|
||||
{
|
||||
std::cout << " Native vector width char:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Native vector width short:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Native vector width int:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_NATIVE_VECTOR_WIDTH_INT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Native vector width long:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Native vector width float:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Native vector width double:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE>()
|
||||
<< std::endl;
|
||||
}
|
||||
#endif // CL_VERSION_1_1
|
||||
std::cout << " Max clock frequency:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_CLOCK_FREQUENCY>()
|
||||
<< "Mhz"
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Address bits:\t\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_ADDRESS_BITS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max memory allocation:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_MEM_ALLOC_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Image support:\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_IMAGE_SUPPORT>() ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
|
||||
if (device.getInfo<CL_DEVICE_IMAGE_SUPPORT>())
|
||||
{
|
||||
|
||||
std::cout << " Max number of images read arguments:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_READ_IMAGE_ARGS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max number of images write arguments:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_WRITE_IMAGE_ARGS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max image 2D width:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_IMAGE2D_MAX_WIDTH>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max image 2D height:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_IMAGE2D_MAX_HEIGHT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max image 3D width:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_IMAGE3D_MAX_WIDTH>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max image 3D height:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_IMAGE3D_MAX_HEIGHT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max image 3D depth:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_IMAGE3D_MAX_DEPTH>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max samplers within kernel:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_SAMPLERS>()
|
||||
<< std::endl;
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
std::cout << " Image formats supported:" << std::endl;
|
||||
std::vector<cl::ImageFormat> formats;
|
||||
|
||||
cl_context_properties cps[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(*p)(), 0 };
|
||||
std::vector<cl::Device> device;
|
||||
device.push_back(*i);
|
||||
cl::Context context(device, cps, NULL, NULL, &err);
|
||||
|
||||
std::map<int,std::string> channelOrder;
|
||||
channelOrder[CL_R] = "CL_R";
|
||||
channelOrder[CL_A] = "CL_A";
|
||||
channelOrder[CL_RG] = "CL_RG";
|
||||
channelOrder[CL_RA] = "CL_RA";
|
||||
channelOrder[CL_RGB] = "CL_RGB";
|
||||
channelOrder[CL_RGBA] = "CL_RGBA";
|
||||
channelOrder[CL_BGRA] = "CL_BGRA";
|
||||
channelOrder[CL_ARGB] = "CL_ARGB";
|
||||
channelOrder[CL_INTENSITY] = "CL_INTENSITY";
|
||||
channelOrder[CL_LUMINANCE] = "CL_LUMINANCE";
|
||||
channelOrder[CL_Rx] = "CL_Rx";
|
||||
channelOrder[CL_RGx] = "CL_RGx";
|
||||
channelOrder[CL_RGBx] = "CL_RGBx";
|
||||
|
||||
std::map<int,std::pair<std::string, std::string> > channelType;
|
||||
channelType[CL_SNORM_INT8] = std::make_pair("snorm", "int8");
|
||||
channelType[CL_SNORM_INT16] = std::make_pair("snorm", "int16");
|
||||
channelType[CL_UNORM_INT8] = std::make_pair("unorm", "int8");
|
||||
channelType[CL_UNORM_INT16] = std::make_pair("unorm", "int16");
|
||||
channelType[CL_UNORM_SHORT_565] = std::make_pair("unorm", "short_565");
|
||||
channelType[CL_UNORM_SHORT_555] = std::make_pair("unorm", "short_555");
|
||||
channelType[CL_UNORM_INT_101010] = std::make_pair("unorm", "int_101010");
|
||||
channelType[CL_SIGNED_INT8] = std::make_pair("signed", "int8");
|
||||
channelType[CL_SIGNED_INT16] = std::make_pair("signed", "int16");
|
||||
channelType[CL_SIGNED_INT32] = std::make_pair("signed", "int32");
|
||||
channelType[CL_UNSIGNED_INT8] = std::make_pair("unsigned", "int8");
|
||||
channelType[CL_UNSIGNED_INT16] = std::make_pair("unsigned", "int16");
|
||||
channelType[CL_UNSIGNED_INT32] = std::make_pair("unsigned", "int32");
|
||||
channelType[CL_HALF_FLOAT] = std::make_pair("half_float", "");
|
||||
channelType[CL_FLOAT] = std::make_pair("float", "");
|
||||
|
||||
std::vector<std::pair<int, std::string> > imageDimensions;
|
||||
imageDimensions.push_back(std::make_pair(CL_MEM_OBJECT_IMAGE2D, std::string("2D ")));
|
||||
imageDimensions.push_back(std::make_pair(CL_MEM_OBJECT_IMAGE3D, std::string("3D ")));
|
||||
for(std::vector<std::pair<int, std::string> >::iterator id = imageDimensions.begin();
|
||||
id != imageDimensions.end();
|
||||
id++){
|
||||
|
||||
struct imageAccessStruct {
|
||||
std::string name;
|
||||
int access;
|
||||
std::vector<cl::ImageFormat> formats;
|
||||
} imageAccess[] = {{std::string("Read-Write/Read-Only/Write-Only"), CL_MEM_READ_WRITE, std::vector<cl::ImageFormat>()},
|
||||
{std::string("Read-Only"), CL_MEM_READ_ONLY, std::vector<cl::ImageFormat>()},
|
||||
{std::string("Write-Only"), CL_MEM_WRITE_ONLY, std::vector<cl::ImageFormat>()}};
|
||||
|
||||
for(size_t ia=0; ia < sizeof(imageAccess)/sizeof(imageAccessStruct); ia++){
|
||||
context.getSupportedImageFormats(imageAccess[ia].access, (*id).first, &(imageAccess[ia].formats));
|
||||
bool printTopHeader = true;
|
||||
for (std::map<int,std::string>::iterator o = channelOrder.begin();
|
||||
o != channelOrder.end();
|
||||
o++)
|
||||
{
|
||||
bool printHeader = true;
|
||||
|
||||
for (std::vector<cl::ImageFormat>::iterator it = imageAccess[ia].formats.begin();
|
||||
it != imageAccess[ia].formats.end();
|
||||
++it)
|
||||
{
|
||||
if ( (*o).first == (int)(*it).image_channel_order)
|
||||
{
|
||||
bool printedAlready = false;
|
||||
//see if this was already print in RW/RO/WO
|
||||
if (ia !=0)
|
||||
{
|
||||
for (std::vector<cl::ImageFormat>::iterator searchIt = imageAccess[0].formats.begin();
|
||||
searchIt != imageAccess[0].formats.end();
|
||||
searchIt++)
|
||||
{
|
||||
if ( ((*searchIt).image_channel_data_type == (*it).image_channel_data_type) &&
|
||||
((*searchIt).image_channel_order == (*it).image_channel_order))
|
||||
{
|
||||
printedAlready = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (printedAlready)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (printTopHeader)
|
||||
{
|
||||
std::cout << " " << (*id).second << imageAccess[ia].name << std::endl;
|
||||
printTopHeader = false;
|
||||
}
|
||||
if (printHeader)
|
||||
{
|
||||
std::cout << " " << (*o).second << ": ";
|
||||
printHeader = false;
|
||||
}
|
||||
std::cout << channelType[(*it).image_channel_data_type].first;
|
||||
if (channelType[(*it).image_channel_data_type].second != "")
|
||||
{
|
||||
std::cout << "-"
|
||||
<< channelType[(*it).image_channel_data_type].second;
|
||||
}
|
||||
if (it != (imageAccess[ia].formats.end() - 1))
|
||||
{
|
||||
std::cout << " ";
|
||||
}
|
||||
}
|
||||
}
|
||||
if (printHeader == false)
|
||||
{
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << " Max size of kernel argument:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_PARAMETER_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Alignment (bits) of base address:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MEM_BASE_ADDR_ALIGN>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Minimum alignment (bytes) for any datatype:\t "
|
||||
<< device.getInfo<CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Single precision floating point capability" << std::endl;
|
||||
std::cout << " Denorms:\t\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SINGLE_FP_CONFIG>() &
|
||||
CL_FP_DENORM ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Quiet NaNs:\t\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SINGLE_FP_CONFIG>() &
|
||||
CL_FP_INF_NAN ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Round to nearest even:\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SINGLE_FP_CONFIG>() &
|
||||
CL_FP_ROUND_TO_NEAREST ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Round to zero:\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SINGLE_FP_CONFIG>() &
|
||||
CL_FP_ROUND_TO_ZERO ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Round to +ve and infinity:\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SINGLE_FP_CONFIG>() &
|
||||
CL_FP_ROUND_TO_INF ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " IEEE754-2008 fused multiply-add:\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SINGLE_FP_CONFIG>() &
|
||||
CL_FP_FMA ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Cache type:\t\t\t\t\t " ;
|
||||
switch (device.getInfo<CL_DEVICE_GLOBAL_MEM_CACHE_TYPE>()) {
|
||||
case CL_NONE:
|
||||
std::cout << "None" << std::endl;
|
||||
break;
|
||||
case CL_READ_ONLY_CACHE:
|
||||
std::cout << "Read only" << std::endl;
|
||||
break;
|
||||
case CL_READ_WRITE_CACHE:
|
||||
std::cout << "Read/Write" << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
std::cout << " Cache line size:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Cache size:\t\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_GLOBAL_MEM_CACHE_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Global memory size:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_GLOBAL_MEM_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Constant buffer size:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max number of constant args:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_CONSTANT_ARGS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Local memory type:\t\t\t\t " ;
|
||||
switch (device.getInfo<CL_DEVICE_LOCAL_MEM_TYPE>()) {
|
||||
case CL_LOCAL:
|
||||
std::cout << "Scratchpad" << std::endl;
|
||||
break;
|
||||
case CL_GLOBAL:
|
||||
std::cout << "Global" << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
std::cout << " Local memory size:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_LOCAL_MEM_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
#if defined(CL_VERSION_2_0)
|
||||
if(vStrVal.compare("2") > 0)
|
||||
{
|
||||
std::cout << " Max pipe arguments:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_PIPE_ARGS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max pipe active reservations:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max pipe packet size:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PIPE_MAX_PACKET_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max global variable size:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max global variable preferred total size:\t "
|
||||
<< device.getInfo<CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max read/write image args:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max on device events:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_ON_DEVICE_EVENTS>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Queue on device max size:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Max on device queues:\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_MAX_ON_DEVICE_QUEUES>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Queue on device preferred size:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " SVM capabilities:\t\t\t\t " << std::endl;
|
||||
std::cout << " Coarse grain buffer:\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SVM_CAPABILITIES>() &
|
||||
CL_DEVICE_SVM_COARSE_GRAIN_BUFFER ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Fine grain buffer:\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SVM_CAPABILITIES>() &
|
||||
CL_DEVICE_SVM_FINE_GRAIN_BUFFER ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Fine grain system:\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SVM_CAPABILITIES>() &
|
||||
CL_DEVICE_SVM_FINE_GRAIN_SYSTEM ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Atomics:\t\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_SVM_CAPABILITIES>() &
|
||||
CL_DEVICE_SVM_ATOMICS ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred platform atomic alignment:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred global atomic alignment:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Preferred local atomic alignment:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT>()
|
||||
<< std::endl;
|
||||
}
|
||||
#endif // CL_VERSION_2_0
|
||||
|
||||
#if defined(CL_VERSION_1_1) && !defined(ATI_ARCH_ARM)
|
||||
if(vStrVal.compare("1.0") > 0)
|
||||
{
|
||||
cl_context_properties cps[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(*p)(), 0 };
|
||||
|
||||
std::vector<cl::Device> device;
|
||||
device.push_back(*i);
|
||||
|
||||
cl::Context context(device, cps, NULL, NULL, &err);
|
||||
if (err != CL_SUCCESS) {
|
||||
std::cerr << "Context::Context() failed (" << err << ")\n";
|
||||
return 1;
|
||||
}
|
||||
std::string kernelStr("__kernel void hello(){ size_t i = get_global_id(0); size_t j = get_global_id(1);}");
|
||||
cl::Program::Sources sources(1, std::make_pair(kernelStr.data(), kernelStr.size()));
|
||||
|
||||
cl::Program program = cl::Program(context, sources, &err);
|
||||
if (err != CL_SUCCESS) {
|
||||
std::cerr << "Program::Program() failed (" << err << ")\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
err = program.build(device);
|
||||
if (err != CL_SUCCESS) {
|
||||
|
||||
if(err == CL_BUILD_PROGRAM_FAILURE)
|
||||
{
|
||||
std::string str = program.getBuildInfo<CL_PROGRAM_BUILD_LOG>((*i));
|
||||
|
||||
std::cout << " \n\t\t\tBUILD LOG\n";
|
||||
std::cout << " ************************************************\n";
|
||||
std::cout << str.c_str() << std::endl;
|
||||
std::cout << " ************************************************\n";
|
||||
}
|
||||
|
||||
std::cerr << "Program::build() failed (" << err << ")\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
cl::Kernel kernel(program, "hello", &err);
|
||||
if (err != CL_SUCCESS) {
|
||||
std::cerr << "Kernel::Kernel() failed (" << err << ")\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::cout << " Kernel Preferred work group size multiple:\t "
|
||||
<< kernel.getWorkGroupInfo<CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE>((*i), &err)
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
#endif // CL_VERSION_1_1
|
||||
|
||||
std::cout << " Error correction support:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_ERROR_CORRECTION_SUPPORT>()
|
||||
<< std::endl;
|
||||
#ifdef CL_VERSION_1_1
|
||||
if(vStrVal.compare("1.0") > 0)
|
||||
{
|
||||
std::cout << " Unified memory for Host and Device:\t\t "
|
||||
<< device.getInfo<CL_DEVICE_HOST_UNIFIED_MEMORY>()
|
||||
<< std::endl;
|
||||
}
|
||||
#endif // CL_VERSION_1_1
|
||||
std::cout << " Profiling timer resolution:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PROFILING_TIMER_RESOLUTION>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Device endianess:\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_ENDIAN_LITTLE>() ? "Little" : "Big")
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Available:\t\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_AVAILABLE>() ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Compiler available:\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_COMPILER_AVAILABLE>() ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Execution capabilities:\t\t\t\t " << std::endl;
|
||||
std::cout << " Execute OpenCL kernels:\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_EXECUTION_CAPABILITIES>() &
|
||||
CL_EXEC_KERNEL ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Execute native function:\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_EXECUTION_CAPABILITIES>() &
|
||||
CL_EXEC_NATIVE_KERNEL ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Queue on Host properties:\t\t\t\t " << std::endl;
|
||||
std::cout << " Out-of-Order:\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_QUEUE_ON_HOST_PROPERTIES>() &
|
||||
CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Profiling :\t\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_QUEUE_ON_HOST_PROPERTIES>() &
|
||||
CL_QUEUE_PROFILING_ENABLE ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
|
||||
#ifdef CL_VERSION_2_0
|
||||
if(vStrVal.compare("2") > 0)
|
||||
{
|
||||
std::cout << " Queue on Device properties:\t\t\t\t " << std::endl;
|
||||
std::cout << " Out-of-Order:\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES>() &
|
||||
CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
std::cout << " Profiling :\t\t\t\t\t "
|
||||
<< (device.getInfo<CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES>() &
|
||||
CL_QUEUE_PROFILING_ENABLE ? "Yes" : "No")
|
||||
<< std::endl;
|
||||
}
|
||||
#endif
|
||||
|
||||
std::cout << " Platform ID:\t\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PLATFORM>()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Name:\t\t\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_NAME>().c_str()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Vendor:\t\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_VENDOR>().c_str()
|
||||
<< std::endl;
|
||||
#ifdef CL_VERSION_1_1
|
||||
if(vStrVal.compare("1.0") > 0)
|
||||
{
|
||||
std::cout << " Device OpenCL C version:\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_OPENCL_C_VERSION>().c_str()
|
||||
<< std::endl;
|
||||
}
|
||||
#endif // CL_VERSION_1_1
|
||||
std::cout << " Driver version:\t\t\t\t "
|
||||
<< device.getInfo<CL_DRIVER_VERSION>().c_str()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Profile:\t\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_PROFILE>().c_str()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << " Version:\t\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_VERSION>().c_str()
|
||||
<< std::endl;
|
||||
|
||||
|
||||
std::cout << " Extensions:\t\t\t\t\t "
|
||||
<< device.getInfo<CL_DEVICE_EXTENSIONS>().c_str()
|
||||
<< std::endl;
|
||||
|
||||
std::cout << std::endl << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (cl::Error err)
|
||||
{
|
||||
std::cerr
|
||||
<< "ERROR: "
|
||||
<< err.what()
|
||||
<< "("
|
||||
<< err.err()
|
||||
<< ")"
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
Fai riferimento in un nuovo problema
Block a user