xref: /netbsd-src/external/gpl3/gcc/dist/include/hsa_ext_image.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 2014-2020 Advanced Micro Devices Inc.  All rights reserved.
4 //
5 // Permission is hereby granted, free of charge, to any person or organization
6 // obtaining a copy of the software and accompanying documentation covered by
7 // this license (the "Software") to use, reproduce, display, distribute,
8 // execute, and transmit the Software, and to prepare derivative works of the
9 // Software, and to permit third-parties to whom the Software is furnished to
10 // do so, all subject to the following:
11 //
12 // The copyright notices in the Software and this entire statement, including
13 // the above license grant, this restriction and the following disclaimer,
14 // must be included in all copies of the Software, in whole or in part, and
15 // all derivative works of the Software, unless such copies or derivative
16 // works are solely in the form of machine-executable object code generated by
17 // a source language processor.
18 //
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
22 // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
23 // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
24 // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 // DEALINGS IN THE SOFTWARE.
26 //
27 ////////////////////////////////////////////////////////////////////////////////
28 
29 #ifndef HSA_EXT_IMAGE_H
30 #define HSA_EXT_IMAGE_H
31 
32 #include "hsa.h"
33 
34 #undef HSA_API
35 #ifdef HSA_EXPORT_IMAGES
36 #define HSA_API HSA_API_EXPORT
37 #else
38 #define HSA_API HSA_API_IMPORT
39 #endif
40 
41 #ifdef __cplusplus
42 extern "C" {
43 #endif /*__cplusplus*/
44 
45 /** \defgroup ext-images Images and Samplers
46  *  @{
47  */
48 
49 /**
50  * @brief Enumeration constants added to ::hsa_status_t by this extension.
51  *
52  * @remark Additions to hsa_status_t
53  */
54 enum {
55     /**
56      * Image format is not supported.
57      */
58     HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED = 0x3000,
59     /**
60      * Image size is not supported.
61      */
62     HSA_EXT_STATUS_ERROR_IMAGE_SIZE_UNSUPPORTED = 0x3001,
63     /**
64      * Image pitch is not supported or invalid.
65      */
66     HSA_EXT_STATUS_ERROR_IMAGE_PITCH_UNSUPPORTED = 0x3002,
67     /**
68      * Sampler descriptor is not supported or invalid.
69      */
70     HSA_EXT_STATUS_ERROR_SAMPLER_DESCRIPTOR_UNSUPPORTED = 0x3003
71 };
72 
73 /**
74  * @brief Enumeration constants added to ::hsa_agent_info_t by this
75  * extension.
76  *
77  * @remark Additions to hsa_agent_info_t
78  */
79 enum {
80   /**
81    * Maximum number of elements in 1D images. Must be at least 16384. The type
82    * of this attribute is size_t.
83    */
84   HSA_EXT_AGENT_INFO_IMAGE_1D_MAX_ELEMENTS = 0x3000,
85   /**
86    * Maximum number of elements in 1DA images. Must be at least 16384. The type
87    * of this attribute is size_t.
88    */
89   HSA_EXT_AGENT_INFO_IMAGE_1DA_MAX_ELEMENTS = 0x3001,
90   /**
91    * Maximum number of elements in 1DB images. Must be at least 65536. The type
92    * of this attribute is size_t.
93    */
94   HSA_EXT_AGENT_INFO_IMAGE_1DB_MAX_ELEMENTS = 0x3002,
95   /**
96    * Maximum dimensions (width, height) of 2D images, in image elements. The X
97    * and Y maximums must be at least 16384. The type of this attribute is
98    * size_t[2].
99    */
100   HSA_EXT_AGENT_INFO_IMAGE_2D_MAX_ELEMENTS = 0x3003,
101   /**
102    * Maximum dimensions (width, height) of 2DA images, in image elements. The X
103    * and Y maximums must be at least 16384. The type of this attribute is
104    * size_t[2].
105    */
106   HSA_EXT_AGENT_INFO_IMAGE_2DA_MAX_ELEMENTS = 0x3004,
107   /**
108    * Maximum dimensions (width, height) of 2DDEPTH images, in image
109    * elements. The X and Y maximums must be at least 16384. The type of this
110    * attribute is size_t[2].
111    */
112   HSA_EXT_AGENT_INFO_IMAGE_2DDEPTH_MAX_ELEMENTS = 0x3005,
113   /**
114    * Maximum dimensions (width, height) of 2DADEPTH images, in image
115    * elements. The X and Y maximums must be at least 16384. The type of this
116    * attribute is size_t[2].
117    */
118   HSA_EXT_AGENT_INFO_IMAGE_2DADEPTH_MAX_ELEMENTS = 0x3006,
119   /**
120    * Maximum dimensions (width, height, depth) of 3D images, in image
121    * elements. The maximum along any dimension must be at least 2048. The type
122    * of this attribute is size_t[3].
123    */
124   HSA_EXT_AGENT_INFO_IMAGE_3D_MAX_ELEMENTS = 0x3007,
125   /**
126    * Maximum number of image layers in a image array. Must be at least 2048. The
127    * type of this attribute is size_t.
128    */
129   HSA_EXT_AGENT_INFO_IMAGE_ARRAY_MAX_LAYERS = 0x3008,
130   /**
131    * Maximum number of read-only image handles that can be created for an agent at any one
132    * time. Must be at least 128. The type of this attribute is size_t.
133    */
134   HSA_EXT_AGENT_INFO_MAX_IMAGE_RD_HANDLES = 0x3009,
135   /**
136    * Maximum number of write-only and read-write image handles (combined) that
137    * can be created for an agent at any one time. Must be at least 64. The type of this
138    * attribute is size_t.
139    */
140   HSA_EXT_AGENT_INFO_MAX_IMAGE_RORW_HANDLES = 0x300A,
141   /**
142    * Maximum number of sampler handlers that can be created for an agent at any one
143    * time. Must be at least 16. The type of this attribute is size_t.
144    */
145   HSA_EXT_AGENT_INFO_MAX_SAMPLER_HANDLERS = 0x300B,
146   /**
147    * Image pitch alignment. The agent only supports linear image data
148    * layouts with a row pitch that is a multiple of this value. Must be
149    * a power of 2. The type of this attribute is size_t.
150    */
151   HSA_EXT_AGENT_INFO_IMAGE_LINEAR_ROW_PITCH_ALIGNMENT = 0x300C
152 };
153 
154 /**
155  * @brief Image handle, populated by ::hsa_ext_image_create or
156  * ::hsa_ext_image_create_with_layout. Image
157  * handles are only unique within an agent, not across agents.
158  *
159  */
160 typedef struct hsa_ext_image_s {
161   /**
162    *  Opaque handle. For a given agent, two handles reference the same object of
163    *  the enclosing type if and only if they are equal.
164    */
165     uint64_t handle;
166 
167 } hsa_ext_image_t;
168 
169 /**
170  * @brief Geometry associated with the image. This specifies the
171  * number of image dimensions and whether the image is an image
172  * array. See the <em>Image Geometry</em> section in the <em>HSA
173  * Programming Reference Manual</em> for definitions on each
174  * geometry. The enumeration values match the BRIG type @p
175  * hsa_ext_brig_image_geometry_t.
176  */
177 typedef enum {
178 /**
179    * One-dimensional image addressed by width coordinate.
180    */
181   HSA_EXT_IMAGE_GEOMETRY_1D = 0,
182 
183   /**
184    * Two-dimensional image addressed by width and height coordinates.
185    */
186   HSA_EXT_IMAGE_GEOMETRY_2D = 1,
187 
188   /**
189    * Three-dimensional image addressed by width, height, and depth coordinates.
190    */
191   HSA_EXT_IMAGE_GEOMETRY_3D = 2,
192 
193   /**
194    * Array of one-dimensional images with the same size and format. 1D arrays
195    * are addressed by width and index coordinate.
196    */
197   HSA_EXT_IMAGE_GEOMETRY_1DA = 3,
198 
199   /**
200    * Array of two-dimensional images with the same size and format. 2D arrays
201    * are addressed by width,  height, and index coordinates.
202    */
203   HSA_EXT_IMAGE_GEOMETRY_2DA = 4,
204 
205   /**
206    * One-dimensional image addressed by width coordinate. It has
207    * specific restrictions compared to ::HSA_EXT_IMAGE_GEOMETRY_1D. An
208    * image with an opaque image data layout will always use a linear
209    * image data layout, and one with an explicit image data layout
210    * must specify ::HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR.
211    */
212   HSA_EXT_IMAGE_GEOMETRY_1DB = 5,
213 
214   /**
215    * Two-dimensional depth image addressed by width and height coordinates.
216    */
217   HSA_EXT_IMAGE_GEOMETRY_2DDEPTH = 6,
218 
219   /**
220    * Array of two-dimensional depth images with the same size and format. 2D
221    * arrays are addressed by width, height, and index coordinates.
222    */
223   HSA_EXT_IMAGE_GEOMETRY_2DADEPTH = 7
224 } hsa_ext_image_geometry_t;
225 
226 /**
227  * @brief Channel type associated with the elements of an image. See
228  * the <em>Channel Type</em> section in the <em>HSA Programming Reference
229  * Manual</em> for definitions on each channel type. The
230  * enumeration values and definition match the BRIG type @p
231  * hsa_ext_brig_image_channel_type_t.
232  */
233 typedef enum {
234     HSA_EXT_IMAGE_CHANNEL_TYPE_SNORM_INT8 = 0,
235     HSA_EXT_IMAGE_CHANNEL_TYPE_SNORM_INT16 = 1,
236     HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT8 = 2,
237     HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT16 = 3,
238     HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_INT24 = 4,
239     HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_555 = 5,
240     HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_565 = 6,
241     HSA_EXT_IMAGE_CHANNEL_TYPE_UNORM_SHORT_101010 = 7,
242     HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT8 = 8,
243     HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT16 = 9,
244     HSA_EXT_IMAGE_CHANNEL_TYPE_SIGNED_INT32 = 10,
245     HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT8 = 11,
246     HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT16 = 12,
247     HSA_EXT_IMAGE_CHANNEL_TYPE_UNSIGNED_INT32 = 13,
248     HSA_EXT_IMAGE_CHANNEL_TYPE_HALF_FLOAT = 14,
249     HSA_EXT_IMAGE_CHANNEL_TYPE_FLOAT = 15
250 } hsa_ext_image_channel_type_t;
251 
252 /**
253  * @brief A fixed-size type used to represent ::hsa_ext_image_channel_type_t constants.
254  */
255 typedef uint32_t hsa_ext_image_channel_type32_t;
256 
257 /**
258  *
259  * @brief Channel order associated with the elements of an image. See
260  * the <em>Channel Order</em> section in the <em>HSA Programming Reference
261  * Manual</em> for definitions on each channel order. The
262  * enumeration values match the BRIG type @p
263  * hsa_ext_brig_image_channel_order_t.
264  */
265 typedef enum {
266     HSA_EXT_IMAGE_CHANNEL_ORDER_A = 0,
267     HSA_EXT_IMAGE_CHANNEL_ORDER_R = 1,
268     HSA_EXT_IMAGE_CHANNEL_ORDER_RX = 2,
269     HSA_EXT_IMAGE_CHANNEL_ORDER_RG = 3,
270     HSA_EXT_IMAGE_CHANNEL_ORDER_RGX = 4,
271     HSA_EXT_IMAGE_CHANNEL_ORDER_RA = 5,
272     HSA_EXT_IMAGE_CHANNEL_ORDER_RGB = 6,
273     HSA_EXT_IMAGE_CHANNEL_ORDER_RGBX = 7,
274     HSA_EXT_IMAGE_CHANNEL_ORDER_RGBA = 8,
275     HSA_EXT_IMAGE_CHANNEL_ORDER_BGRA = 9,
276     HSA_EXT_IMAGE_CHANNEL_ORDER_ARGB = 10,
277     HSA_EXT_IMAGE_CHANNEL_ORDER_ABGR = 11,
278     HSA_EXT_IMAGE_CHANNEL_ORDER_SRGB = 12,
279     HSA_EXT_IMAGE_CHANNEL_ORDER_SRGBX = 13,
280     HSA_EXT_IMAGE_CHANNEL_ORDER_SRGBA = 14,
281     HSA_EXT_IMAGE_CHANNEL_ORDER_SBGRA = 15,
282     HSA_EXT_IMAGE_CHANNEL_ORDER_INTENSITY = 16,
283     HSA_EXT_IMAGE_CHANNEL_ORDER_LUMINANCE = 17,
284     HSA_EXT_IMAGE_CHANNEL_ORDER_DEPTH = 18,
285     HSA_EXT_IMAGE_CHANNEL_ORDER_DEPTH_STENCIL = 19
286 } hsa_ext_image_channel_order_t;
287 
288 /**
289  * @brief A fixed-size type used to represent ::hsa_ext_image_channel_order_t constants.
290  */
291 typedef uint32_t hsa_ext_image_channel_order32_t;
292 
293 
294 /**
295  * @brief Image format.
296  */
297 typedef struct hsa_ext_image_format_s {
298   /**
299     * Channel type.
300     */
301     hsa_ext_image_channel_type32_t channel_type;
302 
303    /**
304     * Channel order.
305     */
306     hsa_ext_image_channel_order32_t channel_order;
307 } hsa_ext_image_format_t;
308 
309 /**
310  * @brief Implementation independent image descriptor.
311  */
312 typedef struct hsa_ext_image_descriptor_s {
313     /**
314      * Image geometry.
315      */
316     hsa_ext_image_geometry_t geometry;
317     /**
318      * Width of the image, in components.
319      */
320     size_t width;
321     /**
322      * Height of the image, in components. Only used if the geometry is
323      * ::HSA_EXT_IMAGE_GEOMETRY_2D, ::HSA_EXT_IMAGE_GEOMETRY_3D,
324      * HSA_EXT_IMAGE_GEOMETRY_2DA, HSA_EXT_IMAGE_GEOMETRY_2DDEPTH, or
325      * HSA_EXT_IMAGE_GEOMETRY_2DADEPTH, otherwise must be 0.
326      */
327     size_t height;
328     /**
329      * Depth of the image, in components. Only used if the geometry is
330      * ::HSA_EXT_IMAGE_GEOMETRY_3D, otherwise must be 0.
331      */
332     size_t depth;
333     /**
334      * Number of image layers in the image array. Only used if the geometry is
335      * ::HSA_EXT_IMAGE_GEOMETRY_1DA, ::HSA_EXT_IMAGE_GEOMETRY_2DA, or
336      * HSA_EXT_IMAGE_GEOMETRY_2DADEPTH, otherwise must be 0.
337      */
338     size_t array_size;
339     /**
340      * Image format.
341      */
342     hsa_ext_image_format_t format;
343 } hsa_ext_image_descriptor_t;
344 
345 /**
346  * @brief Image capability.
347  */
348 typedef enum  {
349    /**
350     * Images of this geometry, format, and layout are not supported by
351     * the agent.
352     */
353     HSA_EXT_IMAGE_CAPABILITY_NOT_SUPPORTED = 0x0,
354    /**
355     * Read-only images of this geometry, format, and layout are
356     * supported by the agent.
357     */
358     HSA_EXT_IMAGE_CAPABILITY_READ_ONLY = 0x1,
359    /**
360     * Write-only images of this geometry, format, and layout are
361     * supported by the agent.
362     */
363     HSA_EXT_IMAGE_CAPABILITY_WRITE_ONLY = 0x2,
364    /**
365     * Read-write images of this geometry, format, and layout are
366     * supported by the agent.
367     */
368     HSA_EXT_IMAGE_CAPABILITY_READ_WRITE = 0x4,
369    /**
370     * @deprecated Images of this geometry, format, and layout can be accessed from
371     * read-modify-write atomic operations in the agent.
372     */
373     HSA_EXT_IMAGE_CAPABILITY_READ_MODIFY_WRITE = 0x8,
374     /**
375     * Images of this geometry, format, and layout are guaranteed to
376     * have a consistent data layout regardless of how they are
377     * accessed by the associated agent.
378     */
379     HSA_EXT_IMAGE_CAPABILITY_ACCESS_INVARIANT_DATA_LAYOUT = 0x10
380 } hsa_ext_image_capability_t;
381 
382 /**
383  * @brief Image data layout.
384  *
385  * @details An image data layout denotes such aspects of image data
386  * layout as tiling and organization of channels in memory. Some image
387  * data layouts may only apply to specific image geometries, formats,
388  * and access permissions. Different agents may support different
389  * image layout identifiers, including vendor specific layouts. Note
390  * that an agent may not support the same image data layout for
391  * different access permissions to images with the same image
392  * geometry, size, and format. If multiple agents support the same
393  * image data layout then it is possible to use separate image handles
394  * for each agent that references the same image data.
395  */
396 
397 typedef enum  {
398    /**
399     * An implementation specific opaque image data layout which can
400     * vary depending on the agent, geometry, image format, image size,
401     * and access permissions.
402     */
403     HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE = 0x0,
404    /**
405     * The image data layout is specified by the following rules in
406     * ascending byte address order. For a 3D image, 2DA image array,
407     * or 1DA image array, the image data is stored as a linear sequence
408     * of adjacent 2D image slices, 2D images, or 1D images
409     * respectively, spaced according to the slice pitch. Each 2D image
410     * is stored as a linear sequence of adjacent image rows, spaced
411     * according to the row pitch. Each 1D or 1DB image is stored as a
412     * single image row. Each image row is stored as a linear sequence
413     * of image elements. Each image element is stored as a linear
414     * sequence of image components specified by the left to right
415     * channel order definition. Each image component is stored using
416     * the memory type specified by the channel type.
417     *
418     * The 1DB image geometry always uses the linear image data layout.
419     */
420     HSA_EXT_IMAGE_DATA_LAYOUT_LINEAR = 0x1
421 } hsa_ext_image_data_layout_t;
422 
423 /**
424  * @brief Retrieve the supported image capabilities for a given combination of
425  * agent, geometry, and image format for an image created with an opaque image
426  * data layout.
427  *
428  * @param[in] agent Agent to be associated with the image handle.
429  *
430  * @param[in] geometry Geometry.
431  *
432  * @param[in] image_format Pointer to an image format. Must not be NULL.
433  *
434  * @param[out] capability_mask Pointer to a memory location where the HSA
435  * runtime stores a bit-mask of supported image capability
436  * (::hsa_ext_image_capability_t) values. Must not be NULL.
437  *
438  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
439  *
440  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
441  * initialized.
442  *
443  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
444  *
445  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p image_format is
446  * NULL, or @p capability_mask is NULL.
447  */
448 hsa_status_t HSA_API hsa_ext_image_get_capability(
449     hsa_agent_t agent,
450     hsa_ext_image_geometry_t geometry,
451     const hsa_ext_image_format_t *image_format,
452     uint32_t *capability_mask);
453 
454 /**
455  * @brief Retrieve the supported image capabilities for a given combination of
456  * agent, geometry, image format, and image layout for an image created with
457  * an explicit image data layout.
458  *
459  * @param[in] agent Agent to be associated with the image handle.
460  *
461  * @param[in] geometry Geometry.
462  *
463  * @param[in] image_format Pointer to an image format. Must not be NULL.
464  *
465  * @param[in] image_data_layout The image data layout.
466  * It is invalid to use ::HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE; use
467  * ::hsa_ext_image_get_capability instead.
468  *
469  * @param[out] capability_mask Pointer to a memory location where the HSA
470  * runtime stores a bit-mask of supported image capability
471  * (::hsa_ext_image_capability_t) values. Must not be NULL.
472  *
473  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
474  *
475  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
476  * initialized.
477  *
478  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
479  *
480  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p image_format is
481  * NULL, @p image_data_layout is ::HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE,
482  * or @p capability_mask is NULL.
483  */
484 hsa_status_t HSA_API hsa_ext_image_get_capability_with_layout(
485     hsa_agent_t agent,
486     hsa_ext_image_geometry_t geometry,
487     const hsa_ext_image_format_t *image_format,
488     hsa_ext_image_data_layout_t image_data_layout,
489     uint32_t *capability_mask);
490 
491 /**
492  * @brief Agent specific image size and alignment requirements, populated by
493  * ::hsa_ext_image_data_get_info and ::hsa_ext_image_data_get_info_with_layout.
494  */
495 typedef struct hsa_ext_image_data_info_s {
496   /**
497    * Image data size, in bytes.
498    */
499   size_t size;
500 
501   /**
502    * Image data alignment, in bytes. Must always be a power of 2.
503    */
504   size_t alignment;
505 
506 } hsa_ext_image_data_info_t;
507 
508 /**
509  * @brief Retrieve the image data requirements for a given combination of agent, image
510  * descriptor, and access permission for an image created with an opaque image
511  * data layout.
512  *
513  * @details The optimal image data size and alignment requirements may
514  * vary depending on the image attributes specified in @p
515  * image_descriptor, the @p access_permission, and the @p agent. Also,
516  * different implementations of the HSA runtime may return different
517  * requirements for the same input values.
518  *
519  * The implementation must return the same image data requirements for
520  * different access permissions with matching image descriptors as long
521  * as ::hsa_ext_image_get_capability reports
522  * ::HSA_EXT_IMAGE_CAPABILITY_ACCESS_INVARIANT_DATA_LAYOUT. Image
523  * descriptors match if they have the same values, with the exception
524  * that s-form channel orders match the corresponding non-s-form
525  * channel order and vice versa.
526  *
527  * @param[in] agent Agent to be associated with the image handle.
528  *
529  * @param[in] image_descriptor Pointer to an image descriptor. Must not be NULL.
530  *
531  * @param[in] access_permission Access permission of the image when
532  * accessed by @p agent. The access permission defines how the agent
533  * is allowed to access the image and must match the corresponding
534  * HSAIL image handle type. The @p agent must support the image format
535  * specified in @p image_descriptor for the given @p
536  * access_permission.
537  *
538  * @param[out] image_data_info Memory location where the runtime stores the
539  * size and alignment requirements. Must not be NULL.
540  *
541  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
542  *
543  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
544  * initialized.
545  *
546  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
547  *
548  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED The @p
549  * agent does not support the image format specified by @p
550  * image_descriptor with the specified @p access_permission.
551  *
552  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_SIZE_UNSUPPORTED The agent
553  * does not support the image dimensions specified by @p
554  * image_descriptor with the specified @p access_permission.
555  *
556  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p image_descriptor is NULL, @p
557  * access_permission is not a valid access permission value, or @p
558  * image_data_info is NULL.
559  */
560 hsa_status_t HSA_API hsa_ext_image_data_get_info(
561     hsa_agent_t agent,
562     const hsa_ext_image_descriptor_t *image_descriptor,
563     hsa_access_permission_t access_permission,
564     hsa_ext_image_data_info_t *image_data_info);
565 
566 /**
567  * @brief Retrieve the image data requirements for a given combination of
568  * image descriptor, access permission, image data layout, image data row pitch,
569  * and image data slice pitch for an image created with an explicit image
570  * data layout.
571  *
572  * @details The image data size and alignment requirements may vary
573  * depending on the image attributes specified in @p image_descriptor,
574  * the @p access_permission, and the image layout. However, different
575  * implementations of the HSA runtime will return the same
576  * requirements for the same input values.
577  *
578  * The implementation must return the same image data requirements for
579  * different access permissions with matching image descriptors and
580  * matching image layouts as long as ::hsa_ext_image_get_capability
581  * reports
582  * ::HSA_EXT_IMAGE_CAPABILITY_ACCESS_INVARIANT_DATA_LAYOUT. Image
583  * descriptors match if they have the same values, with the exception
584  * that s-form channel orders match the corresponding non-s-form
585  * channel order and vice versa. Image layouts match if they are the
586  * same image data layout and use the same image row and slice pitch
587  * values.
588  *
589  * @param[in] image_descriptor Pointer to an image descriptor. Must not be NULL.
590  *
591  * @param[in] access_permission Access permission of the image when
592  * accessed by an agent. The access permission defines how the agent
593  * is allowed to access the image and must match the corresponding
594  * HSAIL image handle type.
595  *
596  * @param[in] image_data_layout The image data layout to use.
597  * It is invalid to use ::HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE; use
598  * ::hsa_ext_image_data_get_info instead.
599  *
600  * @param[in] image_data_row_pitch The size in bytes for a single row
601  * of the image in the image data. If 0 is specified then the default
602  * row pitch value is used: image width * image element byte size.
603  * The value used must be greater than or equal to the default row
604  * pitch, and be a multiple of the image element byte size. For the
605  * linear image layout it must also be a multiple of the image linear
606  * row pitch alignment for the agents that will access the image data
607  * using image instructions.
608  *
609  * @param[in] image_data_slice_pitch The size in bytes of a single
610  * slice of a 3D image, or the size in bytes of each image layer in an
611  * image array in the image data. If 0 is specified then the default
612  * slice pitch value is used: row pitch * height if geometry is
613  * ::HSA_EXT_IMAGE_GEOMETRY_3D, ::HSA_EXT_IMAGE_GEOMETRY_2DA, or
614  * ::HSA_EXT_IMAGE_GEOMETRY_2DADEPTH; row pitch if geometry is
615  * ::HSA_EXT_IMAGE_GEOMETRY_1DA; and 0 otherwise. The value used must
616  * be 0 if the default slice pitch is 0, be greater than or equal to
617  * the default slice pitch, and be a multiple of the row pitch.
618  *
619  * @param[out] image_data_info Memory location where the runtime stores the
620  * size and alignment requirements. Must not be NULL.
621  *
622  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
623  *
624  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
625  * initialized.
626  *
627  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED The image
628  * format specified by @p image_descriptor is not supported for the
629  * @p access_permission and @p image_data_layout specified.
630  *
631  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_SIZE_UNSUPPORTED The image
632  * dimensions specified by @p image_descriptor are not supported for
633  * the @p access_permission and @p image_data_layout specified.
634  *
635  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_PITCH_UNSUPPORTED The row and
636  * slice pitch specified by @p image_data_row_pitch and @p
637  * image_data_slice_pitch are invalid or not supported.
638  *
639  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p image_descriptor is
640  * NULL, @p image_data_layout is ::HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE,
641  * or @p image_data_info is NULL.
642  */
643 hsa_status_t HSA_API hsa_ext_image_data_get_info_with_layout(
644     hsa_agent_t agent,
645     const hsa_ext_image_descriptor_t *image_descriptor,
646     hsa_access_permission_t access_permission,
647     hsa_ext_image_data_layout_t image_data_layout,
648     size_t image_data_row_pitch,
649     size_t image_data_slice_pitch,
650     hsa_ext_image_data_info_t *image_data_info);
651 
652 /**
653  * @brief Creates an agent specific image handle to an image with an
654  * opaque image data layout.
655  *
656  * @details Images with an opaque image data layout created with
657  * different access permissions but matching image descriptors and
658  * same agent can share the same image data if
659  * ::HSA_EXT_IMAGE_CAPABILITY_ACCESS_INVARIANT_DATA_LAYOUT is reported
660  * by ::hsa_ext_image_get_capability for the image format specified in
661  * the image descriptor. Image descriptors match if they have the same
662  * values, with the exception that s-form channel orders match the
663  * corresponding non-s-form channel order and vice versa.
664  *
665  * If necessary, an application can use image operations (import,
666  * export, copy, clear) to prepare the image for the intended use
667  * regardless of the access permissions.
668  *
669  * @param[in] agent agent to be associated with the image handle created.
670  *
671  * @param[in] image_descriptor Pointer to an image descriptor. Must not be NULL.
672  *
673  * @param[in] image_data Image data buffer that must have been allocated
674  * according to the size and alignment requirements dictated by
675  * ::hsa_ext_image_data_get_info. Must not be NULL.
676  *
677  * Any previous memory contents are preserved upon creation. The application is
678  * responsible for ensuring that the lifetime of the image data exceeds that of
679  * all the associated images.
680  *
681  * @param[in] access_permission Access permission of the image when
682  * accessed by agent. The access permission defines how the agent
683  * is allowed to access the image using the image handle created and
684  * must match the corresponding HSAIL image handle type. The agent
685  * must support the image format specified in @p image_descriptor for
686  * the given @p access_permission.
687  *
688  * @param[out] image Pointer to a memory location where the HSA runtime stores
689  * the newly created image handle. Must not be NULL.
690  *
691  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
692  *
693  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
694  * initialized.
695  *
696  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
697  *
698  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED The agent
699  * does not have the capability to support the image format contained
700  * in @p image_descriptor using the specified @p access_permission.
701  *
702  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_SIZE_UNSUPPORTED The agent
703  * does not support the image dimensions specified by @p
704  * image_descriptor using the specified @p access_permission.
705  *
706  * @retval ::HSA_STATUS_ERROR_OUT_OF_RESOURCES The HSA runtime failed to allocate
707  * the required resources.
708  *
709  * support the creation of more image handles with the given @p access_permission).
710  *
711  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p image_descriptor is NULL, @p
712  * image_data is NULL, @p image_data does not have a valid alignment,
713  * @p access_permission is not a valid access permission
714  * value, or @p image is NULL.
715  */
716 hsa_status_t HSA_API hsa_ext_image_create(
717     hsa_agent_t agent,
718     const hsa_ext_image_descriptor_t *image_descriptor,
719     const void *image_data,
720     hsa_access_permission_t access_permission,
721     hsa_ext_image_t *image);
722 
723 /**
724  * @brief Creates an agent specific image handle to an image with an explicit
725  * image data layout.
726  *
727  * @details Images with an explicit image data layout created with
728  * different access permissions but matching image descriptors and
729  * matching image layout can share the same image data if
730  * ::HSA_EXT_IMAGE_CAPABILITY_ACCESS_INVARIANT_DATA_LAYOUT is reported
731  * by ::hsa_ext_image_get_capability_with_layout for the image format
732  * specified in the image descriptor and specified image data
733  * layout. Image descriptors match if they have the same values, with
734  * the exception that s-form channel orders match the corresponding
735  * non-s-form channel order and vice versa. Image layouts match if
736  * they are the same image data layout and use the same image row and
737  * slice values.
738  *
739  * If necessary, an application can use image operations (import, export, copy,
740  * clear) to prepare the image for the intended use regardless of the access
741  * permissions.
742  *
743  * @param[in] agent agent to be associated with the image handle created.
744  *
745  * @param[in] image_descriptor Pointer to an image descriptor. Must not be NULL.
746  *
747  * @param[in] image_data Image data buffer that must have been allocated
748  * according to the size and alignment requirements dictated by
749  * ::hsa_ext_image_data_get_info_with_layout. Must not be NULL.
750  *
751  * Any previous memory contents are preserved upon creation. The application is
752  * responsible for ensuring that the lifetime of the image data exceeds that of
753  * all the associated images.
754  *
755  * @param[in] access_permission Access permission of the image when
756  * accessed by the agent. The access permission defines how the agent
757  * is allowed to access the image and must match the corresponding
758  * HSAIL image handle type. The agent must support the image format
759  * specified in @p image_descriptor for the given @p access_permission
760  * and @p image_data_layout.
761  *
762  * @param[in] image_data_layout The image data layout to use for the
763  * @p image_data. It is invalid to use
764  * ::HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE; use ::hsa_ext_image_create
765  * instead.
766  *
767  * @param[in] image_data_row_pitch The size in bytes for a single row
768  * of the image in the image data. If 0 is specified then the default
769  * row pitch value is used: image width * image element byte size.
770  * The value used must be greater than or equal to the default row
771  * pitch, and be a multiple of the image element byte size. For the
772  * linear image layout it must also be a multiple of the image linear
773  * row pitch alignment for the agents that will access the image data
774  * using image instructions.
775  *
776  * @param[in] image_data_slice_pitch The size in bytes of a single
777  * slice of a 3D image, or the size in bytes of each image layer in an
778  * image array in the image data. If 0 is specified then the default
779  * slice pitch value is used: row pitch * height if geometry is
780  * ::HSA_EXT_IMAGE_GEOMETRY_3D, ::HSA_EXT_IMAGE_GEOMETRY_2DA, or
781  * ::HSA_EXT_IMAGE_GEOMETRY_2DADEPTH; row pitch if geometry is
782  * ::HSA_EXT_IMAGE_GEOMETRY_1DA; and 0 otherwise. The value used must
783  * be 0 if the default slice pitch is 0, be greater than or equal to
784  * the default slice pitch, and be a multiple of the row pitch.
785  *
786  * @param[out] image Pointer to a memory location where the HSA runtime stores
787  * the newly created image handle. Must not be NULL.
788  *
789  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
790  *
791  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
792  * initialized.
793  *
794  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
795  *
796  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_FORMAT_UNSUPPORTED The agent does
797  * not have the capability to support the image format contained in the image
798  * descriptor using the specified @p access_permission and @p image_data_layout.
799  *
800  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_SIZE_UNSUPPORTED The agent
801  * does not support the image dimensions specified by @p
802  * image_descriptor using the specified @p access_permission and @p
803  * image_data_layout.
804  *
805  * @retval ::HSA_EXT_STATUS_ERROR_IMAGE_PITCH_UNSUPPORTED The agent does
806  * not support the row and slice pitch specified by @p image_data_row_pitch
807  * and @p image_data_slice_pitch, or the values are invalid.
808  *
809  * @retval ::HSA_STATUS_ERROR_OUT_OF_RESOURCES The HSA runtime failed to allocate
810  * the required resources.
811  *
812  * support the creation of more image handles with the given @p access_permission).
813  *
814  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p image_descriptor is NULL, @p
815  * image_data is NULL, @p image_data does not have a valid alignment,
816  * @p image_data_layout is ::HSA_EXT_IMAGE_DATA_LAYOUT_OPAQUE,
817  * or @p image is NULL.
818  */
819 hsa_status_t HSA_API hsa_ext_image_create_with_layout(
820     hsa_agent_t agent,
821     const hsa_ext_image_descriptor_t *image_descriptor,
822     const void *image_data,
823     hsa_access_permission_t access_permission,
824     hsa_ext_image_data_layout_t image_data_layout,
825     size_t image_data_row_pitch,
826     size_t image_data_slice_pitch,
827     hsa_ext_image_t *image);
828 
829 /**
830  * @brief Destroy an image handle previously created using ::hsa_ext_image_create or
831  * ::hsa_ext_image_create_with_layout.
832  *
833  * @details Destroying the image handle does not free the associated image data,
834  * or modify its contents. The application should not destroy an image handle while
835  * there are references to it queued for execution or currently being used in a
836  * kernel dispatch.
837  *
838  * @param[in] agent Agent associated with the image handle.
839  *
840  * @param[in] image Image handle to destroy.
841  *
842  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
843  *
844  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
845  * initialized.
846  *
847  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
848  */
849 hsa_status_t HSA_API hsa_ext_image_destroy(
850     hsa_agent_t agent,
851     hsa_ext_image_t image);
852 
853 /**
854  * @brief Copies a portion of one image (the source) to another image (the
855  * destination).
856  *
857  * @details The source and destination image formats should be the
858  * same, with the exception that s-form channel orders match the
859  * corresponding non-s-form channel order and vice versa. For example,
860  * it is allowed to copy a source image with a channel order of
861  * HSA_EXT_IMAGE_CHANNEL_ORDER_SRGB to a destination image with a
862  * channel order of HSA_EXT_IMAGE_CHANNEL_ORDER_RGB.
863  *
864  * The source and destination images do not have to be of the same geometry and
865  * appropriate scaling is performed by the HSA runtime. It is possible to copy
866  * subregions between any combinations of source and destination geometries, provided
867  * that the dimensions of the subregions are the same. For example, it is
868  * allowed to copy a rectangular region from a 2D image to a slice of a 3D
869  * image.
870  *
871  * If the source and destination image data overlap, or the combination of
872  * offset and range references an out-out-bounds element in any of the images,
873  * the behavior is undefined.
874  *
875  * @param[in] agent Agent associated with both the source and destination image handles.
876  *
877  * @param[in] src_image Image handle of source image. The agent associated with the source
878  * image handle must be identical to that of the destination image.
879  *
880  * @param[in] src_offset Pointer to the offset within the source image where to
881  * copy the data from. Must not be NULL.
882  *
883  * @param[in] dst_image Image handle of destination image.
884  *
885  * @param[in] dst_offset Pointer to the offset within the destination
886  * image where to copy the data. Must not be NULL.
887  *
888  * @param[in] range Dimensions of the image portion to be copied. The HSA
889  * runtime computes the size of the image data to be copied using this
890  * argument. Must not be NULL.
891  *
892  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
893  *
894  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
895  * initialized.
896  *
897  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
898  *
899  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p src_offset is
900  * NULL, @p dst_offset is NULL, or @p range is NULL.
901  */
902 hsa_status_t HSA_API hsa_ext_image_copy(
903     hsa_agent_t agent,
904     hsa_ext_image_t src_image,
905     const hsa_dim3_t* src_offset,
906     hsa_ext_image_t dst_image,
907     const hsa_dim3_t* dst_offset,
908     const hsa_dim3_t* range);
909 
910 /**
911  * @brief Image region.
912  */
913 typedef struct hsa_ext_image_region_s {
914    /**
915     * Offset within an image (in coordinates).
916     */
917     hsa_dim3_t offset;
918 
919    /**
920     * Dimension size of the image range (in coordinates). The x, y, and z dimensions
921     * correspond to width, height, and depth or index respectively.
922     */
923     hsa_dim3_t range;
924 } hsa_ext_image_region_t;
925 
926 /**
927  * @brief Import a linearly organized image data from memory directly to an
928  * image handle.
929  *
930  * @details This operation updates the image data referenced by the image handle
931  * from the source memory. The size of the data imported from memory is
932  * implicitly derived from the image region.
933  *
934  * It is the application's responsibility to avoid out of bounds memory access.
935  *
936  * None of the source memory or destination image data memory can
937  * overlap. Overlapping of any of the source and destination image
938  * data memory within the import operation produces undefined results.
939  *
940  * @param[in] agent Agent associated with the image handle.
941  *
942  * @param[in] src_memory Source memory. Must not be NULL.
943  *
944  * @param[in] src_row_pitch The size in bytes of a single row of the image in the
945  * source memory. If the value is smaller than the destination image region
946  * width * image element byte size, then region width * image element byte
947  * size is used.
948  *
949  * @param[in] src_slice_pitch The size in bytes of a single 2D slice of a 3D image,
950  * or the size in bytes of each image layer in an image array in the source memory.
951  * If the geometry is ::HSA_EXT_IMAGE_GEOMETRY_1DA and the value is smaller than the
952  * value used for @p src_row_pitch, then the value used for @p src_row_pitch is used.
953  * If the geometry is ::HSA_EXT_IMAGE_GEOMETRY_3D, ::HSA_EXT_IMAGE_GEOMETRY_2DA, or
954  * HSA_EXT_IMAGE_GEOMETRY_2DADEPTH and the value is smaller than the value used for
955  * @p src_row_pitch * destination image region height, then the value used for
956  * @p src_row_pitch * destination image region height is used.
957  * Otherwise, the value is not used.
958  *
959  * @param[in] dst_image Image handle of destination image.
960  *
961  * @param[in] image_region Pointer to the image region to be updated. Must not
962  * be NULL.
963  *
964  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
965  *
966  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
967  * initialized.
968  *
969  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
970  *
971  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p src_memory is NULL, or @p
972  * image_region is NULL.
973  *
974  */
975 hsa_status_t HSA_API hsa_ext_image_import(
976     hsa_agent_t agent,
977     const void *src_memory,
978     size_t src_row_pitch,
979     size_t src_slice_pitch,
980     hsa_ext_image_t dst_image,
981     const hsa_ext_image_region_t *image_region);
982 
983 /**
984  * @brief Export the image data to linearly organized memory.
985  *
986  * @details The operation updates the destination memory with the image data of
987  * @p src_image. The size of the data exported to memory is implicitly derived
988  * from the image region.
989  *
990  * It is the application's responsibility to avoid out of bounds memory access.
991  *
992  * None of the destination memory or source image data memory can
993  * overlap. Overlapping of any of the source and destination image
994  * data memory within the export operation produces undefined results.
995  *
996  * @param[in] agent Agent associated with the image handle.
997  *
998  * @param[in] src_image Image handle of source image.
999  *
1000  * @param[in] dst_memory Destination memory. Must not be NULL.
1001  *
1002  * @param[in] dst_row_pitch The size in bytes of a single row of the image in the
1003  * destination memory. If the value is smaller than the source image region
1004  * width * image element byte size, then region width * image element byte
1005  * size is used.
1006  *
1007  * @param[in] dst_slice_pitch The size in bytes of a single 2D slice of a 3D image,
1008  * or the size in bytes of each image in an image array in the destination memory.
1009  * If the geometry is ::HSA_EXT_IMAGE_GEOMETRY_1DA and the value is smaller than the
1010  * value used for @p dst_row_pitch, then the value used for @p dst_row_pitch is used.
1011  * If the geometry is ::HSA_EXT_IMAGE_GEOMETRY_3D, ::HSA_EXT_IMAGE_GEOMETRY_2DA, or
1012  * HSA_EXT_IMAGE_GEOMETRY_2DADEPTH and the value is smaller than the value used for
1013  * @p dst_row_pitch * source image region height, then the value used for
1014  * @p dst_row_pitch * source image region height is used.
1015  * Otherwise, the value is not used.
1016  *
1017  * @param[in] image_region Pointer to the image region to be exported. Must not
1018  * be NULL.
1019  *
1020  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
1021  *
1022  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
1023  * initialized.
1024  *
1025  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
1026  *
1027  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p dst_memory is NULL, or @p
1028  * image_region is NULL.
1029  */
1030 hsa_status_t HSA_API hsa_ext_image_export(
1031     hsa_agent_t agent,
1032     hsa_ext_image_t src_image,
1033     void *dst_memory,
1034     size_t dst_row_pitch,
1035     size_t dst_slice_pitch,
1036     const hsa_ext_image_region_t *image_region);
1037 
1038 /**
1039  * @brief Clear a region of an image so that every image element has
1040  * the specified value.
1041  *
1042  * @param[in] agent Agent associated with the image handle.
1043  *
1044  * @param[in] image Image handle for image to be cleared.
1045  *
1046  * @param[in] data The value to which to set each image element being
1047  * cleared. It is specified as an array of image component values. The
1048  * number of array elements must match the number of access components
1049  * for the image channel order. The type of each array element must
1050  * match the image access type of the image channel type. When the
1051  * value is used to set the value of an image element, the conversion
1052  * method corresponding to the image channel type is used. See the
1053  * <em>Channel Order</em> section and <em>Channel Type</em> section in
1054  * the <em>HSA Programming Reference Manual</em> for more
1055  * information. Must not be NULL.
1056  *
1057  * @param[in] image_region Pointer to the image region to clear. Must not be
1058  * NULL. If the region references an out-out-bounds element, the behavior is
1059  * undefined.
1060  *
1061  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
1062  *
1063  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
1064  * initialized.
1065  *
1066  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
1067  *
1068  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p data is NULL, or @p
1069  * image_region is NULL.
1070  */
1071 hsa_status_t HSA_API hsa_ext_image_clear(
1072     hsa_agent_t agent,
1073     hsa_ext_image_t image,
1074     const void* data,
1075     const hsa_ext_image_region_t *image_region);
1076 
1077 /**
1078  * @brief Sampler handle. Samplers are populated by
1079  * ::hsa_ext_sampler_create. Sampler handles are only unique within an
1080  * agent, not across agents.
1081  */
1082 typedef struct hsa_ext_sampler_s {
1083   /**
1084    *  Opaque handle. For a given agent, two handles reference the same object of
1085    *  the enclosing type if and only if they are equal.
1086    */
1087     uint64_t handle;
1088 } hsa_ext_sampler_t;
1089 
1090 /**
1091  * @brief Sampler address modes. The sampler address mode describes
1092  * the processing of out-of-range image coordinates. See the
1093  * <em>Addressing Mode</em> section in the <em>HSA Programming Reference
1094  * Manual</em> for definitions on each address mode. The values
1095  * match the BRIG type @p hsa_ext_brig_sampler_addressing_t.
1096  */
1097 typedef enum {
1098   /**
1099    * Out-of-range coordinates are not handled.
1100    */
1101   HSA_EXT_SAMPLER_ADDRESSING_MODE_UNDEFINED = 0,
1102 
1103   /**
1104    * Clamp out-of-range coordinates to the image edge.
1105    */
1106   HSA_EXT_SAMPLER_ADDRESSING_MODE_CLAMP_TO_EDGE = 1,
1107 
1108   /**
1109    * Clamp out-of-range coordinates to the image border color.
1110    */
1111   HSA_EXT_SAMPLER_ADDRESSING_MODE_CLAMP_TO_BORDER = 2,
1112 
1113   /**
1114    * Wrap out-of-range coordinates back into the valid coordinate
1115    * range so the image appears as repeated tiles.
1116    */
1117   HSA_EXT_SAMPLER_ADDRESSING_MODE_REPEAT = 3,
1118 
1119   /**
1120    * Mirror out-of-range coordinates back into the valid coordinate
1121    * range so the image appears as repeated tiles with every other
1122    * tile a reflection.
1123    */
1124   HSA_EXT_SAMPLER_ADDRESSING_MODE_MIRRORED_REPEAT = 4
1125 
1126 } hsa_ext_sampler_addressing_mode_t;
1127 
1128 /**
1129  * @brief A fixed-size type used to represent ::hsa_ext_sampler_addressing_mode_t constants.
1130  */
1131 typedef uint32_t hsa_ext_sampler_addressing_mode32_t;
1132 
1133 /**
1134  * @brief Sampler coordinate normalization modes. See the
1135  * <em>Coordinate Normalization Mode</em> section in the <em>HSA
1136  * Programming Reference Manual</em> for definitions on each
1137  * coordinate normalization mode. The values match the BRIG type @p
1138  * hsa_ext_brig_sampler_coord_normalization_t.
1139  */
1140 typedef enum {
1141 
1142   /**
1143    * Coordinates are used to directly address an image element.
1144    */
1145   HSA_EXT_SAMPLER_COORDINATE_MODE_UNNORMALIZED = 0,
1146 
1147   /**
1148    * Coordinates are scaled by the image dimension size before being
1149    * used to address an image element.
1150    */
1151   HSA_EXT_SAMPLER_COORDINATE_MODE_NORMALIZED = 1
1152 
1153 } hsa_ext_sampler_coordinate_mode_t;
1154 
1155 /**
1156  * @brief A fixed-size type used to represent ::hsa_ext_sampler_coordinate_mode_t constants.
1157  */
1158 typedef uint32_t hsa_ext_sampler_coordinate_mode32_t;
1159 
1160 
1161 /**
1162  * @brief Sampler filter modes. See the <em>Filter Mode</em> section
1163  * in the <em>HSA Programming Reference Manual</em> for definitions
1164  * on each address mode. The enumeration values match the BRIG type @p
1165  * hsa_ext_brig_sampler_filter_t.
1166  */
1167 typedef enum {
1168   /**
1169    * Filter to the image element nearest (in Manhattan distance) to the
1170    * specified coordinate.
1171    */
1172   HSA_EXT_SAMPLER_FILTER_MODE_NEAREST = 0,
1173 
1174   /**
1175    * Filter to the image element calculated by combining the elements in a 2x2
1176    * square block or 2x2x2 cube block around the specified coordinate. The
1177    * elements are combined using linear interpolation.
1178    */
1179   HSA_EXT_SAMPLER_FILTER_MODE_LINEAR = 1
1180 
1181 } hsa_ext_sampler_filter_mode_t;
1182 
1183 /**
1184  * @brief A fixed-size type used to represent ::hsa_ext_sampler_filter_mode_t constants.
1185  */
1186 typedef uint32_t hsa_ext_sampler_filter_mode32_t;
1187 
1188 /**
1189  * @brief Implementation independent sampler descriptor.
1190  */
1191 typedef struct hsa_ext_sampler_descriptor_s {
1192   /**
1193    * Sampler coordinate mode describes the normalization of image coordinates.
1194    */
1195   hsa_ext_sampler_coordinate_mode32_t coordinate_mode;
1196 
1197   /**
1198    * Sampler filter type describes the type of sampling performed.
1199    */
1200   hsa_ext_sampler_filter_mode32_t filter_mode;
1201 
1202   /**
1203    * Sampler address mode describes the processing of out-of-range image
1204    * coordinates.
1205    */
1206   hsa_ext_sampler_addressing_mode32_t address_mode;
1207 
1208 } hsa_ext_sampler_descriptor_t;
1209 
1210 /**
1211  * @brief Create an agent specific sampler handle for a given agent
1212  * independent sampler descriptor and agent.
1213  *
1214  * @param[in] agent Agent to be associated with the sampler handle created.
1215  *
1216  * @param[in] sampler_descriptor Pointer to a sampler descriptor. Must not be
1217  * NULL.
1218  *
1219  * @param[out] sampler Memory location where the HSA runtime stores the newly
1220  * created sampler handle. Must not be NULL.
1221  *
1222  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
1223  *
1224  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
1225  * initialized.
1226  *
1227  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
1228  *
1229  * @retval ::HSA_EXT_STATUS_ERROR_SAMPLER_DESCRIPTOR_UNSUPPORTED The
1230  * @p agent does not have the capability to support the properties
1231  * specified by @p sampler_descriptor or it is invalid.
1232  *
1233  * @retval ::HSA_STATUS_ERROR_OUT_OF_RESOURCES The HSA runtime failed to allocate
1234  * the required resources.
1235  *
1236  * @retval ::HSA_STATUS_ERROR_INVALID_ARGUMENT @p sampler_descriptor is NULL, or
1237  * @p sampler is NULL.
1238  */
1239 hsa_status_t HSA_API hsa_ext_sampler_create(
1240     hsa_agent_t agent,
1241     const hsa_ext_sampler_descriptor_t *sampler_descriptor,
1242     hsa_ext_sampler_t *sampler);
1243 
1244 /**
1245  * @brief Destroy a sampler handle previously created using ::hsa_ext_sampler_create.
1246  *
1247  * @details The sampler handle should not be destroyed while there are
1248  * references to it queued for execution or currently being used in a
1249  * kernel dispatch.
1250  *
1251  * @param[in] agent Agent associated with the sampler handle.
1252  *
1253  * @param[in] sampler Sampler handle to destroy.
1254  *
1255  * @retval ::HSA_STATUS_SUCCESS The function has been executed successfully.
1256  *
1257  * @retval ::HSA_STATUS_ERROR_NOT_INITIALIZED The HSA runtime has not been
1258  * initialized.
1259  *
1260  * @retval ::HSA_STATUS_ERROR_INVALID_AGENT The agent is invalid.
1261  */
1262 hsa_status_t HSA_API hsa_ext_sampler_destroy(
1263     hsa_agent_t agent,
1264     hsa_ext_sampler_t sampler);
1265 
1266 
1267 #define hsa_ext_images_1_00
1268 
1269 /**
1270  * @brief The function pointer table for the images v1.00 extension. Can be returned by ::hsa_system_get_extension_table or ::hsa_system_get_major_extension_table.
1271  */
1272 typedef struct hsa_ext_images_1_00_pfn_s {
1273 
1274   hsa_status_t (*hsa_ext_image_get_capability)(
1275     hsa_agent_t agent,
1276     hsa_ext_image_geometry_t geometry,
1277     const hsa_ext_image_format_t *image_format,
1278     uint32_t *capability_mask);
1279 
1280   hsa_status_t (*hsa_ext_image_data_get_info)(
1281     hsa_agent_t agent,
1282     const hsa_ext_image_descriptor_t *image_descriptor,
1283     hsa_access_permission_t access_permission,
1284     hsa_ext_image_data_info_t *image_data_info);
1285 
1286   hsa_status_t (*hsa_ext_image_create)(
1287     hsa_agent_t agent,
1288     const hsa_ext_image_descriptor_t *image_descriptor,
1289     const void *image_data,
1290     hsa_access_permission_t access_permission,
1291     hsa_ext_image_t *image);
1292 
1293   hsa_status_t (*hsa_ext_image_destroy)(
1294     hsa_agent_t agent,
1295     hsa_ext_image_t image);
1296 
1297   hsa_status_t (*hsa_ext_image_copy)(
1298     hsa_agent_t agent,
1299     hsa_ext_image_t src_image,
1300     const hsa_dim3_t* src_offset,
1301     hsa_ext_image_t dst_image,
1302     const hsa_dim3_t* dst_offset,
1303     const hsa_dim3_t* range);
1304 
1305   hsa_status_t (*hsa_ext_image_import)(
1306     hsa_agent_t agent,
1307     const void *src_memory,
1308     size_t src_row_pitch,
1309     size_t src_slice_pitch,
1310     hsa_ext_image_t dst_image,
1311     const hsa_ext_image_region_t *image_region);
1312 
1313   hsa_status_t (*hsa_ext_image_export)(
1314     hsa_agent_t agent,
1315     hsa_ext_image_t src_image,
1316     void *dst_memory,
1317     size_t dst_row_pitch,
1318     size_t dst_slice_pitch,
1319     const hsa_ext_image_region_t *image_region);
1320 
1321   hsa_status_t (*hsa_ext_image_clear)(
1322     hsa_agent_t agent,
1323     hsa_ext_image_t image,
1324     const void* data,
1325     const hsa_ext_image_region_t *image_region);
1326 
1327   hsa_status_t (*hsa_ext_sampler_create)(
1328     hsa_agent_t agent,
1329     const hsa_ext_sampler_descriptor_t *sampler_descriptor,
1330     hsa_ext_sampler_t *sampler);
1331 
1332   hsa_status_t (*hsa_ext_sampler_destroy)(
1333     hsa_agent_t agent,
1334     hsa_ext_sampler_t sampler);
1335 
1336 } hsa_ext_images_1_00_pfn_t;
1337 
1338 #define hsa_ext_images_1
1339 
1340 /**
1341  * @brief The function pointer table for the images v1 extension. Can be returned by ::hsa_system_get_extension_table or ::hsa_system_get_major_extension_table.
1342  */
1343 typedef struct hsa_ext_images_1_pfn_s {
1344 
1345   hsa_status_t (*hsa_ext_image_get_capability)(
1346     hsa_agent_t agent,
1347     hsa_ext_image_geometry_t geometry,
1348     const hsa_ext_image_format_t *image_format,
1349     uint32_t *capability_mask);
1350 
1351   hsa_status_t (*hsa_ext_image_data_get_info)(
1352     hsa_agent_t agent,
1353     const hsa_ext_image_descriptor_t *image_descriptor,
1354     hsa_access_permission_t access_permission,
1355     hsa_ext_image_data_info_t *image_data_info);
1356 
1357   hsa_status_t (*hsa_ext_image_create)(
1358     hsa_agent_t agent,
1359     const hsa_ext_image_descriptor_t *image_descriptor,
1360     const void *image_data,
1361     hsa_access_permission_t access_permission,
1362     hsa_ext_image_t *image);
1363 
1364   hsa_status_t (*hsa_ext_image_destroy)(
1365     hsa_agent_t agent,
1366     hsa_ext_image_t image);
1367 
1368   hsa_status_t (*hsa_ext_image_copy)(
1369     hsa_agent_t agent,
1370     hsa_ext_image_t src_image,
1371     const hsa_dim3_t* src_offset,
1372     hsa_ext_image_t dst_image,
1373     const hsa_dim3_t* dst_offset,
1374     const hsa_dim3_t* range);
1375 
1376   hsa_status_t (*hsa_ext_image_import)(
1377     hsa_agent_t agent,
1378     const void *src_memory,
1379     size_t src_row_pitch,
1380     size_t src_slice_pitch,
1381     hsa_ext_image_t dst_image,
1382     const hsa_ext_image_region_t *image_region);
1383 
1384   hsa_status_t (*hsa_ext_image_export)(
1385     hsa_agent_t agent,
1386     hsa_ext_image_t src_image,
1387     void *dst_memory,
1388     size_t dst_row_pitch,
1389     size_t dst_slice_pitch,
1390     const hsa_ext_image_region_t *image_region);
1391 
1392   hsa_status_t (*hsa_ext_image_clear)(
1393     hsa_agent_t agent,
1394     hsa_ext_image_t image,
1395     const void* data,
1396     const hsa_ext_image_region_t *image_region);
1397 
1398   hsa_status_t (*hsa_ext_sampler_create)(
1399     hsa_agent_t agent,
1400     const hsa_ext_sampler_descriptor_t *sampler_descriptor,
1401     hsa_ext_sampler_t *sampler);
1402 
1403   hsa_status_t (*hsa_ext_sampler_destroy)(
1404     hsa_agent_t agent,
1405     hsa_ext_sampler_t sampler);
1406 
1407   hsa_status_t (*hsa_ext_image_get_capability_with_layout)(
1408     hsa_agent_t agent,
1409     hsa_ext_image_geometry_t geometry,
1410     const hsa_ext_image_format_t *image_format,
1411     hsa_ext_image_data_layout_t image_data_layout,
1412     uint32_t *capability_mask);
1413 
1414   hsa_status_t (*hsa_ext_image_data_get_info_with_layout)(
1415     hsa_agent_t agent,
1416     const hsa_ext_image_descriptor_t *image_descriptor,
1417     hsa_access_permission_t access_permission,
1418     hsa_ext_image_data_layout_t image_data_layout,
1419     size_t image_data_row_pitch,
1420     size_t image_data_slice_pitch,
1421     hsa_ext_image_data_info_t *image_data_info);
1422 
1423   hsa_status_t (*hsa_ext_image_create_with_layout)(
1424     hsa_agent_t agent,
1425     const hsa_ext_image_descriptor_t *image_descriptor,
1426     const void *image_data,
1427     hsa_access_permission_t access_permission,
1428     hsa_ext_image_data_layout_t image_data_layout,
1429     size_t image_data_row_pitch,
1430     size_t image_data_slice_pitch,
1431     hsa_ext_image_t *image);
1432 
1433 } hsa_ext_images_1_pfn_t;
1434 /** @} */
1435 
1436 #ifdef __cplusplus
1437 }  // end extern "C" block
1438 #endif /*__cplusplus*/
1439 
1440 #endif
1441