blob: aad16a4ce593c1b71870f2ab5b6173098d0ca4f6 [file] [log] [blame]
/*
* Copyright (c) 2017, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is 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 Software.
*
* THE SOFTWARE IS 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 SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef CMRTLIB_LINUX_SHARE_CM_DEVICE_BASE_H_
#define CMRTLIB_LINUX_SHARE_CM_DEVICE_BASE_H_
#include "cm_def.h"
#include "cm_device_def.h"
class CmBuffer;
class CmSurface2D;
class CmProgram;
class CmKernel;
class CmTask;
class CmQueue;
class CmThreadSpace;
class CmThreadGroupSpace;
class CmBufferSVM;
class CmBufferUP;
class CmSurface2DUP;
class CmSurface3D ;
class CmSampler;
class CmSampler8x8;
class CmVebox;
class CmBufferStateless;
class SurfaceIndex;
class CmSurface2DStateless;
struct CM_SAMPLER_8X8_DESCR;
struct VME_STATE_G6;
//! \brief CmDevice class for Linux
class CmDevice
{
public:
//! \brief Creates a CmBuffer with specified size in bytes.
//! \details This function creates a buffer in video memory with linear
//! layout.
//! \param [in] size
//! Buffer size in bytes.
//! \param [out] buffer
//! Reference to the pointer to the CmBuffer.
//! \retval CM_SUCCESS if the CmBuffer is successfully created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 1D
//! surface fails.
//! \retval CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
//! larger than CM_MAX_1D_SURF_WIDTH.
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces
//! is exceeded. The amount is the amount of the surfaces
//! that can co-exist. The amount can be obtained by querying
//! the cap CAP_BUFFER_COUNT.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateBuffer(uint32_t size, CmBuffer* &buffer)=0;
//! \brief Creates a CmSurface2D with given width, height, and format.
//! \details This function creates a surface in video memory with a 2D layout.
//! User needs to provide width, height and format.
//! \param [in] width
//! Surface width in pixel.
//! \param [in] height
//! Surface height in pixel.
//! \param [in] format
//! Surface format.
//! \param [out] surface
//! Reference to the pointer to the CmSurface2D.
//! \retval CM_SUCCESS if the CmSurface2D is successfully created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_SURFACE_ALLOCATION_FAILURE if creating the underneath
//! resource fails.
//! \retval CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
//! larger than CM_MAX_2D_SURF_WIDTH, or for YUY2, or NV12
//! format, the width is odd.
//! \retval CM_INVALID_HEIGHT if height is less than CM_MIN_SURF_HEIGHT
//! or larger than CM_MAX_2D_SURF_HEIGHT, or for NV12 format,
//! the height is odd.
//! \retval CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not
//! supported. The supported formats can be obtained by
//! querying cap CAP_SURFACE2D_FORMAT_COUNT and
//! CAP_SURFACE2D_FORMATS. For now, the following formats are
//! supported: \n
//! CM_SURFACE_FORMAT_A8R8G8B8, \n
//! CM_SURFACE_FORMAT_X8R8G8B8, \n
//! CM_SURFACE_FORMAT_A8B8G8R8, \n
//! CM_SURFACE_FORMAT_R32F, \n
//! CM_SURFACE_FORMAT_V8U8, \n
//! CM_SURFACE_FORMAT_P8, \n
//! CM_SURFACE_FORMAT_YUY2, \n
//! CM_SURFACE_FORMAT_A8, \n
//! CM_SURFACE_FORMAT_NV12, \n
//! CM_SURFACE_FORMAT_P010, \n
//! CM_SURFACE_FORMAT_UYVY, \n
//! CM_SURFACE_FORMAT_IMC3, \n
//! CM_SURFACE_FORMAT_411P, \n
//! CM_SURFACE_FORMAT_422H, \n
//! CM_SURFACE_FORMAT_422V, \n
//! CM_SURFACE_FORMAT_444P, \n
//! CM_SURFACE_FORMAT_YV12, \n
//! CM_SURFACE_FORMAT_R8_UINT, \n
//! CM_SURFACE_FORMAT_R16_UINT, \n
//! CM_SURFACE_FORMAT_P208 \n
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
//! is exceeded. The amount is the amount of the surfaces that
//! can co-exist. The amount can be obtained by querying the
//! cap CAP_SURFACE2D_COUNT.
//! \retval CM_FAILURE otherwise.
//! \note For planar surface, there is only one CmSurface2D instance,
//! no matter how many planes the surface may have.
//! The detail about how to access different planes in the kernel
//! code can be found in CM Language Spec, looking for read_plane
//! and write_plane.
CM_RT_API virtual int32_t CreateSurface2D(uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, CmSurface2D* &surface) = 0;
//! \brief Creates a CmSurface3D with given width, height, depth and
//! pixel format.
//! \details This function creates a surface in memory with a 3D layout.
//! User needs to provide width, height, depth and format.
//! \param [in] width
//! Surface width.
//! \param [in] height
//! Surface height.
//! \param [in] depth
//! Surface depth.
//! \param [in] format
//! Surface format.
//! \param [out] surface
//! Reference to the pointer to the CmSurface3D.
//! \retval CM_SUCCESS if the CmSurface3D is successfully created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
//! larger than CM_MAX_3D_SURF_WIDTH.
//! \retval CM_INVALID_HEIGHT if height is less than CM_MIN_SURF_HEIGHT
//! or larger than CM_MAX_3D_SURF_HEIGHT.
//! \retval CM_INVALID_DEPTH if width is less than CM_MIN_SURF_DEPTH or
//! larger than CM_MAX_3D_SURF_DEPTH.
//! \retval CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not
//! supported. The supported formats can be obtained by
//! querying cap CAP_SURFACE3D_FORMAT_COUNT and
//! CAP_SURFACE3D_FORMATS, For now, only supports: \n
//! CM_SURFACE_FORMAT_X8R8G8B8, \n
//! CM_SURFACE_FORMAT_A8R8G8B8, \n
//! CM_SURFACE_FORMAT_A16B16G16R16. \n
//! \retval CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 3D
//! surface fails.
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 3D surfaces
//! is exceeded. The amount is the amount of the surfaces that
//! can co-exist. The amount can be obtained by querying the
//! cap CAP_SURFACE3D_COUNT.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateSurface3D(uint32_t width, uint32_t height, uint32_t depth, CM_SURFACE_FORMAT format, CmSurface3D* &surface) = 0;
//! \brief Creates a CmSurface2D from an existing VA surface.
//! \details The application must have created the VA surface using the
//! same VA device as the one used to create the CmDevice.
//! The VA surface format should be within the supported
//! format set which can be obtained by querying cap
//! CAP_SURFACE2D_FORMAT_COUNT and CAP_SURFACE2D_FORMATS. The
//! surface must be lockable is you want to use
//! CmSurface2D::ReadSurface and CmSurface2D::WriteSurface.
//! \param [in] vaSurfaceId
//! Surface ID of the VA surface.
//! \param [out] surface
//! Reference to the pointer to the CmSurface2D.
//! \retval CM_SUCCESS if the CmSurface2D are successfully created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
//! larger than CM_MAX_2D_SURF_WIDTH, or for YUY2, or NV12
//! format, the width is odd.
//! \retval CM_INVALID_HEIGHT if height is less than CM_MIN_SURF_HEIGHT
//! or larger than CM_MAX_2D_SURF_HEIGHT, or for NV12 format,
//! the height is odd.
//! \retval CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not
//! supported. The supported formats can be obtained by
//! querying cap CAP_SURFACE2D_FORMAT_COUNT and
//! CAP_SURFACE2D_FORMATS. For now, the following formats are
//! supported: \n
//! CM_SURFACE_FORMAT_A8R8G8B8, \n
//! CM_SURFACE_FORMAT_X8R8G8B8, \n
//! CM_SURFACE_FORMAT_A8B8G8R8, \n
//! CM_SURFACE_FORMAT_R32F, \n
//! CM_SURFACE_FORMAT_V8U8, \n
//! CM_SURFACE_FORMAT_P8, \n
//! CM_SURFACE_FORMAT_YUY2, \n
//! CM_SURFACE_FORMAT_A8, \n
//! CM_SURFACE_FORMAT_NV12, \n
//! CM_SURFACE_FORMAT_P010, \n
//! CM_SURFACE_FORMAT_UYVY, \n
//! CM_SURFACE_FORMAT_IMC3, \n
//! CM_SURFACE_FORMAT_411P, \n
//! CM_SURFACE_FORMAT_422H, \n
//! CM_SURFACE_FORMAT_422V, \n
//! CM_SURFACE_FORMAT_444P, \n
//! CM_SURFACE_FORMAT_YV12, \n
//! CM_SURFACE_FORMAT_R8_UINT, \n
//! CM_SURFACE_FORMAT_R16_UINT, \n
//! CM_SURFACE_FORMAT_P208 \n
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
//! is exceeded. The amount is the amount of the surfaces that
//! can co-exist. The amount can be obtained by querying the
//! cap CAP_SURFACE2D_COUNT.
//! \retval CM_FAILURE otherwise.
//! \note This API is in Linux only.
CM_RT_API virtual int32_t CreateSurface2D(VASurfaceID vaSurfaceId, CmSurface2D* &surface) = 0;
//! \brief Creates an array of CmSurface2D type surfaces from an
//! existing array of VA surfaces.
//! \details Surface in the VA surface array must be created by the
//! same VA device as the one that created CmDevice. It is
//! application's responsibility to allocate memory for the
//! array of pointers to CmSurface2D. The VA surface format
//! should be within the supported format set which can be
//! obtained by querying cap CAP_SURFACE2D_FORMAT_COUNT and
//! CAP_SURFACE2D_FORMATS. The surface must be lockable is you
//! want to use CmSurface2D::ReadSurface and
//! CmSurface2D::WriteSurface.
//! \param [in] vaSurfaceId
//! Pointer to the array of surface ID of VA surfaces.
//! \param [in] surfaceCount
//! Array size.
//! \param [out] surfaceArray
//! Pointer to the array of pointers pointing to CmSurface2D
//! objects.
//! \retval CM_SUCCESS if all CmSurface2D objects are successfully
//! created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_FAILURE otherwise.
//! \note This API is in Linux only.
CM_RT_API virtual int32_t CreateSurface2D(VASurfaceID* vaSurfaceId, const uint32_t surfaceCount, CmSurface2D **surfaceArray) = 0;
//! \brief Destroys CmBuffer object.
//! \details This function destroys CmBuffer object. After the function
//! is called, it will return immediately without waiting. If
//! there is any Enqueue is being executed when this function
//! is called, the actual destroy will be postponed internally
//! by the runtime, and user doens't need to worry about it.
//! \param [in,out] buffer
//! Reference to the pointer pointing to CmBuffer, it will be
//! assigned to nullptr after destroy.
//! \retval CM_SUCCESS if CmBuffer is successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroySurface(CmBuffer* &buffer) = 0;
//! \brief Destroys CmSurface2D type surface.
//! \details This function destroys CmSurface2D object. After the function
//! is called, it will return immediately without waiting. If
//! there is any Enqueue is being executed when this function is
//! called, the actual destroy will be postponed internally by
//! the runtime, and user doens't need to worry about it. One
//! exception is that if the CmSurface2D was created by a third
//! party VA surface, user has to keep the VA surface until the
//! kernel using it finishes execution.
//! \param [in,out] surface2d
//! Reference to the pointer pointing to CmSurface2D. It will
//! be assigned to nullptr after destroy.
//! \retval CM_SUCCESS if CmSurface2D is successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroySurface( CmSurface2D* &surface2d) = 0;
//! \brief Destroys CmSurface3D object.
//! \details This function destroys CmSurface3D object. After the
//! function is called, it will return immediately without
//! waiting. If there is any Enqueue is being executed when this
//! function is called, the actual destroy will be postponed
//! internally by the runtime, and user doens't need to worry
//! about it.
//! \param [in,out] surface3d
//! Reference to the pointer pointing to CmSurface3D. It will
//! be assigned to nullptr after destroy.
//! \retval CM_SUCCESS if CmSurface3D is successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroySurface( CmSurface3D* &surface3d) = 0;
//! \brief Creates a task queue corresponding to the render context.
//! \details CmQueue is an in-order queue of tasks. Each task is
//! essentially a CmTask object containing kernels that are to
//! be run concurrently. Each kernel can be executed with
//! multiple threads. Trying to create a second CmQueue will
//! return an existing object.
//! \param [in,out] queue
//! Reference to the pointer to the CmQueue.
//! \retval CM_SUCCESS if the CmQueue is successfully created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateQueue(CmQueue* &queue) = 0;
//! \brief Creates a CmProgram object consisting of kernels loaded from
//! the commonISACode code.
//! \details Common ISA code is offline generated as a file with a .isa suffix
//! by the CM compiler when it is used to compile one or more
//! kernels. It contains ISA code common for all Intel platforms.
//! Just-In-Time (JIT) compilation of the common ISA code happens in
//! LoadProgram and generates platform specific ISA according to the
//! actaully platform where the application in running in hardware mode.
//! In the emulation mode JIT doesn't happen.
//! In the simulation mode JIT doesn't happen but paltform specfic
//! ISA need to be offline generated together with common ISA by
//! CM compiler and to be included in commonISACode.
//! How to generate common ISA and platform specific ISA can be
//! found in CM compiler manual.
//! \param [in] commonISACode
//! Pointer pointing to code in common ISA.
//! \param [in] size
//! Size in bytes of the common ISA code.
//! \param [in,out] program
//! Reference to the pointer to the CmProgram.
//! \param [in] options
//! JIT options for all kernels in the code. This argument
//! is optional. Size of options should be no more than 512
//! (CM_MAX_OPTION_SIZE_IN_BYTE) bytes including the null
//! terminator. There is one option available currently: \n
//! "nojitter" -- Use this option to completely disable jitter
//! from occurring. NOTE: "/Qxcm_jit_tartget=%GEN_ARCH%"
//! flag must be set during offline compilation if "nojitter"
//! is set in hardware mode.
//! In simulation and emulation mode, this option is ignored.
//! \retval CM_SUCCESS if the CmProgram is successfully created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_INVALID_ARG_VALUE if invalid input parameters.
//! \retval CM_INVALID_GENX_BINARY if the GEN binary is not matched with
//! actual running platform in "nojitter" mode.
//! \retval CM_JIT_COMPILE_FAILURE if JIT compile of the common ISA
//! code fails.
//! \retval CM_INVALID_KERNEL_SPILL_CODE if kernel has spill code and
//! devcie's scratch memory space is disabled in
//! CreateCmDeviceEx.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t LoadProgram(void* commonISACode, const uint32_t size, CmProgram*& program, const char* options = nullptr) = 0;
//! \brief Creates a CmKernel object from the CmProgram object.
//! \details A Cmprogram can contains multiple kernels.
//! The size of all arguments of a kernel should be no more than
//! CAP_ARG_SIZE_PER_KERNEL byte. The number of all kernel
//! arguments should be no more than CAP_ARG_COUNT_PER_KERNEL.
//! The size of kernel binary should be no more than
//! CAP_KERNEL_BINARY_SIZE bytes. The kernelName should be no
//! more than 256 (CM_MAX_KERNEL_NAME_SIZE_IN_BYTE) bytes
//! including the null terminator.
//! \param [in] program
//! CmProgram object from which the kernel is created.
//! \param [in] kernelName
//! CM kernel function (genx_main) name. A CM_KERNEL_FUNCTION
//! macro MUST be used to specify this argument.
//! \param [in,out] kernel
//! Reference to the pointer to the CmKernel object.
//! \param [in] options
//! JIT options for this specific kernel, overwriting the JIT
//! options specified for all kernels in the CmProgram. This
//! argument is optional. Size of options should be no more
//! than 512 (CM_MAX_OPTION_SIZE_IN_BYTE) bytes including the
//! null terminator. No options available for now.
//! \retval CM_SUCCESS if the CmKernel is successfully created or
//! returned.
//! \retval CM_INVALID_ARG_VALUE if program is an invalid pointer.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_EXCEED_KERNEL_ARG_AMOUNT if the argument number of the
//! kernel fucntion is larger than CAP_ARG_COUNT_PER_KERNEL.
//! \retval CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE if the argument size of
//! the kernel fucntion is larger than CAP_ARG_SIZE_PER_KERNEL.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateKernel( CmProgram* program, const char* kernelName, CmKernel* & kernel, const char* options = nullptr) = 0;
//! \brief Creates a CmKernel object in emulation mode.
//! \details The size of all kernel arguments should be no more than
//! CAP_ARG_SIZE_PER_KERNEL byte. The number of all kernel
//! arguments should be no more than CAP_ARG_COUNT_PER_KERNEL.
//! The size of kernel binary should be no more than
//! CAP_KERNEL_BINARY_SIZE bytes. The kernelName should be no
//! more than 256 (CM_MAX_KERNEL_NAME_SIZE_IN_BYTE) bytes
//! including the null terminator.
//! \param [in] program
//! CmProgram from which the kernel is created.
//! \param [in] kernelName
//! CM kernel function (genx_main) name emulation mode also
//! needs a pointer to the kernel function. A
//! CM_KERNEL_FUNCTION macro MUST be used to specify this
//! argument to accommodate emulation modes.
//! \param [in] fncPnt
//! This API is for emulation mode only, and this parameter
//! is not necessarily controlled by user because the macro
//! CM_KERNEL_FUNCTION will be used to set this parameter.
//! \param [in,out] kernel
//! Reference to the pointer to the CmKernel object.
//! \param [in] options
//! JIT options for this specific kernel, overwriting the JIT
//! options specified for all kernels in the CmProgram. This
//! argument is optional. Size of options should be no more
//! than 512 (CM_MAX_OPTION_SIZE_IN_BYTE) bytes including the
//! null terminator. No options available for now.
//! \retval CM_SUCCESS if the CmKernel is successfully created or
//! returned.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_EXCEED_KERNEL_ARG_AMOUNT if the argument number of the
//! kernel fucntion is larger than CAP_ARG_COUNT_PER_KERNEL.
//! \retval CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE if the argument size of
//! the kernel fucntion is larger than CAP_ARG_SIZE_PER_KERNEL.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateKernel(CmProgram* program, const char* kernelName, const void * fncPnt, CmKernel* & kernel, const char* options = nullptr) = 0;
//! \brief Creates a CmSampler object.
//! \details This function creates a 3D sampler state object used to sample
//! a 2D surface.
//! \param [in] sampleState
//! Const reference to a CM_SAMPLER_STATE specifying the
//! characteristics of the sampler to be created. The structure
//! is defined below.
//! \param [out] sampler
//! Reference to the pointer to the CmSampler object.
//! \retval CM_SUCCESS if the CmSampler is successfully created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_EXCEED_SAMPLER_AMOUNT if maximum amount of sampler is
//! exceeded. The amount is the amount of the sampler that can
//! co-exist. The amount can be obtained by querying the cap
//! CAP_SAMPLER_COUNT.
//! \retval CM_FAILURE otherwise.
//! \note typedef struct _CM_SAMPLER_STATE\n
//! {\n
//! CM_TEXTURE_FILTER_TYPE minFilterType;\n
//! CM_TEXTURE_FILTER_TYPE magFilterType;\n
//! CM_TEXTURE_ADDRESS_TYPE addressU;\n
//! CM_TEXTURE_ADDRESS_TYPE addressV;\n
//! CM_TEXTURE_ADDRESS_TYPE addressW;\n
//! } CM_SAMPLER_STATE;\n
//!
//! For now, only linear and anisotropic filter types are
//! supported for hardware and simulation modes. For emulation
//! mode, linear filter type is supported. Wrap, mirror, and
//! clamp address types are supported in hardware and simulation modes.
//! only clamp address type is supported in emulation mode.
CM_RT_API virtual int32_t CreateSampler(const CM_SAMPLER_STATE &sampleState, CmSampler* &sampler) = 0;
//! \brief Destroy a CmKernel.
//! \details A CmKernel that is not destroyed by calling this function
//! will be destroyed when the CmDevice is destroyed.
//! \param [in,out] kernel
//! CmKernel object to be destroyed. It will be assigned to
//! nullptr once the fuction is return.
//! \retval CM_SUCCESS if the CmKernel is successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroyKernel(CmKernel* &kernel) = 0;
//! \brief Destroys a CmSampler.
//! \details A CmSampler that is not destroyed by calling this function
//! will be destroyed when the CmDevice is destroyed.
//! \param [in,out] sampler
//! A reference to the CmSampler pointer.
//! \retval CM_SUCCESS if the CmSampler is successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroySampler(CmSampler* &sampler) = 0;
//! \brief Destroys a CmProgram.
//! \details A CmProgram that is not destroyed by calling this function
//! will be destroyed when the CmDevice is destroyed.
//! \param [in,out] program
//! Reference to the pointer to the CmProgram. It will be assigned to
//! nullptr once the fuction is return.
//! \retval CM_SUCCESS if the CmProgram is successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroyProgram(CmProgram* &program) = 0;
//! \brief Destroys a CmThreadSpace instance.
//! \details A CmThreadSpace that is not destroyed by calling this
//! function will be destroyed when the CmDevice is destroyed.
//! \param [in,out] threadSpace
//! Reference to the pointer to the CmThreadSpace. It will be
//! assigned to nullptr once the fuction is return.
//! \retval CM_SUCCESS if the CmThreadSpace is successfully destroyed.
//! \retval CM_FAILURE if the input is nullptr or not valid.
CM_RT_API virtual int32_t DestroyThreadSpace( CmThreadSpace* &threadSpace) = 0;
//!
//! \brief Creates a CmTask object
//! \details This object is a container for one or multiple CmKernel objects, and used
//! to enqueue the kernels for concurrent execution.
//! \param [out] task Reference to the pointer to the CmTask
//! \retval CM_SUCCESS if the CmTask is successfully created
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory
//!
CM_RT_API virtual int32_t CreateTask(CmTask* &task) = 0;
//!
//! \brief Destroy a CmTask object
//! \details A CmTask that is not destroyed by calling this
//! function will be destroyed when the CmDevice is destroyed
//! \param [in, out] task Reference to the pointer to the CmTask.
//! \retval CM_SUCCESS if the CmTaskis successfully destroyed
//! \retval CM_FAILURE otherwise
//!
CM_RT_API virtual int32_t DestroyTask(CmTask* &task)=0;
//!
//! \brief This function can be used to get HW capability.
//! \details By calling this function, user can get the hardware capabilites
//! of running platform.
//! \param [in] capName Name of cap to query
//! \param [out] capValueSize Reference to the size in bytes of the Cap
//! value. On entry application should set this to the size
//! of memory allocated for the cap value. Application should
//! make sure this size is large enough to hold the Cap value
//! requested. On return from this function the actual size of
//! cap value is returned.
//! \param [out] capValue Pointer pointing to memory where the
//! cap value should be returned
//! \retval CM_SUCCESS if the input capValueSize equals or
//! is larger than required Cap size and Cap Value
//! is successfully returned
//! \retval CM_FAILURE otherwise
//!
//! \details
//! <table>
//! <tr>
//! <th>Cap Name</th>
//! <th>Size in bytes </th>
//! <th>Type of Value</th>
//! <th>Description</th>
//! </tr>
//! <tr>
//! <td>CAP_KERNEL_COUNT_PER_TASK</td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of kernels that can be enqueued in one task</td>
//! </tr>
//! <tr>
//! <td> CAP_KERNEL_BINARY_SIZE</td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td> Maximum kernel binary size in bytes</td>
//! </tr>
//! <tr>
//! <td> CAP_SAMPLER_COUNT</td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td> Maximum number of samplers that can co-exist at any time
//! in a CmDevice</td>
//! </tr>
//! <tr>
//! <td>CAP_SAMPLER_COUNT_PER_KERNEL </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of samplers that one kernel can use</td>
//! </tr>
//! <tr>
//! <td>CAP_BUFFER_COUNT </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of CmBuffer/CmBufferUP that can co - exist at any time </td>
//! </tr>
//! <tr>
//! <td> CAP_SURFACE2D_COUNT</td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of CmSurface2D that can co-exist at
//! any time </td>
//! </tr>
//! <tr>
//! <td>CAP_SURFACE3D_COUNT </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of CmSurface3D that can co-exist at any
//! time in a CmDevice </td>
//! </tr>
//! <tr>
//! <td>CAP_SURFACE_COUNT_PER_KERNEL </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of surfaces (including 1D, 2D and 3D) that
//! one kernel can use </td>
//! </tr>
//! <tr>
//! <td>CAP_ARG_COUNT_PER_KERNEL </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of arguments that a kernel can have </td>
//! </tr>
//! <tr>
//! <td>CAP_ARG_SIZE_PER_KERNEL </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum size of all arguments that a kernel can have </td>
//! </tr>
//! <tr>
//! <td>CAP_USER_DEFINED_THREAD_COUNT_PER_TASK </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of threads that all kernels of a task can
//! run, it's only used for media object usage </td>
//! </tr>
//! <tr>
//! <td>CAP_HW_THREAD_COUNT </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of threads that HW can run in parallel.This
//! indicates hardware parallelism and is hence one
//! of the factors indicating performance of the target machine </td>
//! </tr>
//! <tr>
//! <td>CAP_SURFACE2D_FORMAT_COUNT </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Number of surface formats supported for CmSurface2D creation </td>
//! </tr>
//! <tr>
//! <td>CAP_SURFACE2D_FORMATS </td>
//! <td>sizeof(VA_CM_FORMAT) * CAP_SURFACE2D_FORMAT_COUNT</td>
//! <td>Array of VA_CM_FORMAT</td>
//! <td>All Libva formats supported to create CmSurface2D </td>
//! </tr>
//! <tr>
//! <td>CAP_SURFACE3D_FORMAT_COUNT </td>
//! <td>sizeof(VA_CM_FORMAT) * CAP_SURFACE3D_FORMAT_COUNT</td>
//! <td>Array of VA_CM_FORMAT</td>
//! <td>Number of Libva formats supported for CmSurface3D creation </td>
//! </tr>
//! <tr>
//! <td>CAP_SURFACE3D_FORMATS </td>
//! <td>sizeof(VA_CM_FORMAT) * CAP_SURFACE3D_FORMAT_COUNT</td>
//! <td>Array of VA_CM_FORMAT</td>
//! <td>All Libva formats supported to create CmSurface3D </td>
//! </tr>
//! <tr>
//! <td>CAP_GPU_PLATFORM </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Return GPU platform as an enum of type GPU_PLATFORM
//! (PLATFORM_INTEL_BDW, PLATFORM_INTEL_SKL, etc) </td>
//! </tr>
//! <tr>
//! <td>CAP_GT_PLATFORM </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Return GT platform (SKU) as an enum of type GPU_GT_PLATFORM
//! (PLATFORM_INTEL_GT1, PLATFORM_INTEL_GT2, etc) </td>
//! </tr>
//! <tr>
//! <td>CAP_MIN_FREQUENCY </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Returns the minimum frequency of the GPU as an integer in MHz
//! </td>
//! </tr>
//! <tr>
//! <td>CAP_MAX_FREQUENCY </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Returns the maximum frequency of the GPU as an integer in MHz
//! </td>
//! </tr>
//! <tr>
//! <td>CAP_GPU_CURRENT_FREQUENCY </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Return the current frequency of the GPU as an integer
//! in MHz </td>
//! </tr>
//! <tr>
//! <td>CAP_USER_DEFINED_THREAD_COUNT_PER_TASK_NO_THREAD_ARG </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Returns the maximum thread count on media object without
//! per - thread argument </td>
//! </tr>
//! <tr>
//! <td>CAP_USER_DEFINED_THREAD_COUNT_PER_MEDIA_WALKER </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Returns the maximum thread count in media walker usage </td>
//! </tr>
//! <tr>
//! <td>CAP_USER_DEFINED_THREAD_COUNT_PER_THREAD_GROUP </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Returns the maximum thread count per thread group in
//! GPGPU walker usage </td>
//! </tr>
//! <tr>
//! <td>CAP_SURFACE2DUP_COUNT </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Maximum number of CmSurface2DUP that can
//! co - exist at any time </td>
//! </tr>
//! <tr>
//! <td>CAP_PLATFORM_INFO </td>
//! <td>sizeof(CM_PLATFORM_INFO)</td>
//! <td>CM_PLATFORM_INFO</td>
//! <td>EU information, like number of slice, number of subslice,
//! EU number per subslice, etc. See CM_PLATFORM_INFO. </td>
//! </tr>
//! <tr>
//! <td>CAP_MAX_BUFFER_SIZE </td>
//! <td>4</td>
//! <td>uint32_t</td>
//! <td>Returns maximum size in bytes for CmBuffer and CmBufferUP. </td>
//! </tr>
//! </table>
CM_RT_API virtual int32_t GetCaps(CM_DEVICE_CAP_NAME capName, size_t& capValueSize, void *capValue) = 0;
//! \brief Creates a CmThreadSpace object.
//! \details CmThreadSpace is a 2D space.Each unit is notated as
//! a pair of X/Y coordinates, which is in the range of [0, width -1]
//! or [0, heigh-1]. A thread space can define a dependency or no
//! dependency. A thread space can be used as per-task thread space
//! by passing it in Enqueue(), or be used as per-kernel thread space
//! by calling CmKernel::AssociateThreadSpace() API. Please
//! refer to "Host programming guide" for detailed thread space usages.
//! \param [in] width
//! Thread space width.
//! \param [in] height
//! Thread space height.
//! \param [out] threadSpace
//! Reference to pointer to CmThreadSpace object to be created.
//! \retval CM_SUCCESS if the CmThreadSpace is successfully created.
//! \retval CM_INVALID_THREAD_SPACE if the width or(and) height are
//! \retval invalid values (0 or exceeds maximum size).
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_FAILURE otherwise.
//! \note The maximum width/height allowed when using media walker is
//! 511 for pre-SKL and 2047 for SKL+. For media object the
//! maximum width/height allowed is 512.
CM_RT_API virtual int32_t CreateThreadSpace( uint32_t width, uint32_t height, CmThreadSpace* &threadSpace) = 0;
//! \brief Creates a CmBufferUP object.
//! \details This API creates a CmBufferUP object on top of the UP
//! (User Provided) system memory with specificed size in bytes.
//! The UP memory starting address must be page (4K Bytes) aligned.
//! \param [in] size
//! BufferUP size in bytes, the valid range is:
//! > CM_MIN_SURF_WIDTH, and < CM_MAX_1D_SURF_WIDTH.
//! \param [in] sysMem
//! Pointer to the system memory.
//! \param [out] buffer
//! Reference to the pointer to the CmBufferUP.
//! \retval CM_SUCCESS if the CmBufferUP is successfully created.
//! \retval CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 1D
//! surface fails.
//! \retval CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
//! larger than CM_MAX_1D_SURF_WIDTH.
//! \retval CM_INVALID_ARG_VALUE if sysMem is nullptr.
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces
//! is exceeded. The amount is the amount of the surfaces
//! that can co-exist. The amount can be obtained by
//! querying the cap CAP_BUFFER_COUNT.
//! \retval CM_FAILURE otherwise.
//! \note Application can access the memory though the memory
//! point from CPU; can also access the
//! buffer created upon the same memory from GPU. It is
//! application's responsibility to make
//! sure accesses from both sides are not overlapped.
//! \note Refer to "MDF Host Programming Guide" for detailed usages.
CM_RT_API virtual int32_t CreateBufferUP(uint32_t size, void *sysMem, CmBufferUP* &buffer)=0;
//! \brief Destroys CmBufferUP object.
//! \details The UP (User Provided) memory is still existing after the
//! CmBufferUP object is destroyed.
//! \param [in, out] buffer
//! Reference to the pointer pointing to CmBufferUP. It will be
//! assigned to nullptr once the function is returned.
//! \retval CM_SUCCESS if CmBufferUP is successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroyBufferUP(CmBufferUP* &buffer) = 0;
//! \brief Gets Surface2D allocation information by given width,
//! height, and format.
//! \details Gets necessary information in order to create and use
//! CmSurface2DUP.
//! To create CmSurface2DUP, user needs to allocated such
//! amount of system memory which equals to
//! or larger than physical size returned here. When
//! accessing the system memory, the user needs be
//! aware about pitch, which is equal to (pixel_width *
//! byte_per_pixel + necessary_padding).
//! \param [in] width
//! Width in pixel.
//! \param [in] height
//! height in pixel.
//! \param [in] format
//! pixel format.
//! \param [out] pitch
//! Reference to returned pitch.
//! \param [out] physicalSize
//! Reference to returned physical size.
//! \retval CM_SUCCESS always
CM_RT_API virtual int32_t GetSurface2DInfo( uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, uint32_t & pitch, uint32_t & physicalSize)= 0;
//! \brief Creates a CmSurface2DUP object.
//! \details Creates a CmSurface2DUP in UP (User Provided) system memory
//! with given surface width, height in pixel, and format.
//! The UP system memory must be page (4K Bytes) aligned.
//! The size of the system memory must larger than or equal to
//! the size return by GetSurface2DInfo().
//! \param [in] width
//! Width in pixel.
//! \param [in] height
//! Height in pixel.
//! \param [in] format
//! Format.
//! \param [in] sysMem
//! Reference to the pointer to the system memory which is CPU
//! accessible.
//! \param [out] surface
//! Reference to the pointer to the CmSurface2DUP.
//! \retval CM_SUCCESS if the CmSurface2DUPis successfully created.
//! \retval CM_INVALID_ARG_VALUE if sysMem is nullptr.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
//! larger than CM_MAX_2D_SURF_WIDTH, or for YUY2 or NV12
//! format, the width is odd.
//! \retval CM_INVALID_HEIGHT if height is less than CM_MIN_SURF_HEIGHT
//! or larger than CM_MAX_2D_SURF_HEIGHT, or for NV12 format,
//! the height is odd.
//! \retval CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not
//! supported. The supported formats can be obtained by
//! querying cap CAP_SURFACE2D_FORMAT_COUNT
//! and CAP_SURFACE2D_FORMATS.
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
//! is exceeded. The amount is the amount of the surfaces that
//! can co-exist. The amount can be obtained by
//! querying the cap CAP_SURFACE2D_COUNT.
//! \retval CM_SURFACE_ALLOCATION_FAILURE if allocation is failed.
//! \retval CM_FAILURE otherwise.
//! \note Application can access the memory though the memory point
//! returned from CPU; can also access the surface created
//! upon the same memory from GPU. It is application's
//! responsibility to make sure accesses from both sides are
//! not overlapped. When accessing the system memory from CPU,
//! the user needs to be aware about pitch, which is equal to
//! (pixel_width * byte_per_pixel + necessary_padding).
//! \note Refer to the CmSurface2DUP class for member APIs, and
//! 'MDF runtime host programming guide' for usages.
CM_RT_API virtual int32_t CreateSurface2DUP( uint32_t width, uint32_t height, CM_SURFACE_FORMAT format, void* sysMem, CmSurface2DUP* &surface)= 0;
//! \brief Destroys CmSurface2DUP surface.
//! \details The UP (User Provided) memory is still existing after the
//! CmSurface2DUP object is destroyed.
//! \param [in] surface
//! Reference to the pointer pointing to CmSurface2DUP. It will
//! be assigned to nullptr once this function is returned.
//! \retval CM_SUCCESS if CmSurface2DUPis successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroySurface2DUP( CmSurface2DUP* & surface) = 0;
//! \brief Creates a VME surface for AVC messages in kernel.
//! \details Creates a VME surface by using the given 2D surfaces:
//! the current frame, the forward frames and, the backward
//! frames. The last two can be nullptr if not used. The function
//! indicates these 2D surfaces are used for VME; no extra
//! surface is actually created. A SurfaceIndex object is created
//! instead, which is passed to CM kernel function (genx_main)
//! as argument to indicate the frame surface. Please see VME
//! examples in "MDF Host Programming Guide" document and CM
//! language specification for details.
//! \param [in] currentSurface
//! Pointer to current surface (can't be nullptr).
//! \param [in] forwardSurfaceArray
//! Array of forward surfaces (can be nullptr).
//! \param [in] backwardSurfaceArray
//! Array of backward surfaces (can be nullptr).
//! \param [in] surfaceCountForward
//! Count of forward surfaces, up to 16 forward surfaces can be
//! used.
//! \param [in] surfaceCountBackward
//! Count of backward surfaces, up to 16 backward surfaces can
//! be used.
//! \param [out] vmeSurfaceIndex
//! Reference to pointer to SurfaceIndex object to be created.
//! \retval CM_SUCCESS if the SurfaceIndex is successfully created.
//! \retval CM_NULL_POINTER if currentSurface is nullptr.
//! \retval CM_INVALID_ARG_VALUE if any parameter is not valid.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of VME surfaces
//! is exceeded. The amount is the amount of VME surfaces that
//! can co-exist. The amount can be obtained by querying the
//! cap CAP_VME_SURFACE_COUNT.
//! \retval CM_FAILURE otherwise.
//! \note This can be used for all Gen7_5 and plus platforms.
CM_RT_API virtual int32_t CreateVmeSurfaceG7_5 ( CmSurface2D* currentSurface, CmSurface2D** forwardSurfaceArray, CmSurface2D** backwardSurfaceArray, const uint32_t surfaceCountForward, const uint32_t surfaceCountBackward, SurfaceIndex* & vmeSurfaceIndex )=0;
//! \brief Destroy a VME surface object.
//! \details Any VME surface not destroyed by calling this function
//! explicitly will be destroyed when CmDevice is destroyed.
//! \param [in] vmeSurfaceIndex
//! Pointer to the SurfaceIndex of the VME surface. It will be
//! assigned to nullptr once destroy is done.
//! \retval CM_SUCCESS if the VME surface is successfully destroyed.
//! \retval CM_FAILURE otherwise.
//! \note This can be used for all Gen7_5 and plus platforms.
CM_RT_API virtual int32_t DestroyVmeSurfaceG7_5( SurfaceIndex* &vmeSurfaceIndex) = 0;
//! \brief Creates a CmSampler8x8 object.
//! \param [in] samplerDescriptor
//! Const reference to a CM_SAMPLER_8X8_DESCR specifying the
//! characteristics of the Sampler8x8 state to be created.
//! Currently, AVS, VA Convolve and VA Misc( including MinMax
//! Filter/Erode/Dilate ) states are supported.
//! \param [out] sampler
//! Reference to the pointer to the CmSampler8x8 object.
//! \retval CM_SUCCESS if the CmSampler8x8is successfully created.
//! \retval CM_INVALID_ARG_VALUE wrong sampler8x8 type.
//! \retval CM_EXCEED_SAMPLER_AMOUNT if the co-existed sampler exceeds
//! maximum count which can be queried by CAP_SAMPLER_COUNT cap.
CM_RT_API virtual int32_t CreateSampler8x8(const CM_SAMPLER_8X8_DESCR &samplerDescriptor,
CmSampler8x8* &sampler) = 0;
//! \brief Destroys a CmSampler8x8 object.
//! \details A CmSampler8x8 which is not destroyed by calling this
//! function will be destroyed when the CmDevice is destroyed.
//! \param [in, out] sampler
//! Reference to a sampler of CmSampler8x8. It will be assigned
//! to nullptr once destroy is done.
//! \retval CM_SUCCESS if the CmSampler8x8 is successfully destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroySampler8x8(CmSampler8x8* &sampler) = 0;
//! \brief Creates a CmSampler8x8 surface.
//! \details Creates a CmSampler8x8 surface by using the given 2D surface.
//! The function indicates the 2D surface is used for sampler
//! 8x8; no extra surface is actually created. A SurfaceIndex
//! object is created instead, which is passed to CM kernel
//! function (genx_main) as argument to indicate the surface
//! for sampler 8x8.
//! \param [in] surface2d
//! Pointer to CmSurface2D.
//! \param [out] surfaceIndex
//! Reference to pointer to SurfaceIndex.
//! \param [in] surfaceType
//! Enumeration data type of CM_SAMPLER8x8_SURFACE.
//! \param [in] addressControl
//! Enumeration data type of CM_SURFACE_ADDRESS_CONTROL_MODE.
//! \retval CM_SUCCESS if the CmSampler8x8 surface is successfully
//! created.
//! \retval CM_EXCEED_SURFACE_AMOUNT if there is too many co-existed
//! surfaces and exceed the maximum number. Destroying some
//! unused surfaces could solve this error.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateSampler8x8Surface(
CmSurface2D *surface2d,
SurfaceIndex* &surfaceIndex,
CM_SAMPLER8x8_SURFACE surfaceType = CM_VA_SURFACE,
CM_SURFACE_ADDRESS_CONTROL_MODE addressControl = CM_SURFACE_CLAMP) = 0;
//! \brief Destroys a CmSampler8x8 surface.
//! \details A CmSampler8x8 surface which is not destroyed by calling
//! this function will be destroyed when the CmDevice is
//! destroyed.
//! \param [in] surfaceIndex
//! Reference to SurfaceIndex. It will be assigned to nullptr
//! once destroy is done.
//! \retval CM_SUCCESS if the CmSampler8x8 surface is successfully
//! destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroySampler8x8Surface(SurfaceIndex* &surfaceIndex) = 0;
//! \brief Creates a 2-dimensional thread group space object.
//! \details This function creates a thread group space specified by the
//! height and width dimensions of the group space, and the
//! height and width dimensions of the thread space within a
//! group. This information is used to execute a kernel in GPGPU pipe
//! (https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-skl-vol07-3d_media_gpgpu.pdf).
//! Relevant sample code is shown in "MDF Host Programming Guide"
//! \param [in] threadSpaceWidth
//! width in unit of threads of each thread group.
//! \param [in] threadSpaceHeight
//! height in unit of threads of each thread group.
//! \param [in] groupSpaceWidth
//! width in unit of groups of thread group space.
//! \param [in] groupSpaceHeight
//! height in unit of groups of thread group space.
//! \param [out] threadGroupSpace
//! Reference to the pointer to CmThreadGroupSpace object to be
//! created.
//! \retval CM_SUCCESS if the CmThreadGroupSpace is successfully
//! created.
//! \retval CM_INVALID_THREAD_GROUP_SPACE if any input is 0 or the
//! threadSpaceWidth is more than MAX_THREAD_SPACE_WIDTH_PERGROUP,
//! or the threadSpaceHeight is more than
//! MAX_THREAD_SPACE_HEIGHT_PERGROUP.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE otherwise.
//! \note The total thread count is width*height*grpWidth*grpHeight.
//! CmKernel::SetThreadCount() calling is not necessary in this
//! GPGPU working mode. Currently, it's only used for SLM
//! enabled kernels. See also CreateThreadGroupSpaceEx() API which
//! specifies a 3-dimensional thread group space with width, height
//! and depth.
CM_RT_API virtual int32_t CreateThreadGroupSpace(
uint32_t threadSpaceWidth,
uint32_t threadSpaceHeight,
uint32_t groupSpaceWidth,
uint32_t groupSpaceHeight,
CmThreadGroupSpace* &threadGroupSpace) = 0;
//! \brief Destroys the created thread group space object.
//! \details Caller provides the reference of thread group space pointer
//! \param [in] threadGroupSpace
//! Pointer to a CmThreadGroupSpace. It will be assigned to
//! nullptr once destroy is done.
//! \retval CM_SUCCESS if the CmThreadGroupSpace pointer is
//! successfully destroyed.
//! \note User can call this API to explicitly destroy
//! CmThreadGroupSpace instance, otherwise, DestroyCmDevice()
//! takes care of all of such instances release.
CM_RT_API virtual int32_t DestroyThreadGroupSpace(CmThreadGroupSpace* &threadGroupSpace) = 0;
//! \brief Sets the configuration for L3 cache.
//! \details This API allows users to configure L3 cach by themselves.
//! \param [in] registerValues
//! L3ConfigRegisterValues contains the values of L3 control
//! registers. The registers are different from platform to
//! platform.\n
//! struct L3ConfigRegisterValues \n
//! { \n
//! \t unsigned int config_register0; \n
//! \t unsigned int config_register1; \n
//! \t unsigned int config_register2; \n
//! \t unsigned int config_register3; \n
//! }; \n
//! \retval CM_SUCCESS if the L3 configuration pointer is set correctly.
//! \retval CM_FAILURE if the platform does not support L3 or L3
//! configuration failed to be set.
//! \note This function is implemented for both hardware mode and
//! simulation mode.
CM_RT_API virtual int32_t
SetL3Config(const L3ConfigRegisterValues *registerValues) = 0;
//! \brief Sets the suggested configuration for L3 cache.
//! \param [in] configIndex
//! Index of suggested configuration plan. These configurations
//! are defined in ::L3_SUGGEST_CONFIG which is a enumeration
//! definition.
//! \retval CM_SUCCESS if the L3 configuration pointer is set correctly.
//! \retval CM_FAILURE if the platform does not support L3 or L3
//! configuration failed to be set.
//! \note This function is only implemented for hardware and
//! simulation modes.
CM_RT_API virtual int32_t SetSuggestedL3Config( L3_SUGGEST_CONFIG configIndex) = 0;
//! \brief This function can be used to set/limit hardware
//! capabilities- number of threads that HW can run in parallel
//! \details Hardware thread number can be set from 1 to maximum.
//! \param [in] capName
//! Name of cap to set.
//! \param [in] capValueSize
//! The size of the cap value.
//! \param [in] capValue
//! Pointer to the cap value.
//! \retval CM_SUCCESS if cap value is valid and is set correctly.
//! \retval CM_INVALID_HARDWARE_THREAD_NUMBER specific SetCaps error
//! message if cap value is not valid.
//! \retval CM_NOT_IMPLEMENTED for emulation mode.
//! \retval CM_FAILURE otherwise.
//! \note The following is the specific behavior for the cap value
//! that is being set.
//! <table>
//! <tr>
//! <th>Cap name< / th>
//! <th>Behavior< / th>
//! < / tr>
//! <tr>
//! <td>CAP_HW_THREAD_COUNT< / td>
//! <td>The number of hardware threads is per - task.A call
//! to the SetCaps function to set the CAP_HW_THREAD_COUNT
//! will limit the maximum number of hardware threads for
//! the ensuing call to Enqueue.After the call to Enqueue,
//! the maximum number of hardware threads will be restored
//! to its default value, which is determined by the
//! hardware's capability.
//! < / td>
//! < / tr>
//! < / table>
CM_RT_API virtual int32_t SetCaps(CM_DEVICE_CAP_NAME capName, size_t capValueSize, void* capValue) = 0;
//! \brief This function creates a sampler surface index by a given
//! CmSurface2D.
//! \details This sampler surface doesn't create any actual surface. It
//! just binds the actual 2D surface with a virtual sampler
//! surface index. User need pass this surface index as kernel
//! argument if the surface is used for sampler, otherwise,
//! the runtime will report error if user pass the 2D surface
//! index. For the 2D surface format, for now supports
//! following formats: \n
//! CM_SURFACE_FORMAT_A16B16G16R16 \n
//! CM_SURFACE_FORMAT_A16B16G16R16F \n
//! CM_SURFACE_FORMAT_R32G32B32A32F \n
//! CM_SURFACE_FORMAT_A8 \n
//! CM_SURFACE_FORMAT_A8R8G8B8 \n
//! CM_SURFACE_FORMAT_YUY2 \n
//! CM_SURFACE_FORMAT_R32F \n
//! CM_SURFACE_FORMAT_R32_UINT \n
//! CM_SURFACE_FORMAT_L16 \n
//! CM_SURFACE_FORMAT_R16G16_UNORM \n
//! CM_SURFACE_FORMAT_R16_FLOAT \n
//! CM_SURFACE_FORMAT_NV12 \n
//! CM_SURFACE_FORMAT_L8 \n
//! CM_SURFACE_FORMAT_AYUV \n
//! CM_SURFACE_FORMAT_Y410 \n
//! CM_SURFACE_FORMAT_Y416 \n
//! CM_SURFACE_FORMAT_Y210 \n
//! CM_SURFACE_FORMAT_Y216 \n
//! CM_SURFACE_FORMAT_P010 \n
//! CM_SURFACE_FORMAT_P016 \n
//! CM_SURFACE_FORMAT_YV12 \n
//! CM_SURFACE_FORMAT_411P \n
//! CM_SURFACE_FORMAT_411R \n
//! CM_SURFACE_FORMAT_IMC3 \n
//! CM_SURFACE_FORMAT_I420 \n
//! CM_SURFACE_FORMAT_422H \n
//! CM_SURFACE_FORMAT_422V \n
//! CM_SURFACE_FORMAT_444P \n
//! CM_SURFACE_FORMAT_P208 \n
//! CM_SURFACE_FORMAT_RGBP \n
//! CM_SURFACE_FORMAT_BGRP \n
//! \param [in] surface2d
//! Pointer to CmSurface2D object.
//! \param [out] samplerSurfaceIndex
//! Reference to the pointer to SurfaceIndex object to be
//! created.
//! \retval CM_SUCCESS if the new sampler surface index is successfully
//! created.
//! \retval CM_SURFACE_FORMAT_NOT_SUPPORTED if the input surface format
//! is not list above.
//! \retval CM_EXCEED_SURFACE_AMOUNT if the total number of
//! co-existed surfaces are exceed maximum count.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateSamplerSurface2D(
CmSurface2D* surface2d,
SurfaceIndex* &samplerSurfaceIndex) = 0;
//! \brief This function creates a sampler surface index by a given
//! CmSurface3D.
//! \details This function call doesn't create any actual surface. It
//! just binds the actual 3D surface with a virtual sampler
//! surface index. User need pass this surface index as kernel
//! argument if the surface is used for sampler, otherwise, the
//! runtime will report error if user pass the 3D surface
//! index. For the 3D surface format, for now only supports the
//! CM_SURFACE_FORMAT_A8R8G8B8 and CM_SURFACE_FORMAT_A16B16G16R16
//! formats.
//! \param [in] surface3d
//! Pointer to CmSurface3D object.
//! \param [out] samplerSurfaceIndex
//! Reference to the pointer to SurfaceIndex object to be
//! created.
//! \retval CM_SUCCESS if the sampler surface index is successfully
//! created.
//! \retval CM_SURFACE_FORMAT_NOT_SUPPORTED if the input surface format
//! is not list above.
//! \retval CM_EXCEED_SURFACE_AMOUNT if the total number of created
//! co-existed surfaces are exceed maximum count.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateSamplerSurface3D(
CmSurface3D* surface3d,
SurfaceIndex* &samplerSurfaceIndex) = 0;
//! \brief This function destroys a sampler surface index created by
//! CreateSamplerSurface2D(), CreateSamplerSurface2DUP, or
//! CreateSamplerSurface3D().
//! \details Caller provides the reference of a pointer to the surface
//! index needs t be destoryed.
//! \param [in] samplerSurfaceIndex
//! Reference to the pointer to SurfaceIndex object to be
//! destroyed.
//! \retval CM_SUCCESS if the sampler surface index is successfully
//! destroyed.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroySamplerSurface(
SurfaceIndex* & samplerSurfaceIndex) = 0;
//! \brief This function creates a buffer to store the message printed
//! by printf() in kernel side.
//! \details The default size of print buffer is 1M bytes. User can set
//! its size according to the length of message printed in
//! kernel and the number of threads. printf() can be used for
//! kernel debug purpose
//! \param [in] printbufsize
//! The size of print buffer in bytes.
//! \retval CM_SUCCESS if the print buffer is created successfully.
//! \retval CM_OUT_OF_HOST_MEMORY if print buffer allication is failed.
//! \retval CM_FAILURE otherwise.
//! \note Internally the print buffer occupies static buffer index 1,
//! thus only other 3 static buffers can be used by host (0, 2, 3)
//! if print functionality is enabled.
CM_RT_API virtual int32_t InitPrintBuffer(size_t printbufsize = CM_DEFAULT_PRINT_BUFFER_SIZE) = 0;
//! \brief This function prints the message on the standard display
//! device that are dumped by kernel.
//! \details It should be called after the task being finished. The
//! order of printf output is not deterministic due to thread
//! scheduling and the fact that different threads may be
//! interleaved. To distinguish which thread the printf string
//! comes from, it is better to print the thread id as the
//! first value. Alternatively you could always
//! put the printf inside if statement that limits the printf to a
//! given thread. If one task has more than one kernels call
//! printf() , their outputs could mix together.
//! \retval CM_SUCCESS if the buffer is flushed successfully.
//! \retval CM_FAILURE otherwise.
//! \note See also FlushPrintBufferIntoFile() which is a variant to
//! print message to a file.
CM_RT_API virtual int32_t FlushPrintBuffer() = 0;
//! \brief This function creates a VEBOX object for VEBOX
//! operations (https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-skl-vol09-media_vebox.pdf).
//! \details Caller provides a reference of CmVebox pointer to get the
//! CmVebox object created from this function.
//! \param [in, out] vebox
//! the created VEBOX object.
//! \retval CM_SUCCESS if creation is successfully.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateVebox(CmVebox* &vebox) = 0;
//! \brief This function destroys a VEBOX object.
//! \details Caller provides a reference of CmVebox pointer to destroy.
//! \param [in, out] vebox
//! The VEBOX object to be destroyed. It will be assigned to
//! nullptr once destroy is done.
//! \retval CM_SUCCESS if creation is successfully.
//! \retval CM_NULL_POINTER if the pVebox pointer is nullptr.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t DestroyVebox(CmVebox* & vebox) = 0;
//! \brief This function get the pointer to VADisplay.
//! \details Caller provides a reference of pointer to VADisplay.
//! \param [in,out] vaDisplay
//! A poniter of type VADisplay for Libva Surface
//! \retval CM_SUCCESS always.
//! \note This is Linux only API.
CM_RT_API virtual int32_t GetVaDpy(VADisplay* &vaDisplay) = 0;
//! \brief Create Libva Surface and wrap it as a CmSurface.
//! \details It is caller's responsibility to allocation memory for all
//! pointers to CmSurface2D.
//! \param [in] width
//! Surface's width
//! \param [in] height
//! Surface's height
//! \param [in] format
//! Surface's format
//! \param [out] vaSurfaceId
//! Reference to created VASurfaceID
//! \param [out] surface
//! Reference to pointer of created Cm Surface
//! \retval CM_SUCCESS if all CmSurface2D are successfully created
//! \retval CM_VA_SURFACE_NOT_SUPPORTED if libva surface creation fail
//! \retval CM_FAILURE otherwise.
//! \note This is a Linux only API.
CM_RT_API virtual int32_t CreateVaSurface2D(
uint32_t width,
uint32_t height,
CM_SURFACE_FORMAT format,
VASurfaceID &vaSurfaceId,
CmSurface2D* &surface) = 0;
//!
//! \brief It creates a CmBufferSVM of the specified size in bytes by
//! using the SVM (shared virtual memory) system memory.
//! (https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-skl-vol05-memory_views.pdf).
//! \details The SVM memory can be accessed by both CPU and GPU. The SVM
//! memory will be allocated in runtime internally(if user pass
//! nullptr pointer) or user provided (if user pass a valid
//! pointer). In both way, the memory should be page aligned
//! (4K bytes). And the staring address is returned.
//! \param [in] size
//! SVM buffer size in bytes.
//! \param [in,out] sysMem
//! Pointer to the SVM memory starting address.
//! \param [in] accessFlag
//! Buffer access flags.
//! \param [out] buffer
//! Reference to the pointer to the CmBufferSVM.
//! \retval CM_SUCCESS if the CmBufferSVM is successfully created.
//! \retval CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 1D
//! surface fails.
//! \retval CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
//! larger than CM_MAX_1D_SURF_WIDTH.
//! \retval CM_OUT_OF_HOST_MEMORY if runtime can't allocate such size
//! SVM memory.
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces
//! is exceeded. The amount is the amount of the surfaces that
//! can co-exist. The amount can be obtained by querying the
//! cap CAP_BUFFER_COUNT.
//! \retval CM_FAILURE otherwise.
//! \note This API is not implemented in Linux for now.
//!
CM_RT_API virtual int32_t CreateBufferSVM(uint32_t size,
void* &sysMem,
uint32_t accessFlag,
CmBufferSVM* &buffer) = 0;
//!
//! \brief Destroys CmBufferSVM object and associated SVM memory.
//! \param [in,out] buffer
//! Reference to the pointer pointing to CmBufferSVM, will be
//! assigned to nullptr once it is destroyed successfully.
//! \retval CM_SUCCESS if CmBufferSVM and associated SVM meory are
//! successfully destroyed.
//! \retval CM_FAILURE otherwise.
//!
CM_RT_API virtual int32_t DestroyBufferSVM( CmBufferSVM* &buffer) = 0;
//!
//! \brief This function creates a sampler surface index by a
//! CmSurface2DUP.
//! \details This sampler surface doesn't create any actual surface,
//! and just bind the actual 2D UP (User Provided) surface
//! with a virtual sampler surface index. User need pass this
//! surface index as kernel argument if the surface is used
//! for sampler, otherwise, the runtime will report error if
//! user pass the 2D UP surface index. For the 2DUP surface
//! formats, for now supports following formats: \n
//! CM_SURFACE_FORMAT_A16B16G16R16 \n
//! CM_SURFACE_FORMAT_A8 \n
//! CM_SURFACE_FORMAT_A8R8G8B8 \n
//! CM_SURFACE_FORMAT_YUY2 \n
//! CM_SURFACE_FORMAT_R32F \n
//! CM_SURFACE_FORMAT_R32_UINT \n
//! CM_SURFACE_FORMAT_L16 \n
//! CM_SURFACE_FORMAT_R16G16_UNORM \n
//! CM_SURFACE_FORMAT_NV12 \n
//! CM_SURFACE_FORMAT_L8 \n
//! CM_SURFACE_FORMAT_AYUV \n
//! CM_SURFACE_FORMAT_Y410 \n
//! CM_SURFACE_FORMAT_Y416 \n
//! CM_SURFACE_FORMAT_Y210 \n
//! CM_SURFACE_FORMAT_Y216 \n
//! CM_SURFACE_FORMAT_P010 \n
//! CM_SURFACE_FORMAT_P016 \n
//! CM_SURFACE_FORMAT_YV12 \n
//! CM_SURFACE_FORMAT_411P \n
//! CM_SURFACE_FORMAT_411R \n
//! CM_SURFACE_FORMAT_IMC3 \n
//! CM_SURFACE_FORMAT_I420 \n
//! CM_SURFACE_FORMAT_422H \n
//! CM_SURFACE_FORMAT_422V \n
//! CM_SURFACE_FORMAT_444P \n
//! CM_SURFACE_FORMAT_P208 \n
//! CM_SURFACE_FORMAT_RGBP \n
//! CM_SURFACE_FORMAT_BGRP \n
//! \param [in] surface2dUP
//! Pointer to CmSurface2DUP object.
//! \param [out] samplerSurfaceIndex
//! Reference to the pointer to SurfaceIndex object to be
//! created.
//! \retval CM_SUCCESS if the new sampler surface index is
//! successfully created.
//! \retval CM_NULL_POINTER if p2DUPSurface is nullptr.
//! \retval CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not supported.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE otherwise.
//! \note This API is supported for HW mode only.
//!
CM_RT_API virtual int32_t
CreateSamplerSurface2DUP(
CmSurface2DUP* surface2dUP,
SurfaceIndex* & samplerSurfaceIndex) = 0;
//!
//! \brief Copies the content of source kernel to a new kernel.
//! \param [out] destKernel
//! pointer to the destination kernel. The new pointer will be
//! returned to destKernel.
//! \param [in] srcKernel
//! pointer to the source kernel.
//! \retval CM_SUCCESS If the clone operation is successful.
//! \retval CM_FAILURE If the clone operation is failed.
//! \note This API is not supported in emulation mode.
//!
CM_RT_API virtual int32_t CloneKernel(CmKernel * &destKernel,
CmKernel *srcKernel) = 0;
//!
//! \brief Creates an alias to CmSurface2D.
//! \details Returns a new surface index for this surface. This API is
//! used with CmSurface2D::SetSurfaceStateParam in order
//! to reinterpret surface for different surface states,
//! i.e., the same memory is used but different width and
//! height can be programmed through the surface state.
//! \param [in] originalSurface
//! pointer to the surface used to create an alias.
//! \param [out] aliasSurfaceIndex
//! new surface index pointing to 2D surface.
//! \retval CM_SUCCESS if alias is created successfully.
//! \retval CM_INVALID_ARG_VALUE if p2DSurface is not a valid pointer.
//! \retval CM_MAX_NUM_2D_ALIASES if try to create more than 10 aliases
//! for same surface.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE otherwise.
//! \note This API is implemented for HW and SIM modes only.
//!
CM_RT_API virtual int32_t
CreateSurface2DAlias(CmSurface2D* originalSurface,
SurfaceIndex* &aliasSurfaceIndex) = 0;
//!
//! \brief Creates an HEVC VME surface by using the given 2D surfaces:
//! the current frame, the forward frames and, the backward
//! frames.
//! \details No extra surface is actually created. A SurfaceIndex
//! object is created instead, which is passed to CM kernel
//! function (genx_main) as argument to indicate the frame
//! surface. This can be used for Gen10 and plus platforms.
//! \param [in] currentSurface
//! Pointer to current surface (can't be nullptr).
//! \param [in] forwardSurfaceArray
//! Array of forward surfaces (can be nullptr if backward
//! surfaces not a nullptr).
//! \param [in] backwardSurfaceArray
//! Array of backward surfaces (can be nullptr if forward
//! surfaces not a nullptr).
//! \param [in] surfaceCountForward
//! Count of forward surfaces, up to 9 forward surfaces can
//! be used.
//! \param [in] surfaceCountBackward
//! Count of backward surfaces, up to 9 backward surfaces can
//! be used.
//! \param [out] vmeSurfaceIndex
//! Reference to pointer to SurfaceIndex object to be created.
//! \retval CM_SUCCESS if the SurfaceIndex is successfully created.
//! \retval CM_NULL_POINTER if currentSurface is nullptr.
//! \retval CM_INVALID_ARG_VALUE if invalid surface pointers for forward
//! and backward surfaces.
//! \retval CM_EXCEED_SURFACE_AMOUNT if there is too much co-existed
//! surfaces are created. Destroying unused surfaces to solve
//! such error.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_FAILURE otherwise.
//! \note This API is only supported for Gen10 and plus platforms.
//!
CM_RT_API virtual int32_t
CreateHevcVmeSurfaceG10(CmSurface2D* currentSurface,
CmSurface2D** forwardSurfaceArray,
CmSurface2D** backwardSurfaceArray,
const uint32_t surfaceCountForward,
const uint32_t surfaceCountBackward,
SurfaceIndex* & vmeSurfaceIndex) = 0;
//!
//! \brief Destroys an HEVC VME surface. This can be used for Gen10.
//! \param [in] vmeSurfaceIndex
//! Pointer to the SurfaceIndex of the VME surface. It will be
//! assigned to nullptr once destroy is done.
//! \retval CM_SUCCESS if the HEVC VME surface is successfully destroyed
//! \retval CM_FAILURE otherwise.
//! \note This API is only supported for Gen10 and plus platforms. \n
//! Any HEVC VME surface not destroyed by calling this function
//! explicitly will be destroyed when CmDevice is destroyed.
//!
CM_RT_API virtual int32_t
DestroyHevcVmeSurfaceG10(SurfaceIndex* & vmeSurfaceIndex) = 0;
//!
//! \brief Creates a CmSampler object with border color setting.
//! \param [in] sampleState
//! Const reference to a CM_SAMPLER_STATE_EX specifying the
//! characteristics of the sampler to be created.
//! \param [out] sampler
//! Reference to the pointer to the CmSampler object.
//! \retval CM_SUCCESS if the CmSampler is successfully created.
//! \retval CM_OUT_OF_HOST_MEMORY if out of system memory.
//! \retval CM_EXCEED_SAMPLER_AMOUNT if maximum amount of sampler is
//! exceeded. The amount is the amount of the sampler that can
//! co-exist. The amount can be obtained by querying the cap
//! CAP_SAMPLER_COUNT.
//! \retval CM_FAILURE otherwise.
//! \note This API is not implemented for EMU mode. \n Point, linear,
//! and anisotropic filter types are supported for hardware and
//! simulation modes. \n Wrap, mirror, clamp and border are
//! supported in hardware and simulation modes. Clamp is
//! supported in emulation mode.
//!
CM_RT_API virtual int32_t
CreateSamplerEx(const CM_SAMPLER_STATE_EX & sampleState,
CmSampler* &sampler) = 0;
//!
//! \brief This function prints the message dumped by kernel into file
//! instead of stdout.
//! \details This function's usage is the same as
//! CmDevice::FlushPrintBuffer(). It is recommended to use this
//! interface when there are tons of messages from kernel.
//! \param [in] filename
//! name of file the message printed into.
//! \retval CM_SUCCESS if the buffer is flushed successfully into file.
//! \retval CM_FAILURE otherwise.
//! \note This is API is supported in hardware mode. See also
//! FlushPrintBuffer().
//!
CM_RT_API virtual int32_t FlushPrintBufferIntoFile(const char *filename) = 0;
//!
//! \brief This function creates a 3-dimensional thread group space specified by the
//! depth, height and width dimensions of the group space, and
//! the depth, the height and width dimensions of the thread
//! space within a group.
//! \details This information is used to execute a kernel in GPGPU pipe
//! (https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-skl-vol07-3d_media_gpgpu.pdf).
//! \param [in] threadSpaceWidth
//! width in unit of threads of each thread group.
//! \param [in] threadSpaceHeight
//! height in unit of threads of each thread group.
//! \param [in] threadSpaceDepth
//! Depth in unit of threads of each thread group.
//! \param [in] groupSpaceWidth
//! width in unit of groups of thread group space.
//! \param [in] groupSpaceHeight
//! height in unit of groups of thread group space.
//! \param [in] groupSpaceDepth
//! Depth in unit of groups of thread group space.
//! \param [out] threadGroupSpace
//! Reference to the pointer to CmThreadGroupSpace object to be
//! created.
//! \retval CM_SUCCESS if the CmThreadGroupSpace is successfully created.
//! \retval CM_INVALID_THREAD_GROUP_SPACE if any input is 0 or the
//! threadSpaceWidth is more than MAX_THREAD_SPACE_WIDTH_PERGROUP,
//! or the threadSpaceHeight is more than
//! MAX_THREAD_SPACE_HEIGHT_PERGROUP.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE otherwise.
//! \note The total thread count is
//! width*height*depth*grpWidth*grpHeight*grpDepth.
//! The function need to be called when Z dimension
//! is larger than 1. when thrdSpaceDepth is 1 and grpSpaceDepth
//! is 1, it is equivalent to call function
//! CmDevice::CreateThreadGroupSpace(uint32_t threadSpaceWidth, uint32_t
//! threadSpaceHeight, uint32_t groupSpaceWidth, uint32_t groupSpaceHeight,
//! CmThreadGroupSpace* &threadGroupSpace). \n
//! See also CmDevice::CreateThreadGroupSpace().
//!
CM_RT_API virtual int32_t
CreateThreadGroupSpaceEx(uint32_t threadSpaceWidth,
uint32_t threadSpaceHeight,
uint32_t threadSpaceDepth,
uint32_t groupSpaceWidth,
uint32_t groupSpaceHeight,
uint32_t groupSpaceDepth,
CmThreadGroupSpace* &threadGroupSpace) = 0;
//!
//! \brief Creates a CmSampler8x8 surface by using given 2D surface
//! and given flags.
//! \details The function indicates the 2D surface is used for sampler
//! 8x8; no extra surface is actually created. A SurfaceIndex
//! object is created instead, which is passed to CM kernel
//! function(genx_main) as argument to indicate the surface for
//! sampler 8x8. Compared to CmDeive::CreateSampler8x8Surface,
//! this API is used to support rotation and chroma siting for
//! MediaSampler.
//! \param [in] surface
//! Pointer to CmSurface2D.
//! \param [out] surfaceIndex
//! Reference to pointer to SurfaceIndex.
//! \param [in] surfaceType
//! Enumeration data type of CM_SAMPLER8x8_SURFACE.
//! \param [in] addressControl
//! Enumeration data type of CM_SURFACE_ADDRESS_CONTROL_MODE.
//! \param [in] flag
//! Pointer to CM_FLAG.
//! \retval CM_SUCCESS if the CmSampler8x8 surface is successfully
//! created.
//! \retval CM_EXCEED_SURFACE_AMOUNT if there is too many co-existed
//! surfaces and exceed the maximum number. Destroying some
//! unused surfaces could solve this error.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory
//! \retval CM_FAILURE otherwise.
//! \note This API is not supported in emulation mode.
//!
CM_RT_API virtual int32_t CreateSampler8x8SurfaceEx(
CmSurface2D *surface,
SurfaceIndex* &surfaceIndex,
CM_SAMPLER8x8_SURFACE surfaceType,
CM_SURFACE_ADDRESS_CONTROL_MODE addressControl = CM_SURFACE_CLAMP,
CM_FLAG *flag = nullptr) = 0;
//!
//! \brief Create sampler surface by using given 2D surface and flags.
//! \details This sampler surface does't create any actual surface, and
//! just bind the actual 2D surface with a virtual sampler
//! surface index. User need pass this surface index as kernel
//! argument if the surface is used for sampler, otherwise,
//! the runtime will report error if user pass the 2D surface
//! index. Compared to CmDevice::CreateSampler8x8Surface, this
//! API is used to support rotation for 3D sampler. For given
//! surface's formats, for now, we support following: \n
//! CM_SURFACE_FORMAT_A16B16G16R16 \n
//! CM_SURFACE_FORMAT_A16B16G16R16F \n
//! CM_SURFACE_FORMAT_R32G32B32A32F \n
//! CM_SURFACE_FORMAT_A8 \n
//! CM_SURFACE_FORMAT_A8R8G8B8 \n
//! CM_SURFACE_FORMAT_YUY2 \n
//! CM_SURFACE_FORMAT_R32F \n
//! CM_SURFACE_FORMAT_R32_UINT \n
//! CM_SURFACE_FORMAT_L16 \n
//! CM_SURFACE_FORMAT_R16G16_UNORM \n
//! CM_SURFACE_FORMAT_R16_FLOAT \n
//! CM_SURFACE_FORMAT_NV12 \n
//! CM_SURFACE_FORMAT_L8 \n
//! CM_SURFACE_FORMAT_AYUV \n
//! CM_SURFACE_FORMAT_Y410 \n
//! CM_SURFACE_FORMAT_Y416 \n
//! CM_SURFACE_FORMAT_Y210 \n
//! CM_SURFACE_FORMAT_Y216 \n
//! CM_SURFACE_FORMAT_P010 \n
//! CM_SURFACE_FORMAT_P016 \n
//! CM_SURFACE_FORMAT_YV12 \n
//! CM_SURFACE_FORMAT_411P \n
//! CM_SURFACE_FORMAT_411R \n
//! CM_SURFACE_FORMAT_IMC3 \n
//! CM_SURFACE_FORMAT_I420 \n
//! CM_SURFACE_FORMAT_422H \n
//! CM_SURFACE_FORMAT_422V \n
//! CM_SURFACE_FORMAT_444P \n
//! CM_SURFACE_FORMAT_P208 \n
//! CM_SURFACE_FORMAT_RGBP \n
//! CM_SURFACE_FORMAT_BGRP \n
//! \param [in] surface2d
//! Pointer to CmSurface2D object.
//! \param [out] samplerSurfaceIndex
//! Reference to the pointer to SurfaceIndex object to be
//! created.
//! \param [in] flag
//! Pointer to CM_FLAG.
//! \retval CM_SUCCESS if the new sampler surface index is
//! successfully created.
//! \retval CM_SURFACE_FORMAT_NOT_SUPPORTED if the input surface format
//! is not list above.
//! \retval CM_EXCEED_SURFACE_AMOUNT if the total number of created
//! co-existed surfaces are exceed maximum count.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE otherwise.
//! \note This API is not supported in emulation mode.
//!
CM_RT_API virtual int32_t
CreateSamplerSurface2DEx(CmSurface2D* surface2d,
SurfaceIndex* & samplerSurfaceIndex,
CM_FLAG* flag = nullptr) = 0;
//! \brief Create an alias to CmBuffer.
//! \details Returns a new surface index for this surface. This API is
//! used with CmBuffer::SetSurfaceStateParam in order
//! to reinterpret buffer for different surface states,
//! i.e., the same memory is used but different size
//! can be programmed through the surface state.
//! \param [in] originalBuffer
//! pointer to CmBuffer object used to create an alias.
//! \param [out] aliasIndex
//! \retval CM_SUCCESS if alias is created successfully.
//! new surface index pointing to CmBuffer.
//! \retval CM_EXCEED_MAX_NUM_BUFFER_ALIASES if try to create more
//! than 10 aliases for same surface.
//! \retval CM_OUT_OF_HOST_MEMORY if out of host memory.
//! \retval CM_FAILURE if alias cannot be created.
//! \note This API is not implemented for EMU mode.
//!
CM_RT_API virtual int32_t CreateBufferAlias(CmBuffer *originalBuffer,
SurfaceIndex* &aliasIndex) = 0;
//! \brief Set the width and height values in the VME surface state.
//! \param [in] vmeIndex
//! Pointer to VME surface index.
//! \param [in] surfStateParam
//! Pointer to CM_VME_SURFACE_STATE_PARAM to set width and
//! height of this surface
//! \retval CM_SUCCESS if setting VME surface state values successfully.
//! \retval CM_INVALID_ARG_VALUE if invalid input.
//! \note This API will work on HW and SIM modes.
//!
CM_RT_API virtual int32_t
SetVmeSurfaceStateParam(SurfaceIndex* vmeIndex,
CM_VME_SURFACE_STATE_PARAM *surfStateParam) = 0;
//!
//! \brief Gets the VISA version up-to which IGC supports.
//! \param [out] majorVersion
//! The major Version of VISA.
//! \param [out] minorVersion
//! The minor Version of VISA.
//! \retval CM_SUCCESS if get the right VISA version.
//! \retval CM_JITDLL_LOAD_FAILURE if loading igc library is failed.
//! \retval CM_FAILURE otherwise.
//! \note This API is implemented in hardware mode only.
//!
CM_RT_API virtual int32_t GetVISAVersion(uint32_t& majorVersion,
uint32_t& minorVersion) = 0;
//!
//! \brief Creates a CmQueue object with option.
//! \param [out] queue
//! Pointer to the CmQueue object created.
//! \param [in] createOption
//! The option to create a queue. The sturcture of the
//! <b>QueueCreateOption</b> is:\n
//! \code
//! struct CM_QUEUE_CREATE_OPTION
//! {
//! CM_QUEUE_TYPE QueueType : 3;
//! bool RAMode : 1;
//! unsigned int Reserved0 : 3;
//! bool UserGPUContext : 1;
//! unsigned int GPUContext : 8;
//! CM_QUEUE_SSEU_USAGE_HINT_TYPE SseuUsageHint : 3;
//! unsigned int Reserved1 : 1;
//! unsigned int Reserved2 : 12;
//! }
//! \endcode
//! \n
//! <b>QueueType</b> indicates which engine the queue will be created for:\n
//! \code
//! enum CM_QUEUE_TYPE
//! {
//! CM_QUEUE_TYPE_NONE = 0,
//! CM_QUEUE_TYPE_RENDER = 1,
//! CM_QUEUE_TYPE_COMPUTE = 2
//! };
//! \endcode
//! \n
//! <b>RAMode</b> decides if the queue will occupy GPU
//! exclusively during execution.
//! \n
//! <b>UserGPUContext</b> indicates whether a existed GPU context is passed
//! by user via below GPUContext field.
//! \n
//! <b>GPUContext</b> indicates GPU context passed by user.
//! \n
//! <b>SseuUsageHint</b> indicates SSEU setting, will be created for:\n
//! \code
//! enum CM_QUEUE_SSEU_USAGE_HINT_TYPE
//! {
//! CM_QUEUE_SSEU_USAGE_HINT_DEFAULT = 0,
//! CM_QUEUE_SSEU_USAGE_HINT_VME = 1
//! };
//! \endcode
//! \n
//! \retval CM_SUCCESS if the CmQueue object is created.
//! \note This API is implemented in hardware mode only. Only
//! CM_QUEUE_TYPE_RENDER and CM_QUEUE_TYPE_COMPUTE are
//! implemented at this moment.
//!
CM_RT_API virtual int32_t
CreateQueueEx(CmQueue *&queue,
CM_QUEUE_CREATE_OPTION createOption) = 0;
//!
//! \brief It creates a CmBufferStateless of the specified size in bytes by
//! using the vedio memory or the system memory.
//! \details The stateless buffer means it is stateless-accessed by GPU. There
//! are two ways to create a stateless buffer. One is to create from
//! vedio memory, then it can be only accessed by GPU. The other way is
//! to create from system memory, then it can be accessed by both GPU
//! and CPU. In this way, The system memory will be allocated in runtime
//! internally(if user pass nullptr pointer) or user provided (if user
//! pass a valid pointer). And the system memory should be page aligned
//! (4K bytes).
//! \param [in] size
//! Stateless buffer size in bytes.
//! \param [in] option
//! Stateless buffer create option.
//! \param [in] sysMem
//! Pointer to user provided system memory if option is system memory.
//! \param [out] pSurface
//! Reference to the pointer to the CmBufferStateless.
//! \retval CM_SUCCESS if the CmBufferStateless is successfully created.
//! \retval CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 1D
//! surface fails.
//! \retval CM_OUT_OF_HOST_MEMORY if runtime can't allocate such size
//! system memory.
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces
//! is exceeded. The amount is the amount of the surfaces that
//! can co-exist. The amount can be obtained by querying the
//! cap CAP_BUFFER_COUNT.
//! \retval CM_INVALID_CREATE_OPTION_FOR_BUFFER_STATELESS if option is invalid.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t CreateBufferStateless(size_t size,
uint32_t option,
void *sysMem,
CmBufferStateless *&buffer) = 0;
//!
//! \brief Destroy CmBufferStateless object and associated vedio/system memory.
//! \param [in,out] pSurface
//! Reference to the pointer pointing to CmBufferStateless, will be
//! assigned to nullptr once it is destroyed successfully.
//! \retval CM_SUCCESS if CmBufferStateless and associated vedio/system memory are
//! successfully destroyed.
//! \retval CM_FAILURE otherwise.
//!
CM_RT_API virtual int32_t DestroyBufferStateless(CmBufferStateless* &buffer) = 0;
CM_RT_API virtual int32_t DispatchTask() = 0;
//!
//! \brief It creates a CmSurface2DStateless of the specified width, height and
//! pitch in bytes by using the vedio memory.
//! \details The stateless surface means it is stateless-accessed by GPU. It is
//! created from vedio memory, and can be only accessed by GPU.
//! \param [in] width
//! Surface width in bytes.
//! \param [in] width
//! Surface height in bytes.
//! \param [out] pitch
//! Surface pitch in bytes.
//! \param [out] pSurface
//! Reference to the pointer to the CmSurface2DStateless.
//! \retval CM_SUCCESS if the CmSurface2DStateless is successfully created.
//! \retval CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 2D
//! surface fails.
//! \retval CM_OUT_OF_HOST_MEMORY if runtime can't allocate such size
//! system memory.
//! \retval CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
//! is exceeded. The amount is the amount of the surfaces that
//! can co-exist. The amount can be obtained by querying the
//! cap CAP_SURFACE2D_COUNT.
//! \retval CM_FAILURE otherwise.
CM_RT_API virtual int32_t
CreateSurface2DStateless(uint32_t width,
uint32_t height,
uint32_t &pitch,
CmSurface2DStateless *&pSurface) = 0;
//!
//! \brief Destroy CmSurface2DStateless object and associated vedio memory.
//! \param [in,out] pSurface
//! Reference to the pointer pointing to CmSurface2DStateless, will be
//! assigned to nullptr once it is destroyed successfully.
//! \retval CM_SUCCESS if CmSurface2DStateless and associated vedio memory are
//! successfully destroyed.
//! \retval CM_FAILURE otherwise.
//!
CM_RT_API virtual int32_t DestroySurface2DStateless(CmSurface2DStateless *&pSurface) = 0;
protected:
virtual ~CmDevice() = default;
};
#endif // #ifndef CMRTLIB_LINUX_SHARE_CM_DEVICE_BASE_H_