1 /*
2  * Copyright (C) 2018-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #include "surface_formats.h"
9 
10 #include "shared/source/gmm_helper/gmm_lib.h"
11 #include "shared/source/helpers/array_count.h"
12 
13 #include "opencl/source/api/cl_types.h"
14 #include "opencl/source/helpers/cl_validators.h"
15 #include "opencl/source/mem_obj/image.h"
16 
17 namespace NEO {
18 
19 // clang-format off
20 #define COMMONFORMATS \
21     {{CL_RGBA,            CL_UNORM_INT8},     {GMM_FORMAT_R8G8B8A8_UNORM_TYPE,      GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM          , 0, 4, 1, 4}}, \
22     {{CL_RGBA,            CL_UNORM_INT16},    {GMM_FORMAT_R16G16B16A16_UNORM_TYPE,  GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM      , 0, 4, 2, 8}}, \
23     {{CL_RGBA,            CL_SIGNED_INT8},    {GMM_FORMAT_R8G8B8A8_SINT_TYPE,       GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_SINT           , 0, 4, 1, 4}}, \
24     {{CL_RGBA,            CL_SIGNED_INT16},   {GMM_FORMAT_R16G16B16A16_SINT_TYPE,   GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_SINT       , 0, 4, 2, 8}}, \
25     {{CL_RGBA,            CL_SIGNED_INT32},   {GMM_FORMAT_R32G32B32A32_SINT_TYPE,   GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_SINT       , 0, 4, 4, 16}}, \
26     {{CL_RGBA,            CL_UNSIGNED_INT8},  {GMM_FORMAT_R8G8B8A8_UINT_TYPE,       GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UINT           , 0, 4, 1, 4}}, \
27     {{CL_RGBA,            CL_UNSIGNED_INT16}, {GMM_FORMAT_R16G16B16A16_UINT_TYPE,   GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UINT       , 0, 4, 2, 8}}, \
28     {{CL_RGBA,            CL_UNSIGNED_INT32}, {GMM_FORMAT_R32G32B32A32_UINT_TYPE,   GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_UINT       , 0, 4, 4, 16}}, \
29     {{CL_RGBA,            CL_HALF_FLOAT},     {GMM_FORMAT_R16G16B16A16_FLOAT_TYPE,  GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_FLOAT      , 0, 4, 2, 8}}, \
30     {{CL_RGBA,            CL_FLOAT},          {GMM_FORMAT_R32G32B32A32_FLOAT_TYPE,  GFX3DSTATE_SURFACEFORMAT_R32G32B32A32_FLOAT      , 0, 4, 4, 16}}, \
31     {{CL_BGRA,            CL_UNORM_INT8},     {GMM_FORMAT_B8G8R8A8_UNORM_TYPE,      GFX3DSTATE_SURFACEFORMAT_B8G8R8A8_UNORM          , 0, 4, 1, 4}}, \
32     {{CL_R,               CL_FLOAT},          {GMM_FORMAT_R32_FLOAT_TYPE,           GFX3DSTATE_SURFACEFORMAT_R32_FLOAT               , 0, 1, 4, 4}}, \
33     {{CL_R,               CL_UNORM_INT8},     {GMM_FORMAT_R8_UNORM_TYPE,            GFX3DSTATE_SURFACEFORMAT_R8_UNORM                , 0, 1, 1, 1}}, \
34     {{CL_R,               CL_UNORM_INT16},    {GMM_FORMAT_R16_UNORM_TYPE,           GFX3DSTATE_SURFACEFORMAT_R16_UNORM               , 0, 1, 2, 2}}, \
35     {{CL_R,               CL_SIGNED_INT8},    {GMM_FORMAT_R8_SINT_TYPE,             GFX3DSTATE_SURFACEFORMAT_R8_SINT                 , 0, 1, 1, 1}}, \
36     {{CL_R,               CL_SIGNED_INT16},   {GMM_FORMAT_R16_SINT_TYPE,            GFX3DSTATE_SURFACEFORMAT_R16_SINT                , 0, 1, 2, 2}}, \
37     {{CL_R,               CL_SIGNED_INT32},   {GMM_FORMAT_R32_SINT_TYPE,            GFX3DSTATE_SURFACEFORMAT_R32_SINT                , 0, 1, 4, 4}}, \
38     {{CL_R,               CL_UNSIGNED_INT8},  {GMM_FORMAT_R8_UINT_TYPE,             GFX3DSTATE_SURFACEFORMAT_R8_UINT                 , 0, 1, 1, 1}}, \
39     {{CL_R,               CL_UNSIGNED_INT16}, {GMM_FORMAT_R16_UINT_TYPE,            GFX3DSTATE_SURFACEFORMAT_R16_UINT                , 0, 1, 2, 2}}, \
40     {{CL_R,               CL_UNSIGNED_INT32}, {GMM_FORMAT_R32_UINT_TYPE,            GFX3DSTATE_SURFACEFORMAT_R32_UINT                , 0, 1, 4, 4}}, \
41     {{CL_R,               CL_HALF_FLOAT},     {GMM_FORMAT_R16_FLOAT_TYPE,           GFX3DSTATE_SURFACEFORMAT_R16_FLOAT               , 0, 1, 2, 2}}, \
42     {{CL_A,               CL_UNORM_INT8},     {GMM_FORMAT_A8_UNORM_TYPE,            GFX3DSTATE_SURFACEFORMAT_A8_UNORM                , 0, 1, 1, 1}}, \
43     {{CL_RG,              CL_UNORM_INT8},     {GMM_FORMAT_R8G8_UNORM_TYPE,          GFX3DSTATE_SURFACEFORMAT_R8G8_UNORM              , 0, 2, 1, 2}}, \
44     {{CL_RG,              CL_UNORM_INT16},    {GMM_FORMAT_R16G16_UNORM_TYPE,        GFX3DSTATE_SURFACEFORMAT_R16G16_UNORM            , 0, 2, 2, 4}}, \
45     {{CL_RG,              CL_SIGNED_INT8},    {GMM_FORMAT_R8G8_SINT_TYPE,           GFX3DSTATE_SURFACEFORMAT_R8G8_SINT               , 0, 2, 1, 2}}, \
46     {{CL_RG,              CL_SIGNED_INT16},   {GMM_FORMAT_R16G16_SINT_TYPE,         GFX3DSTATE_SURFACEFORMAT_R16G16_SINT             , 0, 2, 2, 4}}, \
47     {{CL_RG,              CL_SIGNED_INT32},   {GMM_FORMAT_R32G32_SINT_TYPE,         GFX3DSTATE_SURFACEFORMAT_R32G32_SINT             , 0, 2, 4, 8}}, \
48     {{CL_RG,              CL_UNSIGNED_INT8},  {GMM_FORMAT_R8G8_UINT_TYPE,           GFX3DSTATE_SURFACEFORMAT_R8G8_UINT               , 0, 2, 1, 2}}, \
49     {{CL_RG,              CL_UNSIGNED_INT16}, {GMM_FORMAT_R16G16_UINT_TYPE,         GFX3DSTATE_SURFACEFORMAT_R16G16_UINT             , 0, 2, 2, 4}}, \
50     {{CL_RG,              CL_UNSIGNED_INT32}, {GMM_FORMAT_R32G32_UINT_TYPE,         GFX3DSTATE_SURFACEFORMAT_R32G32_UINT             , 0, 2, 4, 8}}, \
51     {{CL_RG,              CL_HALF_FLOAT},     {GMM_FORMAT_R16G16_FLOAT_TYPE,        GFX3DSTATE_SURFACEFORMAT_R16G16_FLOAT            , 0, 2, 2, 4}}, \
52     {{CL_RG,              CL_FLOAT},          {GMM_FORMAT_R32G32_FLOAT_TYPE,        GFX3DSTATE_SURFACEFORMAT_R32G32_FLOAT            , 0, 2, 4, 8}}, \
53     {{CL_LUMINANCE,       CL_UNORM_INT8},     {GMM_FORMAT_GENERIC_8BIT,             GFX3DSTATE_SURFACEFORMAT_R8_UNORM                , 0, 1, 1, 1}}, \
54     {{CL_LUMINANCE,       CL_UNORM_INT16},    {GMM_FORMAT_GENERIC_16BIT,            GFX3DSTATE_SURFACEFORMAT_R16_UNORM               , 0, 1, 2, 2}}, \
55     {{CL_LUMINANCE,       CL_HALF_FLOAT},     {GMM_FORMAT_GENERIC_16BIT,            GFX3DSTATE_SURFACEFORMAT_R16_FLOAT               , 0, 1, 2, 2}}, \
56     {{CL_LUMINANCE,       CL_FLOAT},          {GMM_FORMAT_GENERIC_32BIT,            GFX3DSTATE_SURFACEFORMAT_R32_FLOAT               , 0, 1, 4, 4}}, \
57     {{CL_R,               CL_SNORM_INT8},     {GMM_FORMAT_R8_SNORM_TYPE,            GFX3DSTATE_SURFACEFORMAT_R8_SNORM                , 0, 1, 1, 1}}, \
58     {{CL_R,               CL_SNORM_INT16},    {GMM_FORMAT_R16_SNORM_TYPE,           GFX3DSTATE_SURFACEFORMAT_R16_SNORM               , 0, 1, 2, 2}}, \
59     {{CL_RG,              CL_SNORM_INT8},     {GMM_FORMAT_R8G8_SNORM_TYPE,          GFX3DSTATE_SURFACEFORMAT_R8G8_SNORM              , 0, 2, 1, 2}}, \
60     {{CL_RG,              CL_SNORM_INT16},    {GMM_FORMAT_R16G16_SNORM_TYPE,        GFX3DSTATE_SURFACEFORMAT_R16G16_SNORM            , 0, 2, 2, 4}}, \
61     {{CL_RGBA,            CL_SNORM_INT8},     {GMM_FORMAT_R8G8B8A8_SNORM_TYPE,      GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_SNORM          , 0, 4, 1, 4}}, \
62     {{CL_RGBA,            CL_SNORM_INT16},    {GMM_FORMAT_R16G16B16A16_SNORM_TYPE,  GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_SNORM      , 0, 4, 2, 8}}
63 
64 #define READONLYFORMATS \
65     {{CL_INTENSITY,       CL_UNORM_INT8},     {GMM_FORMAT_GENERIC_8BIT,             GFX3DSTATE_SURFACEFORMAT_I8_UNORM                , 0, 1, 1, 1}}, \
66     {{CL_INTENSITY,       CL_UNORM_INT16},    {GMM_FORMAT_GENERIC_16BIT,            GFX3DSTATE_SURFACEFORMAT_I16_UNORM               , 0, 1, 2, 2}}, \
67     {{CL_INTENSITY,       CL_HALF_FLOAT},     {GMM_FORMAT_GENERIC_16BIT,            GFX3DSTATE_SURFACEFORMAT_I16_FLOAT               , 0, 1, 2, 2}}, \
68     {{CL_INTENSITY,       CL_FLOAT},          {GMM_FORMAT_GENERIC_32BIT,            GFX3DSTATE_SURFACEFORMAT_I32_FLOAT               , 0, 1, 4, 4}}, \
69     {{CL_A,               CL_UNORM_INT16},    {GMM_FORMAT_GENERIC_16BIT,            GFX3DSTATE_SURFACEFORMAT_A16_UNORM               , 0, 1, 2, 2}}, \
70     {{CL_A,               CL_HALF_FLOAT},     {GMM_FORMAT_GENERIC_16BIT,            GFX3DSTATE_SURFACEFORMAT_A16_FLOAT               , 0, 1, 2, 2}}, \
71     {{CL_A,               CL_FLOAT},          {GMM_FORMAT_GENERIC_32BIT,            GFX3DSTATE_SURFACEFORMAT_A32_FLOAT               , 0, 1, 4, 4}}
72 
73 #define SRGBFORMATS \
74     {{CL_sRGBA,           CL_UNORM_INT8},     {GMM_FORMAT_R8G8B8A8_UNORM_SRGB_TYPE, GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM_SRGB     , 0, 4, 1, 4}}, \
75     {{CL_sBGRA,           CL_UNORM_INT8},     {GMM_FORMAT_B8G8R8A8_UNORM_SRGB_TYPE, GFX3DSTATE_SURFACEFORMAT_B8G8R8A8_UNORM_SRGB     , 0, 4, 1, 4}}
76 
77 #define DEPTHFORMATS \
78     {{ CL_DEPTH,          CL_FLOAT},          {GMM_FORMAT_R32_FLOAT_TYPE,           GFX3DSTATE_SURFACEFORMAT_R32_FLOAT               , 0, 1, 4, 4}}, \
79     {{ CL_DEPTH,          CL_UNORM_INT16},    {GMM_FORMAT_R16_UNORM_TYPE,           GFX3DSTATE_SURFACEFORMAT_R16_UNORM               , 0, 1, 2, 2}}
80 
81 #define DEPTHSTENCILFORMATS \
82     {{ CL_DEPTH_STENCIL,  CL_UNORM_INT24},    {GMM_FORMAT_GENERIC_32BIT,            GFX3DSTATE_SURFACEFORMAT_R24_UNORM_X8_TYPELESS   , 0, 1, 4, 4}}, \
83     {{ CL_DEPTH_STENCIL,  CL_FLOAT},          {GMM_FORMAT_R32G32_FLOAT_TYPE,        GFX3DSTATE_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS, 0, 2, 4, 8}}
84 
85 //Initialize this with the required formats first.
86 //Append the optional one later
87 const ClSurfaceFormatInfo SurfaceFormats::readOnlySurfaceFormats12[] = { COMMONFORMATS, READONLYFORMATS };
88 
89 const ClSurfaceFormatInfo SurfaceFormats::readOnlySurfaceFormats20[] = { COMMONFORMATS, READONLYFORMATS, SRGBFORMATS };
90 
91 const ClSurfaceFormatInfo SurfaceFormats::writeOnlySurfaceFormats[] = { COMMONFORMATS };
92 
93 const ClSurfaceFormatInfo SurfaceFormats::readWriteSurfaceFormats[] = { COMMONFORMATS };
94 
95 const ClSurfaceFormatInfo SurfaceFormats::packedYuvSurfaceFormats[] = {
96     {{CL_YUYV_INTEL,      CL_UNORM_INT8},     {GMM_FORMAT_YUY2,                     GFX3DSTATE_SURFACEFORMAT_YCRCB_NORMAL            , 0, 2, 1, 2}},
97     {{CL_UYVY_INTEL,      CL_UNORM_INT8},     {GMM_FORMAT_UYVY,                     GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPY             , 0, 2, 1, 2}},
98     {{CL_YVYU_INTEL,      CL_UNORM_INT8},     {GMM_FORMAT_YVYU,                     GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPUV            , 0, 2, 1, 2}},
99     {{CL_VYUY_INTEL,      CL_UNORM_INT8},     {GMM_FORMAT_VYUY,                     GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPUVY           , 0, 2, 1, 2}}
100 };
101 
102 const ClSurfaceFormatInfo SurfaceFormats::planarYuvSurfaceFormats[] = {
103     {{CL_NV12_INTEL,      CL_UNORM_INT8},     {GMM_FORMAT_NV12,                     GFX3DSTATE_SURFACEFORMAT_PLANAR_420_8            , 0, 1, 1, 1}}
104 };
105 
106 const ClSurfaceFormatInfo SurfaceFormats::packedSurfaceFormats[] = {
107     {{CL_RGBA,            CL_UNORM_INT16},    {GMM_FORMAT_Y210,                     GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM      , 0, 4, 2, 8}},
108     {{CL_RG,              CL_UNORM_INT16},    {GMM_FORMAT_YUY2_2x1,                 GFX3DSTATE_SURFACEFORMAT_R10G10B10A2_UNORM       , 0, 2, 2, 4}}
109  };
110 
111 const ClSurfaceFormatInfo SurfaceFormats::readOnlyDepthSurfaceFormats[] = { DEPTHFORMATS, DEPTHSTENCILFORMATS };
112 
113 const ClSurfaceFormatInfo SurfaceFormats::readWriteDepthSurfaceFormats[] = { DEPTHFORMATS };
114 
readOnly12()115 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::readOnly12() noexcept {
116     return ArrayRef<const ClSurfaceFormatInfo>(readOnlySurfaceFormats12);
117 }
118 
readOnly20()119 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::readOnly20() noexcept {
120     return ArrayRef<const ClSurfaceFormatInfo>(readOnlySurfaceFormats20);
121 }
122 
writeOnly()123 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::writeOnly() noexcept {
124     return ArrayRef<const ClSurfaceFormatInfo>(writeOnlySurfaceFormats);
125 }
126 
readWrite()127 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::readWrite() noexcept {
128     return ArrayRef<const ClSurfaceFormatInfo>(readWriteSurfaceFormats);
129 }
130 
packedYuv()131 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::packedYuv() noexcept {
132     return ArrayRef<const ClSurfaceFormatInfo>(packedYuvSurfaceFormats);
133 }
134 
planarYuv()135 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::planarYuv() noexcept {
136     return ArrayRef<const ClSurfaceFormatInfo>(planarYuvSurfaceFormats);
137 }
138 
packed()139 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::packed() noexcept
140 {
141     return ArrayRef<const ClSurfaceFormatInfo>(packedSurfaceFormats);
142 }
143 
readOnlyDepth()144 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::readOnlyDepth() noexcept {
145     return ArrayRef<const ClSurfaceFormatInfo>(readOnlyDepthSurfaceFormats);
146 }
147 
readWriteDepth()148 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::readWriteDepth() noexcept {
149     return ArrayRef<const ClSurfaceFormatInfo>(readWriteDepthSurfaceFormats);
150 }
151 
surfaceFormats(cl_mem_flags flags,bool supportsOcl20Features)152 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::surfaceFormats(cl_mem_flags flags, bool supportsOcl20Features) noexcept {
153     if (flags & CL_MEM_READ_ONLY) {
154         if(supportsOcl20Features) {
155             return readOnly20();
156         }
157         else {
158             return readOnly12();
159         }
160     }
161     else if (flags & CL_MEM_WRITE_ONLY) {
162         return writeOnly();
163     }
164     else {
165         return readWrite();
166     }
167 }
168 
surfaceFormats(cl_mem_flags flags,const cl_image_format * imageFormat,bool supportsOcl20Features)169 ArrayRef<const ClSurfaceFormatInfo> SurfaceFormats::surfaceFormats(cl_mem_flags flags, const cl_image_format *imageFormat, bool supportsOcl20Features) noexcept {
170     if (NEO::isNV12Image(imageFormat)) {
171         return planarYuv();
172     }
173     else if (isPackedYuvImage(imageFormat)) {
174         return packedYuv();
175     }
176     else if (Image::isDepthFormat(*imageFormat)) {
177         if (flags & CL_MEM_READ_ONLY) {
178             return readOnlyDepth();
179         }
180         else {
181             return readWriteDepth();
182         }
183     }
184     else if (flags & CL_MEM_READ_ONLY) {
185         if(supportsOcl20Features) {
186             return readOnly20();
187         }
188         else {
189             return readOnly12();
190         }
191     }
192     else if (flags & CL_MEM_WRITE_ONLY) {
193         return writeOnly();
194     }
195     else {
196         return readWrite();
197     }
198 }
199 
200 // clang-format on
201 } // namespace NEO
202