• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (c) 2007-2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file      cm_device.h
24 //! \brief     Contains CmDevice declarations.
25 //!
26 
27 #ifndef MEDIADRIVER_LINUX_COMMON_CM_CMDEVICE_H_
28 #define MEDIADRIVER_LINUX_COMMON_CM_CMDEVICE_H_
29 
30 #include "cm_def.h"
31 #include "mos_os.h"
32 
33 namespace CMRT_UMD
34 {
35 class CmQueue;
36 class CmKernel;
37 class CmThreadSpace;
38 class CmThreadGroupSpace;
39 class CmVebox;
40 class CmSampler;
41 class CmEvent;
42 class CmTask;
43 class CmProgram;
44 class CmBuffer;
45 class CmBufferUP;
46 class CmBufferSVM;
47 class CmSurface2D;
48 class CmSurface2DUP;
49 class CmSurface2DUPRT;
50 class CmSurface3D;
51 class CmSampler8x8;
52 class CmBufferStateless;
53 
54 //! \brief  CmDevice class \@UMD for Linux
55 class CmDevice
56 {
57 public:
58     //!
59     //! \brief      Creates a CmBuffer with specified size in bytes.
60     //! \details    This function creates a buffer in video memory with linear
61     //!             layout.
62     //! \param      [in] size
63     //!             Buffer size in bytes.
64     //! \param      [out] surface
65     //!             Reference to the pointer to the CmBuffer.
66     //! \retval     CM_SUCCESS if the CmBuffer is successfully created.
67     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
68     //! \retval     CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 1D
69     //!             surface fails.
70     //! \retval     CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
71     //!             larger than CM_MAX_1D_SURF_WIDTH.
72     //! \retval     CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces
73     //!             is exceeded. The amount is the amount of the surfaces
74     //!             that can co-exist. The amount can be obtained by querying
75     //!             the cap CAP_BUFFER_COUNT.
76     //! \retval     CM_FAILURE otherwise.
77     //!
78     CM_RT_API virtual int32_t CreateBuffer(uint32_t size,
79                                            CmBuffer* &surface) = 0;
80 
81     //!
82     //! \brief    Creates a CmBuffer from an existing MOS Resource.
83     //! \details  CmBuffer is a wrapper of that MOS resource. This Mos resource is
84     //!            owned by caller.
85     //! \param    [in] mosResource
86     //!           pointer to MOS resource.
87     //! \param    [in,out] surface
88     //!           reference to pointer of surface to be created.
89     //! \retval   CM_SUCCESS if the CmBuffer is successfully created.
90     //! \retval   CM_INVALID_MOS_RESOURCE_HANDLE if mosResource is nullptr.
91     //! \retval   CM_OUT_OF_HOST_MEMORY if out of system memory
92     //! \retval   CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces is exceeded.
93     //! \retval   CM_FAILURE otherwise
94     //!
95     CM_RT_API virtual int32_t CreateBuffer(PMOS_RESOURCE mosResource,
96                                            CmBuffer* &surface) = 0;
97 
98     //!
99     //! \brief      Creates a CmSurface2D with given width, height, and format.
100     //! \details    This function creates a surface in video memory with a 2D layout.
101     //!             User needs to provide width, height and format.
102     //! \param      [in] width
103     //!             Surface width in pixel.
104     //! \param      [in] height
105     //!             Surface height in pixel.
106     //! \param      [in] format
107     //!             Surface format.
108     //! \param      [out] surface
109     //!             Reference to the pointer to the CmSurface2D.
110     //! \retval     CM_SUCCESS if the CmSurface2D is successfully created.
111     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
112     //! \retval     CM_SURFACE_ALLOCATION_FAILURE if creating the underneath
113     //!             resource fails.
114     //! \retval     CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
115     //!             larger than CM_MAX_2D_SURF_WIDTH, or for YUY2, or NV12
116     //!             format, the width is odd.
117     //! \retval     CM_INVALID_HEIGHT if height is less than CM_MIN_SURF_HEIGHT
118     //!             or larger than CM_MAX_2D_SURF_HEIGHT, or for NV12 format,
119     //!             the height is odd.
120     //! \retval     CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not
121     //!             supported. The supported formats can be obtained by
122     //!             querying cap CAP_SURFACE2D_FORMAT_COUNT and
123     //!             CAP_SURFACE2D_FORMATS. For now, the following formats are
124     //!             supported: \n
125     //!             CM_SURFACE_FORMAT_A8R8G8B8, \n
126     //!             CM_SURFACE_FORMAT_X8R8G8B8, \n
127     //!             CM_SURFACE_FORMAT_A8B8G8R8, \n
128     //!             CM_SURFACE_FORMAT_R32F, \n
129     //!             CM_SURFACE_FORMAT_V8U8, \n
130     //!             CM_SURFACE_FORMAT_P8, \n
131     //!             CM_SURFACE_FORMAT_YUY2, \n
132     //!             CM_SURFACE_FORMAT_A8, \n
133     //!             CM_SURFACE_FORMAT_NV12, \n
134     //!             CM_SURFACE_FORMAT_P010, \n
135     //!             CM_SURFACE_FORMAT_UYVY, \n
136     //!             CM_SURFACE_FORMAT_IMC3, \n
137     //!             CM_SURFACE_FORMAT_411P, \n
138     //!             CM_SURFACE_FORMAT_422H, \n
139     //!             CM_SURFACE_FORMAT_422V, \n
140     //!             CM_SURFACE_FORMAT_444P, \n
141     //!             CM_SURFACE_FORMAT_YV12, \n
142     //!             CM_SURFACE_FORMAT_R8_UINT, \n
143     //!             CM_SURFACE_FORMAT_R16_UINT. \n
144     //! \retval     CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
145     //!             is exceeded. The amount is the amount of the surfaces that
146     //!             can co-exist. The amount can be obtained by querying the
147     //!             cap CAP_SURFACE2D_COUNT.
148     //! \retval     CM_FAILURE otherwise.
149     //! \note       For planar surface, there is only one CmSurface2D instance,
150     //!             no matter how many planes the surface may have.
151     //!             The detail about how to access different planes in the kernel
152     //!             code can be found in CM Language Spec, looking for read_plane
153     //!             and write_plane.
154     //!
155     CM_RT_API virtual int32_t CreateSurface2D(uint32_t width,
156                                               uint32_t height,
157                                               CM_SURFACE_FORMAT format,
158                                               CmSurface2D* &surface) = 0;
159 
160     //!
161     //! \brief    Creates a CmSurface2D from an existing MOS Resource.
162     //! \details  CmSurface2D is a wrapper of that MOS resource. This Mos resource is
163     //!            owned by caller.
164     //! \param    [in] mosResource
165     //!           pointer to MOS resource.
166     //! \param    [in,out] surface
167     //!           reference to pointer of surface to be created.
168     //! \retval   CM_SUCCESS if the CmSurface2D is successfully created.
169     //! \retval   CM_INVALID_MOS_RESOURCE_HANDLE if pMosResrouce is nullptr.
170     //! \retval   CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
171     //!           is exceeded.
172     //! \retval   CM_FAILURE otherwise.
173     //!
174     CM_RT_API virtual int32_t CreateSurface2D(PMOS_RESOURCE mosResource,
175                                               CmSurface2D* &surface) = 0;
176 
177     //!
178     //! \brief    Creates a CmSurface2D from an existing VA surface.
179     //! \details  The application must have created the VA surface using the
180     //!           VADriverContext used to create CmDevice. The VA surface format
181     //!           should be within the supported format set which can be obtained
182     //!           by querying cap CAP_SURFACE2D_FORMAT_COUNT and CAP_SURFACE2D_FORMATS.
183     //! \param    [in] vaSurface
184     //!           indext to VA surface.
185     //! \param    [in] vaDriverCtx
186     //!           pointer to VA driver context.
187     //! \param    [in,out] surface
188     //!           reference to pointer of surface to be created.
189     //! \retval   CM_SUCCESS if the CmSurface2D is successfully created.
190     //! \retval   CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
191     //!           is exceeded.
192     //! \retval   CM_FAILURE otherwise.
193     //!
194     CM_RT_API virtual int32_t CreateSurface2D(VASurfaceID vaSurface,
195                                               VADriverContext *vaDriverCtx,
196                                               CmSurface2D* &surface) = 0;
197 
198     //!
199     //! \brief      Creates a CmSurface3D with given width, height, depth and
200     //!             pixel format.
201     //! \details    This function creates a surface in memory with a 3D layout.
202     //!             User needs to provide width, height, depth and format.
203     //! \param      [in] width
204     //!             Surface width.
205     //! \param      [in] height
206     //!             Surface height.
207     //! \param      [in] depth
208     //!             Surface depth.
209     //! \param      [in] format
210     //!             Surface format.
211     //! \param      [out] surface
212     //!             Reference to the pointer to the CmSurface3D.
213     //! \retval     CM_SUCCESS if the CmSurface3D is successfully created.
214     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
215     //! \retval     CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
216     //!             larger than CM_MAX_3D_SURF_WIDTH.
217     //! \retval     CM_INVALID_HEIGHT if height is less than CM_MIN_SURF_HEIGHT
218     //!             or larger than CM_MAX_3D_SURF_HEIGHT.
219     //! \retval     CM_INVALID_DEPTH if width is less than CM_MIN_SURF_DEPTH or
220     //!             larger than CM_MAX_3D_SURF_DEPTH.
221     //! \retval     CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not
222     //!             supported. The supported formats can be obtained by
223     //!             querying cap CAP_SURFACE3D_FORMAT_COUNT and
224     //!             CAP_SURFACE3D_FORMATS, For now, only supports: \n
225     //!             CM_SURFACE_FORMAT_X8R8G8B8, \n
226     //!             CM_SURFACE_FORMAT_A8R8G8B8, \n
227     //!             CM_SURFACE_FORMAT_A16B16G16R16. \n
228     //! \retval     CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 3D
229     //!             surface fails.
230     //! \retval     CM_EXCEED_SURFACE_AMOUNT if maximum amount of 3D surfaces
231     //!             is exceeded. The amount is the amount of the surfaces that
232     //!             can co-exist. The amount can be obtained by querying the
233     //!             cap CAP_SURFACE3D_COUNT.
234     //! \retval     CM_FAILURE otherwise.
235     //!
236     CM_RT_API virtual int32_t CreateSurface3D(uint32_t width,
237                                               uint32_t height,
238                                               uint32_t depth,
239                                               CM_SURFACE_FORMAT format,
240                                               CmSurface3D* &surface) = 0;
241 
242     //!
243     //! \brief      Destroys CmBuffer object.
244     //! \details    This function destroys CmBuffer object. After the function
245     //!             is called, it will return immediately without waiting. If
246     //!             there is any Enqueue is being executed when this function
247     //!             is called, the actual destroy will be postponed internally
248     //!             by the runtime, and user doens't need to worry about it.
249     //! \param      [in,out] surface
250     //!             Reference to the pointer pointing to CmBuffer, it will be
251     //!             assigned to nullptr after destroy.
252     //! \retval     CM_SUCCESS if CmBuffer is successfully destroyed.
253     //! \retval     CM_FAILURE otherwise.
254     //!
255     CM_RT_API virtual int32_t DestroySurface(CmBuffer* &surface) = 0;
256 
257     //!
258     //! \brief      Destroys CmSurface2D type surface.
259     //! \details    This function destroys CmSurface2D object. After the function
260     //!             is called, it will return immediately without waiting. If
261     //!             there is any Enqueue is being executed when this function is
262     //!             called, the actual destroy will be postponed internally by
263     //!             the runtime, and user doens't need to worry about it. One
264     //!             exception is that if the CmSurface2D was created by a third
265     //!             party VA surface, user has to keep the VA surface until the
266     //!             kernel using it finishes execution.
267     //! \param      [in,out] surface
268     //!             Reference to the pointer pointing to CmSurface2D. It will
269     //!             be assigned to nullptr after destroy.
270     //! \retval     CM_SUCCESS if CmSurface2D is successfully destroyed.
271     //! \retval     CM_FAILURE otherwise.
272     //!
273     CM_RT_API virtual int32_t DestroySurface(CmSurface2D* &surface) = 0;
274 
275     //!
276     //! \brief      Destroys CmSurface3D object.
277     //! \details    This function destroys CmSurface3D object. After the
278     //!             function is called, it will return immediately without
279     //!             waiting. If there is any Enqueue is being executed when this
280     //!             function is called, the actual destroy will be postponed
281     //!             internally by the runtime, and user doens't need to worry
282     //!             about it.
283     //! \param      [in,out] surface
284     //!             Reference to the pointer pointing to CmSurface3D. It will
285     //!             be assigned to nullptr after destroy.
286     //! \retval     CM_SUCCESS if CmSurface3D is successfully destroyed.
287     //! \retval     CM_FAILURE otherwise.
288     //!
289     CM_RT_API virtual int32_t DestroySurface(CmSurface3D* &surface) = 0;
290 
291     //!
292     //! \brief      Creates a task queue.
293     //! \details    CmQueue is an in-order queue of tasks. Each task is
294     //!             essentially a CmTask object containing kernels that are to
295     //!             be run concurrently. Each kernel can be executed with
296     //!             multiple threads. Only one CmQueue is supported per CmDevice for now.
297     //!             Trying to create a second CmQueue will return a previously
298     //!             created CmQueue object.
299     //! \param      [in,out] queue
300     //!             Reference to the pointer to the CmQueue.
301     //! \retval     CM_SUCCESS if the CmQueue is successfully created.
302     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
303     //! \retval     CM_FAILURE otherwise.
304     //!
305     CM_RT_API virtual int32_t CreateQueue(CmQueue* &queue) = 0;
306 
307     //!
308     //! \brief      Creates a CmProgram object consisting of kernels loaded from
309     //!             the commonIsaCode code.
310     //! \details    Common ISA code is offline generated as a file with a .isa suffix
311     //!             by the CM compiler when it is used to compile one or more
312     //!             kernels. It contains ISA code common for all Intel platforms.
313     //!             Just-In-Time (JIT) compilation of the common ISA code happens in
314     //!             LoadProgram and generates platform specific ISA according to the
315     //!             actaully platform where the application in running in hardware mode.
316     //!             In the emulation mode JIT doesn't happen.
317     //!             In the simulation mode JIT doesn't happen but paltform specfic
318     //!             ISA need to be offline generated together with common ISA by
319     //!             CM compiler and to be included in commonIsaCode.
320     //!             How to generate common ISA and platform specific ISA can be
321     //!             found in CM compiler manual.
322     //! \param      [in] commonIsaCode
323     //!             Pointer pointing to code in common ISA.
324     //! \param      [in] size
325     //!             Size in bytes of the common ISA code.
326     //! \param      [in,out] program
327     //!             Reference to the pointer to the CmProgram.
328     //! \param      [in] options
329     //!             JIT options for all kernels in the code. This argument
330     //!             is optional. Size of options should be no more than 512
331     //!             (CM_MAX_OPTION_SIZE_IN_BYTE) bytes including the null
332     //!             terminator. There is one option available currently: \n
333     //!             "nojitter" -- Use this option to completely disable jitter
334     //!             from occurring. NOTE: "/Qxcm_jit_tartget=%GEN_ARCH%"
335     //!             flag must be set during offline compilation if "nojitter"
336     //!             is set in hardware mode.
337     //!             In simulation and emulation mode, this option is ignored.
338     //! \retval     CM_SUCCESS if the CmProgram is successfully created.
339     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
340     //! \retval     CM_INVALID_ARG_VALUE if invalid input parameters.
341     //! \retval     CM_INVALID_GENX_BINARY if the GEN binary is not matched with
342     //!             actual running platform in "nojitter" mode.
343     //! \retval     CM_JIT_COMPILE_FAILURE if JIT compile of the common ISA
344     //!             code fails.
345     //! \retval     CM_INVALID_KERNEL_SPILL_CODE if kernel has spill code and
346     //!             devcie's scratch memory space is disabled in
347     //!             CreateCmDeviceEx.
348     //! \retval     CM_FAILURE otherwise.
349     //!
350     CM_RT_API virtual int32_t LoadProgram(void *commonIsaCode,
351                                           const uint32_t size,
352                                           CmProgram* &program,
353                                           const char *options = nullptr) = 0;
354 
355     //!
356     //! \brief      Creates a CmKernel object from the CmProgram object.
357     //! \details    A Cmprogram can contains multiple kernels.
358     //!             The size of all arguments of a kernel should be no more than
359     //!             CAP_ARG_SIZE_PER_KERNEL byte. The number of all kernel
360     //!             arguments should be no more than CAP_ARG_COUNT_PER_KERNEL.
361     //!             The size of kernel binary should be no more than
362     //!             CAP_KERNEL_BINARY_SIZE bytes. The kernelName should be no
363     //!             more than 256 (CM_MAX_KERNEL_NAME_SIZE_IN_BYTE) bytes
364     //!             including the null terminator.
365     //! \param      [in] program
366     //!             CmProgram object from which the kernel is created.
367     //! \param      [in] kernelName
368     //!             CM kernel function (genx_main) name.  A CM_KERNEL_FUNCTION
369     //!             macro MUST be used to specify this argument.
370     //! \param      [in,out] kernel
371     //!             Reference to the pointer to the CmKernel object.
372     //! \param      [in] options
373     //!             JIT options for this specific kernel, overwriting the JIT
374     //!             options specified for all kernels in the CmProgram. This
375     //!             argument is optional. Size of options should be no more
376     //!             than 512 (CM_MAX_OPTION_SIZE_IN_BYTE) bytes including the
377     //!             null terminator. No options available for now.
378     //! \retval     CM_SUCCESS if the CmKernel is successfully created or
379     //!             returned.
380     //! \retval     CM_INVALID_ARG_VALUE if the program is an invalid pointer.
381     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
382     //! \retval     CM_EXCEED_KERNEL_ARG_AMOUNT if the argument number of the
383     //!             kernel fucntion is larger than CAP_ARG_COUNT_PER_KERNEL.
384     //! \retval     CM_EXCEED_KERNEL_ARG_SIZE_IN_BYTE if the argument size of
385     //!             the kernel fucntion is larger than CAP_ARG_SIZE_PER_KERNEL.
386     //! \retval     CM_FAILURE otherwise.
387     //!
388     CM_RT_API virtual int32_t CreateKernel(CmProgram *program,
389                                            const char *kernelName,
390                                            CmKernel* &kernel,
391                                            const char *options = nullptr) = 0;
392 
393     //!
394     //! \brief      Creates a CmSampler object.
395     //! \details    This function creates a 3D sampler state object used to sample
396     //!             a 2D surface.
397     //! \param      [in] sampleState
398     //!             Const reference to a CM_SAMPLER_STATE specifying the
399     //!             characteristics of the sampler to be created. The structure
400     //!             is defined below.
401     //! \param      [out] sampler
402     //!             Reference to the pointer to the CmSampler object.
403     //! \retval     CM_SUCCESS if the CmSampler is successfully created.
404     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
405     //! \retval     CM_EXCEED_SAMPLER_AMOUNT if maximum amount of sampler is
406     //!             exceeded. The amount is the amount of the sampler that can
407     //!             co-exist. The amount can be obtained by querying the cap
408     //!             CAP_SAMPLER_COUNT.
409     //! \retval     CM_FAILURE otherwise.
410     //! \note       typedef struct _CM_SAMPLER_STATE\n
411     //!             {\n
412     //!                 CM_TEXTURE_FILTER_TYPE      minFilterType;\n
413     //!                 CM_TEXTURE_FILTER_TYPE      magFilterType;\n
414     //!                 CM_TEXTURE_ADDRESS_TYPE     addressU;\n
415     //!                 CM_TEXTURE_ADDRESS_TYPE     addressV;\n
416     //!                 CM_TEXTURE_ADDRESS_TYPE     addressW;\n
417     //!             } CM_SAMPLER_STATE;\n
418     //!
419     //!             For now, only linear and anisotropic filter types are
420     //!             supported for hardware and simulation modes. For emulation
421     //!             mode, linear filter type is supported. Wrap, mirror, and
422     //!             clamp address types are supported in hardware and simulation modes.
423     //!             only clamp address type is supported in emulation mode.
424     //!
425     CM_RT_API virtual int32_t
426     CreateSampler(const CM_SAMPLER_STATE &sampleState,
427                   CmSampler* &sampler) = 0;
428 
429     //!
430     //! \brief      Destroys a CmKernel.
431     //! \details    A CmKernel that is not destroyed by calling this function
432     //!             will be destroyed when the CmDevice is destroyed.
433     //! \param      [in,out] kernel
434     //!             CmKernel object to be destroyed. It will be assigned to
435     //!             nullptr once the fuction is return.
436     //! \retval     CM_SUCCESS if the CmKernel is successfully destroyed.
437     //! \retval     CM_FAILURE otherwise.
438     //!
439     CM_RT_API virtual int32_t DestroyKernel(CmKernel* &kernel) = 0;
440 
441     //!
442     //! \brief      Destroys a CmSampler.
443     //! \details    A CmSampler that is not destroyed by calling this function
444     //!             will be destroyed when the CmDevice is destroyed.
445     //! \param      [in,out] sampler
446     //!             A reference to the CmSampler pointer.
447     //! \retval     CM_SUCCESS if the CmSampler is successfully destroyed.
448     //! \retval     CM_FAILURE otherwise.
449     //!
450     CM_RT_API virtual int32_t DestroySampler(CmSampler* &sampler) = 0;
451 
452     //!
453     //! \brief      Destroys a CmProgram.
454     //! \details    A CmProgram that is not destroyed by calling this function
455     //!             will be destroyed when the CmDevice is destroyed.
456     //! \param      [in,out] program
457     //!             Reference to the pointer to the CmProgram. It will be assigned to
458     //!             nullptr once the fuction is return.
459     //! \retval     CM_SUCCESS if the CmProgram is successfully destroyed.
460     //! \retval     CM_FAILURE otherwise.
461     //!
462     CM_RT_API virtual int32_t DestroyProgram(CmProgram* &program) = 0;
463 
464     //!
465     //! \brief      Destroys a CmThreadSpace instance.
466     //! \details    A CmThreadSpace that is not destroyed by calling this
467     //!             function will be destroyed when the CmDevice is destroyed.
468     //! \param      [in,out] threadSpace
469     //!             Reference to the pointer to the CmThreadSpace. It will be
470     //!             assigned to nullptr once the fuction is return.
471     //! \retval     CM_SUCCESS if the CmThreadSpace is successfully destroyed.
472     //! \retval     CM_FAILURE if the input is nullptr or not valid.
473     //!
474     CM_RT_API virtual int32_t DestroyThreadSpace(CmThreadSpace* &threadSpace) = 0;
475 
476     //!
477     //! \brief      Creates a CmTask object
478     //! \details    This object is a container for one or multiple CmKernel objects, and used
479     //!             to enqueue the kernels for concurrent execution.
480     //! \param      [out] task Reference to the pointer to the CmTask
481     //! \retval     CM_SUCCESS if the CmTask is successfully created
482     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory
483     //!
484     CM_RT_API virtual int32_t CreateTask(CmTask* &task) = 0;
485 
486     //!
487     //! \brief      Destroy a CmTask object
488     //! \details    A CmTask that is not destroyed by calling this
489     //!             function will be destroyed when the CmDevice is destroyed
490     //! \param      [in, out] task Reference to the pointer to the CmTask.
491     //! \retval     CM_SUCCESS if the CmTaskis successfully destroyed
492     //! \retval     CM_FAILURE otherwise
493     //!
494     CM_RT_API virtual int32_t DestroyTask(CmTask* &task) = 0;
495 
496     //!
497     //! \brief    This function can be used to get HW capability.
498     //! \details  Since Emulation mode is run during kernel
499     //!           development the values returned in Emulation mode reflect the
500     //!           capabilities at that time, and might not reflect
501     //!           the latest HW capabilities using a later driver release
502     //! \param    [in] capName Name of cap to query
503     //! \param    [out] capValueSize Reference to the size in bytes of the Cap
504     //!           value. On entry application should set this to the size
505     //!           of memory allocated for the cap value. Application should
506     //!           make sure this size is large enough to hold the Cap value
507     //!           requested. On return from this function the actual size of
508     //!           cap value is returned
509     //! \param    [out] capValue Pointer pointing to memory where the
510     //!           cap value should be returned
511     //! \retval   CM_SUCCESS if the input capValueSize equals or
512     //!           is larger than required Cap size and Cap Value
513     //!           is successfully returned,
514     //! \retval   CM_FAILURE otherwise
515     //! \details
516     //!  <table>
517     //!    <tr>
518     //!     <th>Cap Name</th>
519     //!     <th>Size in bytes  </th>
520     //!     <th>Type of Value</th>
521     //!     <th>Description</th>
522     //!   </tr>
523     //!   <tr>
524     //!     <td>CAP_KERNEL_COUNT_PER_TASK</td>
525     //!     <td>4</td>
526     //!     <td>uint32_t</td>
527     //!     <td>Maximum number of kernels that can be enqueued in one task</td>
528     //!   </tr>
529     //!   <tr>
530     //!     <td> CAP_KERNEL_BINARY_SIZE</td>
531     //!     <td>4</td>
532     //!     <td>uint32_t</td>
533     //!     <td> Maximum kernel binary size in bytes</td>
534     //!   </tr>
535     //!   <tr>
536     //!     <td> CAP_SAMPLER_COUNT</td>
537     //!     <td>4</td>
538     //!     <td>uint32_t</td>
539     //!     <td> Maximum number of samplers that can co-exist at any time
540     //!          in a CmDevice</td>
541     //!   </tr>
542     //!   <tr>
543     //!     <td>CAP_SAMPLER_COUNT_PER_KERNEL </td>
544     //!     <td>4</td>
545     //!     <td>uint32_t</td>
546     //!     <td>Maximum number of samplers that one kernel can use</td>
547     //!   </tr>
548     //!   <tr>
549     //!     <td>CAP_BUFFER_COUNT </td>
550     //!     <td>4</td>
551     //!     <td>uint32_t</td>
552     //!     <td>Maximum number of CmBuffer that can co - exist at any time </td>
553     //!   </tr>
554     //!     <tr>
555     //!     <td> CAP_SURFACE2D_COUNT</td>
556     //!     <td>4</td>
557     //!     <td>uint32_t</td>
558     //!     <td>Maximum number of CmSurface2D that can co-exist at
559     //!             any time </td>
560     //!   </tr>
561     //!   <tr>
562     //!     <td>CAP_SURFACE3D_COUNT </td>
563     //!     <td>4</td>
564     //!     <td>uint32_t</td>
565     //!     <td>Maximum number of CmSurface3D that can co-exist at any
566     //!                      time in a CmDevice </td>
567     //!   </tr>
568     //!   <tr>
569     //!     <td>CAP_SURFACE_COUNT_PER_KERNEL </td>
570     //!     <td>4</td>
571     //!     <td>uint32_t</td>
572     //!     <td>Maximum number of surfaces (including 1D, 2D and 3D) that
573     //!                    one kernel can use </td>
574     //!    </tr>
575     //!    <tr>
576     //!      <td>CAP_ARG_COUNT_PER_KERNEL </td>
577     //!      <td>4</td>
578     //!      <td>uint32_t</td>
579     //!      <td>Maximum number of arguments that a kernel can have </td>
580     //!    </tr>
581     //!    <tr>
582     //!     <td>CAP_ARG_SIZE_PER_KERNEL </td>
583     //!     <td>4</td>
584     //!     <td>uint32_t</td>
585     //!     <td>Maximum size of all arguments that a kernel can have </td>
586     //!    </tr>
587     //!    <tr>
588     //!     <td>CAP_USER_DEFINED_THREAD_COUNT_PER_TASK </td>
589     //!     <td>4</td>
590     //!     <td>uint32_t</td>
591     //!     <td>Maximum number of threads that all kernels of a task can
592     //!                 run, it's only used for media object usage </td>
593     //!    </tr>
594     //!     <tr>
595     //!     <td>CAP_HW_THREAD_COUNT </td>
596     //!     <td>4</td>
597     //!     <td>uint32_t</td>
598     //!     <td>Maximum number of threads that HW can run in parallel.This
599     //!       indicates hardware parallelism and is hence one
600     //!       of the factors indicating performance of the target machine </td>
601     //!   <tr>
602     //!     <td>CAP_SURFACE2D_FORMAT_COUNT </td>
603     //!     <td>4</td>
604     //!     <td>uint32_t</td>
605     //!     <td>Number of DDI formats supported for CmSurface2D creation </td>
606     //!   <tr>
607     //!     <td>CAP_SURFACE2D_FORMATS </td>
608     //!     <td>sizeof(DDIFORMAT) * CAP_SURFACE2D_FORMAT_COUNT</td>
609     //!     <td>Array of DDIFORMAT</td>
610     //!     <td>All DDI format supported to create CmSurface2D </td>
611     //!   <tr>
612     //!     <td>CAP_SURFACE3D_FORMAT_COUNT </td>
613     //!     <td>sizeof(DDIFORMAT) * CAP_SURFACE3D_FORMAT_COUNT</td>
614     //!     <td>Array of DDIFORMAT</td>
615     //!     <td>Number of DDI formats supported for CmSurface3D creation </td>
616     //!   <tr>
617     //!     <td>CAP_SURFACE3D_FORMATS </td>
618     //!     <td>sizeof(DDIFORMAT) * CAP_SURFACE3D_FORMAT_COUNT</td>
619     //!     <td>Array of DDIFORMAT</td>
620     //!     <td>All DDI format supported to create CmSurface3D </td>
621     //!   <tr>
622     //!     <td>CAP_VME_STATE_COUNT </td>
623     //!     <td>4</td>
624     //!     <td>uint32_t</td>
625     //!     <td>Maximum number of VME states that can co - exist
626     //!                at any time in a CmDevice </td>
627     //!   <tr>
628     //!     <td>CAP_GPU_PLATFORM </td>
629     //!     <td>4</td>
630     //!     <td>uint32_t</td>
631     //!     <td>Return GPU platform as an enum of type GPU_PLATFORM
632     //!                  (PLATFORM_INTEL_SNB, PLATFORM_INTEL_IVB, etc) </td>
633     //!   <tr>
634     //!     <td>CAP_GT_PLATFORM </td>
635     //!     <td>4</td>
636     //!     <td>uint32_t</td>
637     //!     <td>Return GT platform (SKU) as an enum of type GPU_GT_PLATFORM
638     //!            (PLATFORM_INTEL_GT1, PLATFORM_INTEL_GT2, etc) </td>
639     //!   <tr>
640     //!     <td>CAP_MIN_FREQUENCY </td>
641     //!     <td>4</td>
642     //!     <td>uint32_t</td>
643     //!     <td>Returns the minimum frequency of the GPU as an integer in MHz
644     //!     </td>
645     //!   <tr>
646     //!     <td>CAP_MAX_FREQUENCY </td>
647     //!     <td>4</td>
648     //!     <td>uint32_t</td>
649     //!     <td>Returns the maximum frequency of the GPU as an integer in MHz
650     //!     </td>
651     //!   <tr>
652     //!     <td>CAP_GPU_CURRENT_FREQUENCY </td>
653     //!     <td>4</td>
654     //!     <td>uint32_t</td>
655     //!     <td>Return the current frequency of the GPU as an integer
656     //!              in MHz </td>
657     //!   </tr>
658     //!   <tr>
659     //!     <td>CAP_USER_DEFINED_THREAD_COUNT_PER_TASK_NO_THREAD_ARG </td>
660     //!     <td>4</td>
661     //!     <td>uint32_t</td>
662     //!     <td>Returns the maximum thread count on media object without
663     //!          per - thread argument </td>
664     //!   </tr>
665     //!   <tr>
666     //!     <td>CAP_USER_DEFINED_THREAD_COUNT_PER_MEDIA_WALKER </td>
667     //!     <td>4</td>
668     //!     <td>uint32_t</td>
669     //!     <td>Returns the maximum thread count in media walker usage </td>
670     //!   </tr>
671     //!   <tr>
672     //!     <td>CAP_USER_DEFINED_THREAD_COUNT_PER_THREAD_GROUP </td>
673     //!     <td>4</td>
674     //!     <td>uint32_t</td>
675     //!     <td>Returns the maximum thread count per thread group in
676     //!             GPGPU walker usage </td>
677     //!   </tr>
678     //!   <tr>
679     //!     <td>CAP_SURFACE2DUP_COUNT </td>
680     //!     <td>4</td>
681     //!   <td>uint32_t</td>
682     //!     <td>Maximum number of CmSurface2DUP that can
683     //!           co - exist at any time </td>
684     //!   </tr>
685     //! </table>
686     //!
687     CM_RT_API virtual int32_t GetCaps(CM_DEVICE_CAP_NAME capName,
688                                       uint32_t &capValueSize,
689                                       void *capValue) = 0;
690 
691     //!
692     //! \brief      Creates a CmThreadSpace object.
693     //! \details    CmThreadSpace is a 2D space.Each unit is notated as
694     //!             a pair of X/Y coordinates, which is in the range of [0, width -1]
695     //!             or [0, heigh-1]. A thread space can define a dependency or no
696     //!             dependency. A thread space can be used as per-task thread space
697     //!             by passing it in Enqueue(), or be used as per-kernel thread space
698     //!             by calling CmKernel::AssociateThreadSpace() API. Please
699     //!             refer to "Host programming guide" for detailed thread space usages.
700     //! \param      [in] width
701     //!             Thread space width.
702     //! \param      [in] height
703     //!             Thread space height.
704     //! \param      [out] threadSpace
705     //!             Reference to pointer to CmThreadSpace object to be created.
706     //! \retval     CM_SUCCESS if the CmThreadSpace is successfully created.
707     //! \retval     CM_INVALID_THREAD_SPACE if the width or(and) height are
708     //! \retval     invalid values (0 or exceeds maximum size).
709     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
710     //! \retval     CM_FAILURE otherwise.
711     //! \note       The maximum width/height allowed when using media walker is
712     //!             511 for pre-SKL and 2047 for SKL+. For media object the
713     //!             maximum width/height allowed is 512.
714     //!
715     CM_RT_API virtual int32_t CreateThreadSpace(uint32_t width,
716                                                 uint32_t height,
717                                                 CmThreadSpace* &threadSpace) = 0;
718 
719     //!
720     //! \brief      Creates a CmBufferUP object.
721     //! \details    This API creates a CmBufferUP object on top of the UP
722     //!             (User Provided) system memory with specificed size in bytes.
723     //!             The UP memory starting address must be page (4K Bytes) aligned.
724     //! \param      [in] size
725     //!             BufferUP size in bytes, the valid range is:
726     //!             > CM_MIN_SURF_WIDTH, and < CM_MAX_1D_SURF_WIDTH.
727     //! \param      [in] pSystMem
728     //!             Pointer to the system memory.
729     //! \param      [out] surface
730     //!             Reference to the pointer to the CmBufferUP.
731     //! \retval     CM_SUCCESS if the CmBufferUP is successfully created.
732     //! \retval     CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 1D
733     //!             surface fails.
734     //! \retval     CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
735     //!             larger than CM_MAX_1D_SURF_WIDTH.
736     //! \retval     CM_INVALID_ARG_VALUE if pSystMem is nullptr.
737     //! \retval     CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces
738     //!             is exceeded. The amount is the amount of the surfaces
739     //!             that can co-exist. The amount can be obtained by
740     //!             querying the cap CAP_BUFFER_COUNT.
741     //! \retval     CM_FAILURE otherwise.
742     //! \note       Application can access the memory though the memory
743     //!             point from CPU; can also access the
744     //!             buffer created upon the same memory from GPU. It is
745     //!             application's responsibility to make
746     //!             sure accesses from both sides are not overlapped.
747     //! \note       Refer to "MDF Host Programming Guide" for detailed usages.
748     //!
749     CM_RT_API virtual int32_t CreateBufferUP(uint32_t size,
750                                              void *sysMem,
751                                              CmBufferUP* &surface) = 0;
752 
753     //!
754     //! \brief      Destroys CmBufferUP object.
755     //! \details    The UP (User Provided) memory is still existing after the
756     //!             CmBufferUP object is destroyed.
757     //! \param      [in, out] surface
758     //!             Reference to the pointer pointing to CmBufferUP. It will be
759     //!             assigned to nullptr once the function is returned.
760     //! \retval     CM_SUCCESS if CmBufferUP is successfully destroyed.
761     //! \retval     CM_FAILURE otherwise.
762     //!
763     CM_RT_API virtual int32_t DestroyBufferUP(CmBufferUP* &surface) = 0;
764 
765     //!
766     //! \brief      Forces the BufferUP object to be destroyed.
767     //! \param      [in, out] surface
768     //!             Reference to the pointer pointing to CmBufferUP. It will be
769     //!             assigned to nullptr once the function is returned.
770     //! \retval     CM_SUCCESS if CmBufferUP is successfully destroyed.
771     //! \retval     CM_FAILURE otherwise.
772     //!
773     CM_RT_API virtual int32_t ForceDestroyBufferUP(CmBufferUP* &surface) = 0;
774 
775     //!
776     //! \brief      Gets Surface2D allocation information by given width,
777     //!             height, and format.
778     //! \details    Gets necessary information in order to create and use
779     //!             CmSurface2DUP.
780     //!             To create CmSurface2DUP, user needs to allocated such
781     //!             amount of system memory which equals to
782     //!             or larger than physical size returned here. When
783     //!             accessing the system memory, the user needs be
784     //!             aware about pitch, which is equal to (pixel_width *
785     //!             byte_per_pixel + necessary_padding).
786     //! \param      [in] width
787     //!             Width in pixel.
788     //! \param      [in] height
789     //!             height in pixel.
790     //! \param      [in] format
791     //!             pixel format.
792     //! \param      [out] pitch
793     //!             Reference to returned pitch.
794     //! \param      [out] physicalSize
795     //!             Reference to returned physical size.
796     //! \retval     CM_SUCCESS always
797     //!
798     CM_RT_API virtual int32_t GetSurface2DInfo(uint32_t width,
799                                                uint32_t height,
800                                                CM_SURFACE_FORMAT format,
801                                                uint32_t &pitch,
802                                                uint32_t &physicalSize) = 0;
803 
804     //!
805     //! \brief      Creates a CmSurface2DUP object.
806     //! \details    Creates a CmSurface2DUP in UP (User Provided) system memory
807     //!             with given surface width, height in pixel, and format.
808     //!             The UP system memory must be page (4K Bytes) aligned.
809     //!             The size of the system memory must larger than or equal to
810     //!             the size return by GetSurface2DInfo().
811     //! \param      [in] width
812     //!             Width in pixel.
813     //! \param      [in] height
814     //!             Height in pixel.
815     //! \param      [in] format
816     //!             Format.
817     //! \param      [in] sysMem
818     //!             Reference to the pointer to the system memory which is CPU
819     //!             accessible.
820     //! \param      [out] surface
821     //!             Reference to the pointer to the CmSurface2DUP.
822     //! \retval     CM_SUCCESS if the CmSurface2DUPis successfully created.
823     //! \retval     CM_INVALID_ARG_VALUE if sysMem is nullptr.
824     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
825     //! \retval     CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
826     //!             larger than CM_MAX_2D_SURF_WIDTH, or for YUY2 or NV12
827     //!             format, the width is odd.
828     //! \retval     CM_INVALID_HEIGHT if height is less than CM_MIN_SURF_HEIGHT
829     //!             or larger than CM_MAX_2D_SURF_HEIGHT, or for NV12 format,
830     //!             the height is odd.
831     //! \retval     CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not
832     //!             supported. The supported formats can be obtained by
833     //!             querying cap CAP_SURFACE2D_FORMAT_COUNT
834     //!             and CAP_SURFACE2D_FORMATS.
835     //! \retval     CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
836     //!             is exceeded. The amount is the amount of the surfaces that
837     //!             can co-exist. The amount can be obtained by
838     //!             querying the cap CAP_SURFACE2D_COUNT.
839     //! \retval     CM_SURFACE_ALLOCATION_FAILURE if allocation is failed.
840     //! \retval     CM_FAILURE otherwise.
841     //! \note       Application can access the memory though the memory point
842     //!             returned from CPU; can also access the surface created
843     //!             upon the same memory from GPU. It is application's
844     //!             responsibility to make sure accesses from both sides are
845     //!             not overlapped. When accessing the system memory from CPU,
846     //!             the user needs to be aware about pitch, which is equal to
847     //!             (pixel_width * byte_per_pixel + necessary_padding).
848     //! \note       Refer to the CmSurface2DUP class for member APIs, and
849     //!             'MDF runtime host programming guide' for usages.
850     //!
851     CM_RT_API virtual int32_t CreateSurface2DUP(uint32_t width,
852                                                 uint32_t height,
853                                                 CM_SURFACE_FORMAT format,
854                                                 void *sysMem,
855                                                 CmSurface2DUP* &surface) = 0;
856 
857     //!
858     //! \brief      Destroys CmSurface2DUP surface.
859     //! \details    The UP (User Provided) memory is still existing after the
860     //!             CmSurface2DUP object is destroyed.
861     //! \param      [in] surface
862     //!             Reference to the pointer pointing to CmSurface2DUP. It will
863     //!             be assigned to nullptr once this function is returned.
864     //! \retval     CM_SUCCESS if CmSurface2DUPis successfully destroyed.
865     //! \retval     CM_FAILURE otherwise.
866     //!
867     CM_RT_API virtual int32_t
868     DestroySurface2DUP(CmSurface2DUP* &surface) = 0;
869 
870     //!
871     //! \brief      Creates a VME surface for AVC messages in kernel.
872     //! \details    Creates a VME surface by using the given 2D surfaces:
873     //!             the current frame, the forward frames and, the backward
874     //!             frames. The last two can be nullptr if not used. The function
875     //!             indicates these 2D surfaces are used for VME; no extra
876     //!             surface is actually created. A SurfaceIndex object is created
877     //!             instead, which is passed to CM kernel function (genx_main)
878     //!             as argument to indicate the frame surface. Please see VME
879     //!             examples in "MDF Host Programming Guide" document and CM
880     //!             language specification for details.
881     //! \param      [in] currentSurface
882     //!             Pointer to current surface (can't be nullptr).
883     //! \param      [in] forwardSurfaces
884     //!             Array of forward surfaces (can be nullptr).
885     //! \param      [in] backwardSurfaces
886     //!             Array of backward surfaces (can be nullptr).
887     //! \param      [in] forwardSurfaceCount
888     //!             Count of forward surfaces, up to 16 forward surfaces can be
889     //!             used.
890     //! \param      [in] backwardSurfaceCount
891     //!             Count of backward surfaces, up to 16 backward surfaces can
892     //!             be used.
893     //! \param      [out] vmeIndex
894     //!             Reference to pointer to SurfaceIndex object to be created.
895     //! \retval     CM_SUCCESS if the SurfaceIndex is successfully created.
896     //! \retval     CM_NULL_POINTER if currentSurface is nullptr.
897     //! \retval     CM_INVALID_ARG_VALUE if any parameter is not valid.
898     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
899     //! \retval     CM_EXCEED_SURFACE_AMOUNT if maximum amount of VME surfaces
900     //!             is exceeded. The amount is the amount of VME surfaces that
901     //!             can co-exist. The amount can be obtained by querying the
902     //!             cap CAP_VME_SURFACE_COUNT.
903     //! \retval     CM_FAILURE otherwise.
904     //! \note       This can be used for all Gen7_5 and plus platforms.
905     //!
906     CM_RT_API virtual int32_t
907     CreateVmeSurfaceG7_5(CmSurface2D *currentSurface,
908                          CmSurface2D **forwardSurfaces,
909                          CmSurface2D **backwardSurfaces,
910                          const uint32_t forwardSurfaceCount,
911                          const uint32_t backwardSurfaceCount,
912                          SurfaceIndex* &vmeIndex) = 0;
913 
914     //!
915     //! \brief      Destroys a VME surface object.
916     //! \details    Any VME surface not destroyed by calling this function
917     //!             explicitly will be destroyed when CmDevice is destroyed.
918     //! \param      [in] vmeIndex
919     //!             Pointer to the SurfaceIndex of the VME surface. It will be
920     //!             assigned to nullptr once destroy is done.
921     //! \retval     CM_SUCCESS if the VME surface is successfully destroyed.
922     //! \retval     CM_FAILURE otherwise.
923     //! \note       This can be used for all Gen7_5 and plus platforms.
924     //!
925     CM_RT_API virtual int32_t
926     DestroyVmeSurfaceG7_5(SurfaceIndex* &vmeIndex) = 0;
927 
928     //!
929     //! \brief      Creates a CmSampler8x8 object.
930     //! \param      [in] sampler8x8Descriptor
931     //!             Const reference to a CM_SAMPLER_8X8_DESCR specifying the
932     //!             characteristics of the Sampler8x8 state to be created.
933     //!             Currently, AVS, VA Convolve and VA Misc( including MinMax
934     //!             Filter/Erode/Dilate ) states are supported.
935     //! \param      [out] sampler8x8
936     //!             Reference to the pointer to the CmSampler8x8 object.
937     //! \retval     CM_SUCCESS if the CmSampler8x8is successfully created.
938     //! \retval     CM_INVALID_ARG_VALUE wrong sampler8x8 type.
939     //! \retval     CM_EXCEED_SAMPLER_AMOUNT if the co-existed sampler exceeds
940     //!             maximum count which can be queried by CAP_SAMPLER_COUNT cap.
941     //!
942     CM_RT_API virtual int32_t
943     CreateSampler8x8(const CM_SAMPLER_8X8_DESCR &sampler8x8Descriptor,
944                      CmSampler8x8* &sampler8x8) = 0;
945 
946     //!
947     //! \brief      Destroys a CmSampler8x8 object.
948     //! \details    A CmSampler8x8 which is not destroyed by calling this
949     //!             function will be destroyed when the CmDevice is destroyed.
950     //! \param      [in, out] sampler8x8State
951     //!             Reference to a sampler of CmSampler8x8. It will be assigned
952     //!             to nullptr once destroy is done.
953     //! \retval     CM_SUCCESS if the CmSampler8x8 is successfully destroyed.
954     //! \retval     CM_FAILURE otherwise.
955     //!
956     CM_RT_API virtual int32_t DestroySampler8x8(CmSampler8x8* &sampler8x8State) = 0;
957 
958     //!
959     //! \brief      Creates a CmSampler8x8 surface.
960     //! \details    Creates a CmSampler8x8 surface by using the given 2D surface.
961     //!             The function indicates the 2D surface is used for sampler
962     //!             8x8; no extra surface is actually created. A SurfaceIndex
963     //!             object is created instead, which is passed to CM kernel
964     //!             function (genx_main) as argument to indicate the surface
965     //!             for sampler 8x8.
966     //! \param      [in] surface2d
967     //!             Pointer to CmSurface2D.
968     //! \param      [out] sampler8x8SurfIndex
969     //!             Reference to pointer to SurfaceIndex.
970     //! \param      [in] surfType
971     //!             Enumeration data type of CM_SAMPLER8x8_SURFACE.
972     //! \param      [in] mode
973     //!             Enumeration data type of CM_SURFACE_ADDRESS_CONTROL_MODE.
974     //! \retval     CM_SUCCESS if the CmSampler8x8 surface is successfully
975     //!             created.
976     //! \retval     CM_EXCEED_SURFACE_AMOUNT if there is too many co-existed
977     //!             surfaces and exceed the maximum number. Destroying some
978     //!             unused surfaces could solve this error.
979     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory
980     //! \retval     CM_FAILURE otherwise.
981     //!
982     CM_RT_API virtual int32_t
983     CreateSampler8x8Surface(CmSurface2D *surface2d,
984                             SurfaceIndex* &sampler8x8SurfIndex,
985                             CM_SAMPLER8x8_SURFACE surfType,
986                             CM_SURFACE_ADDRESS_CONTROL_MODE mode) = 0;
987 
988     //!
989     //! \brief      Destroys a CmSampler8x8 surface.
990     //! \details    A CmSampler8x8 surface which is not destroyed by calling
991     //!             this function will be destroyed when the CmDevice is
992     //!             destroyed.
993     //! \param      [in] sampler8x8SurfIndex
994     //!             Reference to SurfaceIndex. It will be assigned to nullptr
995     //!             once destroy is done.
996     //! \retval     CM_SUCCESS if the CmSampler8x8 surface is successfully
997     //!             destroyed.
998     //! \retval     CM_FAILURE otherwise.
999     //!
1000     CM_RT_API virtual int32_t
1001     DestroySampler8x8Surface(SurfaceIndex* &sampler8x8SurfIndex) = 0;
1002 
1003     //!
1004     //! \brief      Creates a 2-dimensional thread group space object.
1005     //! \details    This function creates a thread group space specified by the
1006     //!             height and width dimensions of the group space, and the
1007     //!             height and width dimensions of the thread space within a
1008     //!             group. This information is used to execute a kernel in GPGPU pipe
1009     //!             (https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-skl-vol07-3d_media_gpgpu.pdf).
1010     //!             Relevant sample code is shown in "MDF Host Programming Guide"
1011     //! \param      [in] threadSpaceWidth
1012     //!             width in unit of threads of each thread group.
1013     //! \param      [in] threadSpaceHeight
1014     //!             height in unit of threads of each thread group.
1015     //! \param      [in] groupSpaceWidth
1016     //!             width in unit of groups of thread group space.
1017     //! \param      [in] groupSpaceHeight
1018     //!             height in unit of groups of thread group space.
1019     //! \param      [out] threadGroupSpace
1020     //!             Reference to the pointer to CmThreadGroupSpace object to be
1021     //!             created.
1022     //! \retval     CM_SUCCESS if the CmThreadGroupSpace is successfully
1023     //!             created.
1024     //! \retval     CM_INVALID_THREAD_GROUP_SPACE if any input is 0 or the
1025     //!             thrdSpaceWidth is more than MAX_THREAD_SPACE_WIDTH_PERGROUP,
1026     //!             or the thrdSpaceHeight is more than
1027     //!             MAX_THREAD_SPACE_HEIGHT_PERGROUP.
1028     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1029     //! \retval     CM_FAILURE otherwise.
1030     //! \note       The total thread count is width*height*grpWidth*grpHeight.
1031     //!             CmKernel::SetThreadCount() calling is not necessary in this
1032     //!             GPGPU working mode. Currently, it's only used for SLM
1033     //!             enabled kernels. See also CreateThreadGroupSpaceEx() API which
1034     //!             specifies a 3-dimensional thread group space with width, height
1035     //!             and depth.
1036     //!
1037     CM_RT_API virtual int32_t
1038     CreateThreadGroupSpace(uint32_t threadSpaceWidth,
1039                            uint32_t threadSpaceHeight,
1040                            uint32_t groupSpaceWidth,
1041                            uint32_t groupSpaceHeight,
1042                            CmThreadGroupSpace* &threadGroupSpace) = 0;
1043 
1044     //!
1045     //! \brief      Destroys the created thread group space object.
1046     //! \details    Caller provides the reference of thread group space pointer
1047     //! \param      [in] threadGroupSpace
1048     //!             Pointer to a CmThreadGroupSpace. It will be assigned to
1049     //!             nullptr once destroy is done.
1050     //! \retval     CM_SUCCESS if the CmThreadGroupSpace pointer is
1051     //!             successfully destroyed.
1052     //! \note       User can call this API to explicitly destroy
1053     //!             CmThreadGroupSpace instance, otherwise, DestroyCmDevice()
1054     //!             takes care of all of such instances release.
1055     //!
1056     CM_RT_API virtual int32_t
1057     DestroyThreadGroupSpace(CmThreadGroupSpace* &threadGroupSpace) = 0;
1058 
1059     //!
1060     //! \brief      Sets the configuration for L3 cache.
1061     //! \details    This API allows users to configure L3 cach by themselves.
1062     //! \param      [in] l3Config
1063     //!             L3ConfigRegisterValues contains the values of L3 control
1064     //!             registers. The registers are different from platform to
1065     //!             platform. \n
1066     //!             struct L3ConfigRegisterValues \n
1067     //!             { \n
1068     //!             \t unsigned int config_register0; \n
1069     //!             \t unsigned int config_register1; \n
1070     //!             \t unsigned int config_register2; \n
1071     //!             \t unsigned int config_register3; \n
1072     //!             }; \n
1073     //! \retval     CM_SUCCESS if the L3 configuration pointer is set correctly.
1074     //! \retval     CM_FAILURE if the platform does not support L3 or L3
1075     //!             configuration failed to be set.
1076     //! \note       This function is implemented for both hardware mode and
1077     //!             simulation mode.
1078     //!
1079     CM_RT_API virtual int32_t SetL3Config(const L3ConfigRegisterValues *l3Config) = 0;
1080 
1081     //!
1082     //! \brief      Sets the suggested configuration for L3 cache.
1083     //! \param      [in] l3SuggestConfig
1084     //!             The configuration plan which represents a suggested L3
1085     //!             configuration. These configurations are defined in
1086     //!             ::L3_SUGGEST_CONFIG which is a enumeration definition.
1087     //! \retval     CM_SUCCESS if the L3 configuration pointer is set correctly.
1088     //! \retval     CM_FAILURE if the platform does not support L3 or L3
1089     //!             configuration failed to be set.
1090     //! \note       This function is only implemented for hardware and
1091     //!             simulation modes.
1092     //!
1093     CM_RT_API virtual int32_t
1094     SetSuggestedL3Config(L3_SUGGEST_CONFIG l3SuggestConfig) = 0;
1095 
1096     //!
1097     //! \brief      This function can be used to set/limit hardware
1098     //!             capabilities- number of threads that HW can run in parallel
1099     //! \details    Hardware thread number can be set from 1 to maximum.
1100     //! \param      [in] capName
1101     //!             Name of cap to set.
1102     //! \param      [in] capValueSize
1103     //!             The size of the cap value.
1104     //! \param      [in] capValue
1105     //!             Pointer to the cap value.
1106     //! \retval     CM_SUCCESS if cap value is valid and is set correctly.
1107     //! \retval     CM_INVALID_HARDWARE_THREAD_NUMBER specific SetCaps error
1108     //!             message if cap value is not valid.
1109     //! \retval     CM_NOT_IMPLEMENTED for emulation mode.
1110     //! \retval     CM_FAILURE otherwise.
1111     //! \note       The following is the specific behavior for the cap value
1112     //!             that is being set.
1113     //!             <table>
1114     //!                <tr>
1115     //!                 <th>Cap name< / th>
1116     //!                 <th>Behavior< / th>
1117     //!                < / tr>
1118     //!                <tr>
1119     //!                 <td>CAP_HW_THREAD_COUNT< / td>
1120     //!                 <td>The number of hardware threads is per - task.A call
1121     //!                 to the SetCaps function to set the CAP_HW_THREAD_COUNT
1122     //!                 will limit the maximum number of hardware threads for
1123     //!                 the ensuing call to Enqueue.After the call to Enqueue,
1124     //!                 the maximum number of hardware threads will be restored
1125     //!                 to its default value, which is determined by the
1126     //!                 hardware's capability.
1127     //!                 < / td>
1128     //!                < / tr>
1129     //!             < / table>
1130     //!
1131     CM_RT_API virtual int32_t SetCaps(CM_DEVICE_CAP_NAME capName,
1132                                       size_t capValueSize,
1133                                       void *capValue) = 0;
1134 
1135     //!
1136     //! \brief      This function creates a sampler surface index by a given
1137     //!             CmSurface2D.
1138     //! \details    This sampler surface doesn't create any actual surface. It
1139     //!             just binds the actual 2D surface with a virtual sampler
1140     //!             surface index. User need pass this surface index as kernel
1141     //!             argument if the surface is used for sampler, otherwise,
1142     //!             the runtime will report error if user pass the 2D surface
1143     //!             index. For the 2D surface format, for now  supports
1144     //!             following formats: \n
1145     //!                 CM_SURFACE_FORMAT_A16B16G16R16 \n
1146     //!                 CM_SURFACE_FORMAT_A16B16G16R16F \n
1147     //!                 CM_SURFACE_FORMAT_R32G32B32A32F \n
1148     //!                 CM_SURFACE_FORMAT_A8 \n
1149     //!                 CM_SURFACE_FORMAT_A8R8G8B8 \n
1150     //!                 CM_SURFACE_FORMAT_YUY2 \n
1151     //!                 CM_SURFACE_FORMAT_R32F \n
1152     //!                 CM_SURFACE_FORMAT_R32_UINT \n
1153     //!                 CM_SURFACE_FORMAT_L16 \n
1154     //!                 CM_SURFACE_FORMAT_R16G16_UNORM \n
1155     //!                 CM_SURFACE_FORMAT_R16_FLOAT \n
1156     //!                 CM_SURFACE_FORMAT_NV12 \n
1157     //!                 CM_SURFACE_FORMAT_L8 \n
1158     //!                 CM_SURFACE_FORMAT_AYUV \n
1159     //!                 CM_SURFACE_FORMAT_Y410 \n
1160     //!                 CM_SURFACE_FORMAT_Y416 \n
1161     //!                 CM_SURFACE_FORMAT_Y210 \n
1162     //!                 CM_SURFACE_FORMAT_Y216 \n
1163     //!                 CM_SURFACE_FORMAT_P010 \n
1164     //!                 CM_SURFACE_FORMAT_P016 \n
1165     //!                 CM_SURFACE_FORMAT_YV12 \n
1166     //!                 CM_SURFACE_FORMAT_411P \n
1167     //!                 CM_SURFACE_FORMAT_411R \n
1168     //!                 CM_SURFACE_FORMAT_IMC3 \n
1169     //!                 CM_SURFACE_FORMAT_I420 \n
1170     //!                 CM_SURFACE_FORMAT_422H \n
1171     //!                 CM_SURFACE_FORMAT_422V \n
1172     //!                 CM_SURFACE_FORMAT_444P \n
1173     //!                 CM_SURFACE_FORMAT_RGBP \n
1174     //!                 CM_SURFACE_FORMAT_BGRP \n
1175     //! \param      [in] surface2d
1176     //!             Pointer to CmSurface2D object.
1177     //! \param      [out] samplerSurfaceIndex
1178     //!             Reference to the pointer to SurfaceIndex object to be
1179     //!             created.
1180     //! \retval     CM_SUCCESS if the new sampler surface index is successfully
1181     //!             created.
1182     //! \retval     CM_SURFACE_FORMAT_NOT_SUPPORTED if the input surface format
1183     //!             is not list above.
1184     //! \retval     CM_EXCEED_SURFACE_AMOUNT if the total number of
1185     //!             co-existed surfaces are exceed maximum count.
1186     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1187     //! \retval     CM_FAILURE otherwise.
1188     //!
1189     CM_RT_API virtual int32_t
1190     CreateSamplerSurface2D(CmSurface2D *surface2d,
1191                            SurfaceIndex* &samplerSurfaceIndex) = 0;
1192 
1193     //!
1194     //! \brief      This function creates a sampler surface index by a given
1195     //!             CmSurface3D.
1196     //! \details    This function call doesn't create any actual surface. It
1197     //!             just binds the actual 3D surface with a virtual sampler
1198     //!             surface index. User need pass this surface index as kernel
1199     //!             argument if the surface is used for sampler, otherwise, the
1200     //!             runtime will report error if user pass the 3D surface
1201     //!             index. For the 3D surface format, for now only supports the
1202     //!             CM_SURFACE_FORMAT_A8R8G8B8 and CM_SURFACE_FORMAT_A16B16G16R16
1203     //!             formats.
1204     //! \param      [in] surface3d
1205     //!             Pointer to CmSurface3D object.
1206     //! \param      [out] samplerSurfaceIndex
1207     //!             Reference to the pointer to SurfaceIndex object to be
1208     //!             created.
1209     //! \retval     CM_SUCCESS if the sampler surface index is successfully
1210     //!             created.
1211     //! \retval     CM_SURFACE_FORMAT_NOT_SUPPORTED if the input surface format
1212     //!             is not list above.
1213     //! \retval     CM_EXCEED_SURFACE_AMOUNT if the total number of created
1214     //!             co-existed surfaces are exceed maximum count.
1215     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1216     //! \retval     CM_FAILURE otherwise.
1217     //!
1218     CM_RT_API virtual int32_t
1219     CreateSamplerSurface3D(CmSurface3D *surface3d,
1220                            SurfaceIndex* &samplerSurfaceIndex) = 0;
1221 
1222     //!
1223     //! \brief      This function destroys a sampler surface index created by
1224     //!             CreateSamplerSurface2D(), CreateSamplerSurface2DUP, or
1225     //!             CreateSamplerSurface3D().
1226     //! \details    Caller provides the reference of a pointer to the surface
1227     //!             index needs t be destoryed.
1228     //! \param      [in] samplerSurfaceIndex
1229     //!             Reference to the pointer to SurfaceIndex object to be
1230     //!             destroyed.
1231     //! \retval     CM_SUCCESS if the sampler surface index is successfully
1232     //!             destroyed.
1233     //! \retval     CM_FAILURE otherwise.
1234     //!
1235     CM_RT_API virtual int32_t
1236     DestroySamplerSurface(SurfaceIndex* &samplerSurfaceIndex) = 0;
1237 
1238     //!
1239     //! \brief      This function creates a buffer to store the message printed
1240     //!             by printf() in kernel side.
1241     //! \details    The default size of print buffer is 1M bytes. User can set
1242     //!             its size according to the length of message printed in
1243     //!             kernel and the number of threads. printf() can be used for
1244     //!             kernel debug purpose
1245     //! \param      [in] size
1246     //!             The size of print buffer in bytes.
1247     //! \retval     CM_SUCCESS if the print buffer is created successfully.
1248     //! \retval     CM_OUT_OF_HOST_MEMORY if print buffer allication is failed.
1249     //! \retval     CM_FAILURE otherwise.
1250     //! \note       Internally the print buffer occupies static buffer index 1,
1251     //!             thus only other 3 static buffers can be used by host (0, 2, 3)
1252     //!             if print functionality is enabled.
1253     //!
1254     CM_RT_API virtual int32_t
1255     InitPrintBuffer(size_t size = CM_DEFAULT_PRINT_BUFFER_SIZE) = 0;
1256 
1257     //!
1258     //! \brief      This function prints the message on the standard display
1259     //!             device that are dumped by kernel.
1260     //! \details    It should be called after the task being finished. The
1261     //!             order of printf output is not deterministic due to thread
1262     //!             scheduling and the fact that different threads may be
1263     //!             interleaved. To distinguish which thread the printf string
1264     //!             comes from, it is better to print the thread id as the
1265     //!             first value. Alternatively you could always
1266     //!             put the printf inside if statement that limits the printf to a
1267     //!             given thread. If one task has more than one kernels call
1268     //!             printf() , their outputs could mix together.
1269     //! \retval     CM_SUCCESS if the buffer is flushed successfully.
1270     //! \retval     CM_FAILURE otherwise.
1271     //!
1272     CM_RT_API virtual int32_t FlushPrintBuffer() = 0;
1273 
1274     //!
1275     //! \brief      This function creates a VEBOX object for VEBOX
1276     //!             operations (https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-skl-vol09-media_vebox.pdf).
1277     //! \details    Caller provides a reference of CmVebox pointer to get the
1278     //!             CmVebox object created from this function.
1279     //! \param      [in, out] vebox
1280     //!             the created VEBOX object.
1281     //! \retval     CM_SUCCESS if creation is successfully.
1282     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1283     //! \retval     CM_FAILURE otherwise.
1284     //!
1285     CM_RT_API virtual int32_t CreateVebox(CmVebox* &vebox) = 0;
1286 
1287     //!
1288     //! \brief      This function destroys a VEBOX object.
1289     //! \details    Caller provides a reference of CmVebox pointer to destroy.
1290     //! \param      [in, out] vebox
1291     //!             The VEBOX object to be destroyed. It will be assigned to
1292     //!             nullptr once destroy is done.
1293     //! \retval     CM_SUCCESS if creation is successfully.
1294     //! \retval     CM_NULL_POINTER if the vebox pointer is nullptr.
1295     //! \retval     CM_FAILURE otherwise.
1296     //!
1297     CM_RT_API virtual int32_t DestroyVebox(CmVebox* &vebox) = 0;
1298 
1299     //!
1300     //! \brief      It creates a CmBufferSVM of the specified size in bytes by
1301     //!             using the SVM (shared virtual memory) system memory.
1302     //!             (https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-skl-vol05-memory_views.pdf).
1303     //! \details    The SVM memory can be accessed by both CPU and GPU. The SVM
1304     //!             memory will be allocated in runtime internally(if user pass
1305     //!             nullptr pointer) or user provided (if user pass a valid
1306     //!             pointer). In both way, the memory should be page aligned
1307     //!             (4K bytes). And the staring address is returned.
1308     //! \param      [in] size
1309     //!             SVM buffer size in bytes.
1310     //! \param      [in,out] pSystMem
1311     //!             Pointer to the SVM memory starting address.
1312     //! \param      [in] accessFlag
1313     //!             Buffer access flags.
1314     //! \param      [out] bufferSVM
1315     //!             Reference to the pointer to the CmBufferSVM.
1316     //! \retval     CM_SUCCESS if the CmBufferSVM is successfully created.
1317     //! \retval     CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 1D
1318     //!             surface fails.
1319     //! \retval     CM_INVALID_WIDTH if width is less than CM_MIN_SURF_WIDTH or
1320     //!             larger than CM_MAX_1D_SURF_WIDTH.
1321     //! \retval     CM_OUT_OF_HOST_MEMORY if runtime can't allocate such size
1322     //!             SVM memory.
1323     //! \retval     CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces
1324     //!             is exceeded. The amount is the amount of the surfaces that
1325     //!             can co-exist. The amount can be obtained by querying the
1326     //!             cap CAP_BUFFER_COUNT.
1327     //! \retval     CM_FAILURE otherwise.
1328     //! \note       This API is not implemented in Linux for now.
1329     //!
1330     CM_RT_API virtual int32_t CreateBufferSVM(uint32_t size,
1331                                               void* &sysMem,
1332                                               uint32_t accessFlag,
1333                                               CmBufferSVM* &bufferSVM) = 0;
1334 
1335     //!
1336     //! \brief      Destroys CmBufferSVM object and associated SVM memory.
1337     //! \param      [in,out] bufferSVM
1338     //!             Reference to the pointer pointing to CmBufferSVM, will be
1339     //!             assigned to nullptr once it is destroyed successfully.
1340     //! \retval     CM_SUCCESS if CmBufferSVM and associated SVM meory are
1341     //!             successfully destroyed.
1342     //! \retval     CM_FAILURE otherwise.
1343     //!
1344     CM_RT_API virtual int32_t DestroyBufferSVM(CmBufferSVM* &bufferSVM) = 0;
1345 
1346     //!
1347     //! \brief      This function creates a sampler surface index by a
1348     //!             CmSurface2DUP.
1349     //! \details    This sampler surface doesn't create any actual surface,
1350     //!             and just bind the actual 2D UP (User Provided) surface
1351     //!             with a virtual sampler surface index. User need pass this
1352     //!             surface index as kernel argument if the surface is used
1353     //!             for sampler, otherwise, the runtime will report error if
1354     //!             user pass the 2D UP surface index. For the 2DUP surface
1355     //!             formats, for now  supports following formats: \n
1356     //!                 CM_SURFACE_FORMAT_A16B16G16R16 \n
1357     //!                 CM_SURFACE_FORMAT_A8 \n
1358     //!                 CM_SURFACE_FORMAT_A8R8G8B8 \n
1359     //!                 CM_SURFACE_FORMAT_YUY2 \n
1360     //!                 CM_SURFACE_FORMAT_R32F \n
1361     //!                 CM_SURFACE_FORMAT_R32_UINT \n
1362     //!                 CM_SURFACE_FORMAT_L16 \n
1363     //!                 CM_SURFACE_FORMAT_R16G16_UNORM \n
1364     //!                 CM_SURFACE_FORMAT_NV12 \n
1365     //!                 CM_SURFACE_FORMAT_L8 \n
1366     //!                 CM_SURFACE_FORMAT_AYUV \n
1367     //!                 CM_SURFACE_FORMAT_Y410 \n
1368     //!                 CM_SURFACE_FORMAT_Y416 \n
1369     //!                 CM_SURFACE_FORMAT_Y210 \n
1370     //!                 CM_SURFACE_FORMAT_Y216 \n
1371     //!                 CM_SURFACE_FORMAT_P010 \n
1372     //!                 CM_SURFACE_FORMAT_P016 \n
1373     //!                 CM_SURFACE_FORMAT_YV12 \n
1374     //!                 CM_SURFACE_FORMAT_411P \n
1375     //!                 CM_SURFACE_FORMAT_411R \n
1376     //!                 CM_SURFACE_FORMAT_IMC3 \n
1377     //!                 CM_SURFACE_FORMAT_I420 \n
1378     //!                 CM_SURFACE_FORMAT_422H \n
1379     //!                 CM_SURFACE_FORMAT_422V \n
1380     //!                 CM_SURFACE_FORMAT_444P \n
1381     //!                 CM_SURFACE_FORMAT_RGBP \n
1382     //!                 CM_SURFACE_FORMAT_BGRP \n
1383     //! \param      [in] surface2dUP
1384     //!             Pointer to CmSurface2DUP object.
1385     //! \param      [out] samplerSurfaceIndex
1386     //!             Reference to the pointer to SurfaceIndex object to be
1387     //!             created.
1388     //! \retval     CM_SUCCESS if the new sampler surface index is
1389     //!             successfully created.
1390     //! \retval     CM_NULL_POINTER if p2DUPSurface is nullptr.
1391     //! \retval     CM_SURFACE_FORMAT_NOT_SUPPORTED if the format is not supported.
1392     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1393     //! \retval     CM_FAILURE otherwise.
1394     //! \note       This API is supported for HW mode only.
1395     //!
1396     CM_RT_API virtual int32_t
1397     CreateSamplerSurface2DUP(CmSurface2DUP *surface2dUP,
1398                              SurfaceIndex* &samplerSurfaceIndex) = 0;
1399 
1400     //!
1401     //! \brief      Copies the content of source kernel to a new kernel.
1402     //! \param      [out] kernelDst
1403     //!             pointer to the destination kernel. The new pointer will be
1404     //!             returned to kernelDst.
1405     //! \param      [in] kernelSrc
1406     //!             pointer to the source kernel.
1407     //! \retval     CM_SUCCESS If the clone operation is successful.
1408     //! \retval     CM_FAILURE If the clone operation is failed.
1409     //! \note       This API is not supported in emulation mode.
1410     //!
1411     CM_RT_API virtual int32_t CloneKernel(CmKernel* &kernelDst,
1412                                           CmKernel *kernelSrc) = 0;
1413 
1414     //!
1415     //! \brief      Creates an alias to CmSurface2D.
1416     //! \details    Returns a new surface index for this surface. This API is
1417     //!             used with CmSurface2D::SetSurfaceStateParam in order
1418     //!             to reinterpret surface for different surface states,
1419     //!             i.e., the same memory is used but different width and
1420     //!             height can be programmed through the surface state.
1421     //! \param      [in] p2DSurface
1422     //!             pointer to the surface used to create an alias.
1423     //! \param      [out] aliasSurfaceIndex
1424     //!             new surface index pointing to 2D surface.
1425     //! \retval     CM_SUCCESS if alias is created successfully.
1426     //! \retval     CM_INVALID_ARG_VALUE if p2DSurface is not a valid pointer.
1427     //! \retval     CM_MAX_NUM_2D_ALIASES if try to create more than 10 aliases
1428     //!             for same surface.
1429     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1430     //! \retval     CM_FAILURE otherwise.
1431     //! \note       This API is implemented for HW and SIM modes only.
1432     //!
1433     CM_RT_API virtual int32_t
1434     CreateSurface2DAlias(CmSurface2D *p2DSurface,
1435                          SurfaceIndex* &aliasSurfaceIndex) = 0;
1436 
1437     //!
1438     //! \brief      Creates an HEVC VME surface by using the given 2D surfaces:
1439     //!             the current frame, the forward frames and, the backward
1440     //!             frames.
1441     //! \details    No extra surface is actually created. A SurfaceIndex
1442     //!             object is created instead, which is passed to CM kernel
1443     //!             function (genx_main) as argument to indicate the frame
1444     //!             surface. This can be used for Gen10 and plus platforms.
1445     //! \param      [in] currentSurface
1446     //!             Pointer to current surface (can't be nullptr).
1447     //! \param      [in] forwardSurfaces
1448     //!             Array of forward surfaces (can be nullptr if backward
1449     //!             surfaces not a nullptr).
1450     //! \param      [in] backwardSurfaces
1451     //!             Array of backward surfaces (can be nullptr if  forward
1452     //!             surfaces not a nullptr).
1453     //! \param      [in] forwardSurfaceCount
1454     //!             Count of forward surfaces, up to 4 forward surfaces can
1455     //!             be used.
1456     //! \param      [in] backwardSurfaceCount
1457     //!             Count of backward surfaces, up to 4 backward surfaces can
1458     //!             be used.
1459     //! \param      [out] vmeIndex
1460     //!             Reference to pointer to SurfaceIndex object to be created.
1461     //! \retval     CM_SUCCESS if the SurfaceIndex is successfully created.
1462     //! \retval     CM_NULL_POINTER if currentSurface is nullptr.
1463     //! \retval     CM_INVALID_ARG_VALUE if invalid surface pointers for forward
1464     //!             and backward surfaces.
1465     //! \retval     CM_EXCEED_SURFACE_AMOUNT if there is too much co-existed
1466     //!             surfaces are created. Destroying unused surfaces to solve
1467     //!             such error.
1468     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
1469     //! \retval     CM_FAILURE otherwise.
1470     //! \note       This API is only supported for Gen10 and plus platforms.
1471     //!
1472     CM_RT_API virtual int32_t
1473     CreateHevcVmeSurfaceG10(CmSurface2D *currentSurface,
1474                             CmSurface2D **forwardSurfaces,
1475                             CmSurface2D **backwardSurfaces,
1476                             const uint32_t forwardSurfaceCount,
1477                             const uint32_t backwardSurfaceCount,
1478                             SurfaceIndex* &vmeIndex) = 0;
1479 
1480     //!
1481     //! \brief      Destroys an HEVC VME surface. This can be used for Gen10.
1482     //! \param      [in] vmeIndex
1483     //!             Pointer to the SurfaceIndex of the VME surface. It will be
1484     //!             assigned to nullptr once destroy is done.
1485     //! \retval     CM_SUCCESS if the HEVC VME surface is successfully destroyed
1486     //! \retval     CM_FAILURE otherwise.
1487     //! \note       This API is only supported for Gen10 and plus platforms. \n
1488     //!             Any HEVC VME surface not destroyed by calling this function
1489     //!             explicitly will be destroyed when CmDevice is destroyed.
1490     //!
1491     CM_RT_API virtual int32_t
1492     DestroyHevcVmeSurfaceG10(SurfaceIndex* &vmeIndex) = 0;
1493 
1494     //!
1495     //! \brief      Creates a CmSampler object with border color setting.
1496     //! \param      [in] sampleState
1497     //!             Const reference to a CM_SAMPLER_STATE_EX specifying the
1498     //!             characteristics of the sampler to be created.
1499     //! \param      [out] sampler
1500     //!             Reference to the pointer to the CmSampler object.
1501     //! \retval     CM_SUCCESS if the CmSampler is successfully created.
1502     //! \retval     CM_OUT_OF_HOST_MEMORY if out of system memory.
1503     //! \retval     CM_EXCEED_SAMPLER_AMOUNT if maximum amount of sampler is
1504     //!             exceeded. The amount is the amount of the sampler that can
1505     //!             co-exist. The amount can be obtained by querying the cap
1506     //!             CAP_SAMPLER_COUNT.
1507     //! \retval     CM_FAILURE otherwise.
1508     //! \note       This API is not implemented for EMU mode. \n Point, linear,
1509     //!             and anisotropic filter types are supported for hardware and
1510     //!             simulation modes. \n Wrap, mirror, clamp and border are
1511     //!             supported in hardware and simulation modes. Clamp is
1512     //!             supported in emulation mode.
1513     //!
1514     CM_RT_API virtual int32_t
1515     CreateSamplerEx(const CM_SAMPLER_STATE_EX &sampleState,
1516                     CmSampler* &sampler) = 0;
1517 
1518     //!
1519     //! \brief      This function prints the message dumped by kernel into file
1520     //!             instead of stdout.
1521     //! \details    This function's usage is the same as
1522     //!             CmDevice::FlushPrintBuffer(). It is recommended to use this
1523     //!             interface when there are tons of messages from kernel.
1524     //! \param      [in] filename
1525     //!             name of file the message printed into.
1526     //! \retval     CM_SUCCESS if the buffer is flushed successfully into file.
1527     //! \retval     CM_FAILURE otherwise.
1528     //!
1529     CM_RT_API virtual int32_t
1530     FlushPrintBufferIntoFile(const char *filename) = 0;
1531 
1532     //!
1533     //! \brief      Creates a 3-dimensional thread group space object.
1534     //! \details    This function creates a thread group space specified by the
1535     //!             depth, height and width dimensions of the group space, and the
1536     //!             depth, height and width dimensions of the thread space within a
1537     //!             group. This information is used to execute a kernel in GPGPU pipe
1538     //!             (https://01.org/sites/default/files/documentation/intel-gfx-prm-osrc-skl-vol07-3d_media_gpgpu.pdf).
1539     //!             Relevant sample code is shown in "MDF Host Programming Guide".
1540     //! \param      [in] thrdSpaceWidth
1541     //!             width in unit of threads of each thread group.
1542     //! \param      [in] thrdSpaceHeight
1543     //!             height in unit of threads of each thread group.
1544     //! \param      [in] thrdSpaceDepth
1545     //!             depth in unit of threads of each thread group.
1546     //! \param      [in] grpSpaceWidth
1547     //!             width in unit of groups of thread group space.
1548     //! \param      [in] grpSpaceHeight
1549     //!             height in unit of groups of thread group space.
1550     //! \param      [in] grpSpaceDepth
1551     //!             depth in unit of groups of thread group space.
1552     //! \param      [out] threadGroupSpace
1553     //!             Reference to the pointer to CmThreadGroupSpace object to be
1554     //!             created.
1555     //! \retval     CM_SUCCESS if the CmThreadGroupSpace is successfully
1556     //!             created.
1557     //! \retval     CM_INVALID_THREAD_GROUP_SPACE if any input is 0 or the
1558     //!             thrdSpaceWidth is more than MAX_THREAD_SPACE_WIDTH_PERGROUP,
1559     //!             or the thrdSpaceHeight is more than
1560     //!             MAX_THREAD_SPACE_HEIGHT_PERGROUP, or the thrdSpaceDepth
1561     //!             is more than MAX_THREAD_SPACE_DEPTH_PERGROUP.
1562     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1563     //! \retval     CM_FAILURE otherwise.
1564     //! \note       The total thread count is width*height*depth*grpWidth*grpHeight*grpDepth.
1565     //!             CmKernel::SetThreadCount() calling is not necessary in this
1566     //!             GPGPU working mode. Currently, it's only used for SLM
1567     //!             enabled kernels.
1568     //!
1569     CM_RT_API virtual int32_t
1570     CreateThreadGroupSpaceEx(uint32_t thrdSpaceWidth,
1571                              uint32_t thrdSpaceHeight,
1572                              uint32_t thrdSpaceDepth,
1573                              uint32_t grpSpaceWidth,
1574                              uint32_t grpSpaceHeight,
1575                              uint32_t grpSpaceDepth,
1576                              CmThreadGroupSpace* &threadGroupSpace) = 0;
1577 
1578     //!
1579     //! \brief      Creates a CmSampler8x8 surface by using given 2D surface
1580     //!             and given flags.
1581     //! \details    The function indicates the 2D surface is used for sampler
1582     //!             8x8; no extra surface is actually created. A SurfaceIndex
1583     //!             object is created instead, which is passed to CM kernel
1584     //!             function(genx_main) as argument to indicate the surface for
1585     //!             sampler 8x8. Compared to CmDeive::CreateSampler8x8Surface,
1586     //!             this API is used to support rotation and chroma siting for
1587     //!             MediaSampler.
1588     //! \param      [in] surface2d
1589     //!             Pointer to CmSurface2D.
1590     //! \param      [out] sampler8x8SurfIndex
1591     //!             Reference to pointer to SurfaceIndex.
1592     //! \param      [in] surfType
1593     //!             Enumeration data type of CM_SAMPLER8x8_SURFACE.
1594     //! \param      [in] addressControl
1595     //!             Enumeration data type of CM_SURFACE_ADDRESS_CONTROL_MODE.
1596     //! \param      [in] flag
1597     //!             Pointer to CM_FLAG.
1598     //! \retval     CM_SUCCESS if the CmSampler8x8 surface is successfully
1599     //!             created.
1600     //! \retval     CM_EXCEED_SURFACE_AMOUNT if there is too many co-existed
1601     //!             surfaces and exceed the maximum number. Destroying some
1602     //!             unused surfaces could solve this error.
1603     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory
1604     //! \retval     CM_FAILURE otherwise.
1605     //! \note       This API is not supported in emulation mode.
1606     //!
1607     CM_RT_API virtual int32_t
1608     CreateSampler8x8SurfaceEx(CmSurface2D *surface2d,
1609                               SurfaceIndex* &sampler8x8SurfIndex,
1610                               CM_SAMPLER8x8_SURFACE surfType = CM_VA_SURFACE,
1611                               CM_SURFACE_ADDRESS_CONTROL_MODE addressControl
1612                                   = CM_SURFACE_CLAMP,
1613                               CM_FLAG *flag = nullptr) = 0;
1614 
1615     //!
1616     //! \brief      Creates sampler surface by using given 2D surface and flags.
1617     //! \details    This sampler surface does't create any actual surface, and
1618     //!             just bind the actual 2D surface with a virtual sampler
1619     //!             surface index. User need pass this surface index as kernel
1620     //!             argument if the surface is used for sampler, otherwise,
1621     //!             the runtime will report error if user pass the 2D surface
1622     //!             index. Compared to CmDevice::CreateSampler8x8Surface, this
1623     //!             API is used to support rotation for 3D sampler. For given
1624     //!             surface's formats, for now, we support following: \n
1625     //!                 CM_SURFACE_FORMAT_A16B16G16R16 \n
1626     //!                 CM_SURFACE_FORMAT_A16B16G16R16F \n
1627     //!                 CM_SURFACE_FORMAT_R32G32B32A32F \n
1628     //!                 CM_SURFACE_FORMAT_A8 \n
1629     //!                 CM_SURFACE_FORMAT_A8R8G8B8 \n
1630     //!                 CM_SURFACE_FORMAT_YUY2 \n
1631     //!                 CM_SURFACE_FORMAT_R32F \n
1632     //!                 CM_SURFACE_FORMAT_R32_UINT \n
1633     //!                 CM_SURFACE_FORMAT_L16 \n
1634     //!                 CM_SURFACE_FORMAT_R16G16_UNORM \n
1635     //!                 CM_SURFACE_FORMAT_R16_FLOAT \n
1636     //!                 CM_SURFACE_FORMAT_NV12 \n
1637     //!                 CM_SURFACE_FORMAT_L8 \n
1638     //!                 CM_SURFACE_FORMAT_AYUV \n
1639     //!                 CM_SURFACE_FORMAT_Y410 \n
1640     //!                 CM_SURFACE_FORMAT_Y416 \n
1641     //!                 CM_SURFACE_FORMAT_Y210 \n
1642     //!                 CM_SURFACE_FORMAT_Y216 \n
1643     //!                 CM_SURFACE_FORMAT_P010 \n
1644     //!                 CM_SURFACE_FORMAT_P016 \n
1645     //!                 CM_SURFACE_FORMAT_YV12 \n
1646     //!                 CM_SURFACE_FORMAT_411P \n
1647     //!                 CM_SURFACE_FORMAT_411R \n
1648     //!                 CM_SURFACE_FORMAT_IMC3 \n
1649     //!                 CM_SURFACE_FORMAT_I420 \n
1650     //!                 CM_SURFACE_FORMAT_422H \n
1651     //!                 CM_SURFACE_FORMAT_422V \n
1652     //!                 CM_SURFACE_FORMAT_444P \n
1653     //!                 CM_SURFACE_FORMAT_RGBP \n
1654     //!                 CM_SURFACE_FORMAT_BGRP \n
1655     //! \param      [in] surface2d
1656     //!             Pointer to CmSurface2D object.
1657     //! \param      [out] samplerSurfaceIndex
1658     //!             Reference to the pointer to SurfaceIndex object to be
1659     //!             created.
1660     //! \param      [in] flag
1661     //!             Pointer to CM_FLAG.
1662     //! \retval     CM_SUCCESS if the new sampler surface index is
1663     //!             successfully created.
1664     //! \retval     CM_SURFACE_FORMAT_NOT_SUPPORTED if the input surface format
1665     //!             is not list above.
1666     //! \retval     CM_EXCEED_SURFACE_AMOUNT if the total number of created
1667     //!             co-existed surfaces are exceed maximum count.
1668     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1669     //! \retval     CM_FAILURE otherwise.
1670     //! \note       This API is not supported in emulation mode.
1671     //!
1672     CM_RT_API virtual int32_t
1673     CreateSamplerSurface2DEx(CmSurface2D *surface2d,
1674                              SurfaceIndex* &samplerSurfaceIndex,
1675                              CM_FLAG *flag = nullptr) = 0;
1676 
1677     //!
1678     //! \brief      Creates an alias to CmBuffer.
1679     //! \details    Returns a new surface index for this surface. This API is
1680     //!             used with CmBuffer::SetSurfaceStateParam in order
1681     //!             to reinterpret buffer for different surface states,
1682     //!             i.e., the same memory is used but different size
1683     //!             can be programmed through the surface state.
1684     //! \param      [in] buffer
1685     //!             pointer to CmBuffer object used to create an alias.
1686     //! \param      [out] aliasIndex
1687     //! \retval     CM_SUCCESS if alias is created successfully.
1688     //!             new surface index pointing to CmBuffer.
1689     //! \retval     CM_EXCEED_MAX_NUM_BUFFER_ALIASES if try to create more
1690     //!             than 10 aliases for same surface.
1691     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory.
1692     //! \retval     CM_FAILURE if alias cannot be created.
1693     //! \note       This API is not implemented for EMU mode.
1694     //!
1695     CM_RT_API virtual int32_t
1696     CreateBufferAlias(CmBuffer *buffer,
1697                       SurfaceIndex* &aliasIndex) = 0;
1698 
1699     //!
1700     //! \brief      Sets the width and height values in the VME surface state.
1701     //! \param      [in] vmeIndex
1702     //!             Pointer to VME surface index.
1703     //! \param      [in] surfStateParam
1704     //!             Pointer to CM_VME_SURFACE_STATE_PARAM to set width and
1705     //!             height of this surface
1706     //! \retval     CM_SUCCESS if setting VME surface state values successfully.
1707     //! \retval     CM_INVALID_ARG_VALUE if invalid input.
1708     //! \note       This API will work on HW and SIM modes.
1709     //!
1710     CM_RT_API virtual int32_t
1711     SetVmeSurfaceStateParam(SurfaceIndex *vmeIndex,
1712                             CM_VME_SURFACE_STATE_PARAM *surfStateParam) = 0;
1713 
1714     //!
1715     //! \brief      Gets the VISA version up-to which IGC supports.
1716     //! \param      [out] majorVersion
1717     //!             The major Version of VISA.
1718     //! \param      [out] minorVersion
1719     //!             The minor Version of VISA.
1720     //! \retval     CM_SUCCESS if get the right VISA version.
1721     //! \retval     CM_JITDLL_LOAD_FAILURE if loading igc library is failed.
1722     //! \retval     CM_FAILURE otherwise.
1723     //! \note       This API is implemented in hardware mode only.
1724     //!
1725     CM_RT_API virtual int32_t GetVISAVersion(uint32_t &majorVersion,
1726                                              uint32_t &minorVersion) = 0;
1727 
1728     //!
1729     //! \brief      Creates a CmQueue object with option.
1730     //! \param      [out] queue
1731     //!             Pointer to the CmQueue object created.
1732     //! \param      [in] QueueCreateOption
1733     //!             The option to create a queue. The sturcture of the
1734     //!             <b>QueueCreateOption</b> is:\n
1735     //!             \code
1736     //!             struct CM_QUEUE_CREATE_OPTION
1737     //!             {
1738     //!                 CM_QUEUE_TYPE QueueType : 3;
1739     //!                 bool RA       : 1;
1740     //!                 unsigned int Reserved0  : 3;
1741     //!                 bool UserGPUContext     : 1;
1742     //!                 unsigned int GPUContext : 8;
1743     //!                 unsigned int Reserved2  : 16;
1744     //!             }
1745     //!             \endcode
1746     //!             \n
1747     //!             <b>CM_QUEUE_TYPE</b> indicates which engine the queue will
1748     //!             be created for:\n
1749     //!             \code
1750     //!             enum CM_QUEUE_TYPE
1751     //!             {
1752     //!                 CM_QUEUE_TYPE_NONE      = 0,
1753     //!                 CM_QUEUE_TYPE_RENDER    = 1,
1754     //!                 CM_QUEUE_TYPE_COMPUTE   = 2,
1755     //!                 CM_QUEUE_TYPE_VEBOX     = 3
1756     //!             };
1757     //!             \endcode
1758     //!             \n
1759     //!             <b>RAMode</b> decides if the queue will occupy GPU
1760     //!             exclusively during execution.\n
1761     //!             <b>UserGPUContext</b> indicates if the user wants to
1762     //!             provide an existing MOS GPU Context.\n
1763     //!             <b>GPUContext</b> is the existing MOS GPU Context Enum
1764     //!             value.
1765     //!             \n
1766     //!             <b>CM_QUEUE_SSEU_USAGE_HINT_TYPE</b> indicates SSEU setting, will
1767     //!             be created for:\n
1768     //!             \code
1769     //!             enum CM_QUEUE_SSEU_USAGE_HINT_TYPE
1770     //!             {
1771     //!                 CM_QUEUE_SSEU_USAGE_HINT_DEFAULT = 0,
1772     //!                 CM_QUEUE_SSEU_USAGE_HINT_VME     = 1
1773     //!             };
1774     //!             \endcode
1775     //! \retval     CM_SUCCESS if the CmQueue object is created.
1776     //! \note       This API is implemented in hardware mode only. Only
1777     //!             CM_QUEUE_TYPE_RENDER and CM_QUEUE_TYPE_COMPUTE are
1778     //!             implemented at this moment.
1779     //!
1780     CM_RT_API virtual int32_t
1781     CreateQueueEx(CmQueue *&queue,
1782                   CM_QUEUE_CREATE_OPTION QueueCreateOption
1783                       = CM_DEFAULT_QUEUE_CREATE_OPTION) = 0;
1784 
1785     //!
1786     //! \brief    Update the MOS Resource in the CmBuffer. If surface is null,
1787     //!            creates a new CmBuffer
1788     //! \details  CmBuffer is a wrapper of that MOS resource. This Mos resource is
1789     //!            owned by caller.
1790     //! \param    [in] mosResource
1791     //!           pointer to MOS resource.
1792     //! \param    [in,out] surface
1793     //!           reference to pointer of surface to be created.
1794     //! \param    [in] mosUsage
1795     //!           The selected pre-defined MOS usage of memory object control cache setting
1796     //! \retval   CM_SUCCESS if the CmBuffer is successfully created.
1797     //! \retval   CM_INVALID_MOS_RESOURCE_HANDLE if mosResource is nullptr.
1798     //! \retval   CM_OUT_OF_HOST_MEMORY if out of system memory
1799     //! \retval   CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces is exceeded.
1800     //! \retval   CM_FAILURE otherwise
1801     //!
1802     CM_RT_API virtual int32_t UpdateBuffer(PMOS_RESOURCE mosResource, CmBuffer* &surface,
1803                                            MOS_HW_RESOURCE_DEF mosUsage = MOS_CM_RESOURCE_USAGE_SurfaceState) = 0;
1804 
1805     //!
1806     //! \brief    Update the MOS Resource in the CmSurface2D. If surface is null,
1807     //!            creates a new CmSurface2D
1808     //! \details  CmSurface2D is a wrapper of that MOS resource. This Mos resource is
1809     //!            owned by caller.
1810     //! \param    [in] mosResource
1811     //!           pointer to MOS resource.
1812     //! \param    [in,out] surface
1813     //!           reference to pointer of surface to be created.
1814     //! \param    [in] mosUsage
1815     //!           The selected pre-defined MOS usage of memory object control cache setting
1816     //! \retval   CM_SUCCESS if the CmSurface2D is successfully created.
1817     //! \retval   CM_INVALID_MOS_RESOURCE_HANDLE if pMosResrouce is nullptr.
1818     //! \retval   CM_EXCEED_SURFACE_AMOUNT if maximum amount of 2D surfaces
1819     //!           is exceeded.
1820     //! \retval   CM_FAILURE otherwise.
1821     //!
1822     CM_RT_API virtual int32_t UpdateSurface2D(PMOS_RESOURCE mosResource, CmSurface2D* &surface,
1823                                               MOS_HW_RESOURCE_DEF mosUsage = MOS_CM_RESOURCE_USAGE_SurfaceState) = 0;
1824 
1825     //!
1826     //! \brief      Creates a CmSampler8x8 surface from Surface2D alias.
1827     //! \details    Creates a CmSampler8x8 surface by using the given 2D surface
1828     //!             alias.
1829     //!             No extra surface is actually created. A SurfaceIndex
1830     //!             object is created instead, which is passed to CM kernel
1831     //!             function (genx_main) as an argument to indicate the surface
1832     //!             for AVS.
1833     //! \param      [in] originalSurface
1834     //!             Pointer to the original CmSurface2D object.
1835     //! \param      [in] aliasIndex
1836     //!             Surface alias upon which the output surface index is
1837     //!             created.
1838     //! \param      [in] addressControl
1839     //!             Enumerator specifying address control mode used by AVS.
1840     //! \param      [out] sampler8x8SurfaceIndex
1841     //!             Sampler8x8 surface index created by this function.
1842     //! \retval     CM_SUCCESS if the CmSampler8x8 surface is successfully
1843     //!             created.
1844     //! \retval     CM_EXCEED_SURFACE_AMOUNT if there are too many surfaces,
1845     //!             exceeding the maximum limit,
1846     //! \retval     CM_OUT_OF_HOST_MEMORY if out of host memory,
1847     //! \retval     CM_FAILURE otherwise.
1848     //!
1849     CM_RT_API virtual int32_t
1850     CreateSampler8x8SurfaceFromAlias(
1851         CmSurface2D *originalSurface,
1852         SurfaceIndex *aliasIndex,
1853         CM_SURFACE_ADDRESS_CONTROL_MODE addressControl,
1854         SurfaceIndex* &sampler8x8SurfaceIndex) = 0;
1855 
1856     //!
1857     //! \brief      It creates a CmBufferStateless of the specified size in bytes by
1858     //!             using the vedio memory or the system memory.
1859     //! \details    The stateless buffer means it is stateless-accessed by GPU. There
1860     //!             are two ways to create a stateless buffer. One is to create from
1861     //!             vedio memory, then it can be only accessed by GPU. The other way is
1862     //!             to create from system memory, then it can be accessed by both GPU
1863     //!             and CPU. In this way, The system memory will be allocated in runtime
1864     //!             internally(if user pass nullptr pointer) or user provided (if user
1865     //!             pass a valid pointer). And the system memory should be page aligned
1866     //!             (4K bytes).
1867     //! \param      [in] size
1868     //!             Stateless buffer size in bytes.
1869     //! \param      [in] option
1870     //!             Stateless buffer create option.
1871     //! \param      [in] sysMem
1872     //!             Pointer to user provided system memory if option is system memory.
1873     //! \param      [out] pSurface
1874     //!             Reference to the pointer to the CmBufferStateless.
1875     //! \retval     CM_SUCCESS if the CmBufferStateless is successfully created.
1876     //! \retval     CM_SURFACE_ALLOCATION_FAILURE if creating the underneath 1D
1877     //!             surface fails.
1878     //! \retval     CM_OUT_OF_HOST_MEMORY if runtime can't allocate such size
1879     //!             system memory.
1880     //! \retval     CM_EXCEED_SURFACE_AMOUNT if maximum amount of 1D surfaces
1881     //!             is exceeded. The amount is the amount of the surfaces that
1882     //!             can co-exist. The amount can be obtained by querying the
1883     //!             cap CAP_BUFFER_COUNT.
1884     //! \retval     CM_INVALID_CREATE_OPTION_FOR_BUFFER_STATELESS if option is invalid.
1885     //! \retval     CM_FAILURE otherwise.
1886     CM_RT_API virtual int32_t CreateBufferStateless(size_t size,
1887                                                     uint32_t option,
1888                                                     void *sysMem,
1889                                                     CmBufferStateless *&bufferStateless) = 0;
1890 
1891     //!
1892     //! \brief      Destroy CmBufferStateless object and associated vedio/system memory.
1893     //! \param      [in,out] pSurface
1894     //!             Reference to the pointer pointing to CmBufferStateless, will be
1895     //!             assigned to nullptr once it is destroyed successfully.
1896     //! \retval     CM_SUCCESS if CmBufferStateless and associated vedio/system memory are
1897     //!             successfully destroyed.
1898     //! \retval     CM_FAILURE otherwise.
1899     //!
1900     CM_RT_API virtual int32_t DestroyBufferStateless(CmBufferStateless* &bufferStateless) = 0;
1901 
1902 };
1903 }; //namespace
1904 
1905 #endif  // #ifndef MEDIADRIVER_LINUX_COMMON_CM_CMDEVICE_H_
1906