Skip to content

Commit 2ad5108

Browse files
Clarified dependencies in Context::getSupportedImageFormats
Change-Id: Iaa09a2b572b3ae6d0533378f0ecf227bd90b1a10
1 parent 65565ac commit 2ad5108

12 files changed

+220
-253
lines changed

runtime/context/context.cpp

+31-65
Original file line numberDiff line numberDiff line change
@@ -253,85 +253,51 @@ cl_int Context::getSupportedImageFormats(
253253
cl_uint numEntries,
254254
cl_image_format *imageFormats,
255255
cl_uint *numImageFormatsReturned) {
256-
257256
size_t numImageFormats = 0;
258-
size_t numDepthFormats = 0;
259-
const SurfaceFormatInfo *baseSurfaceFormats = nullptr;
260-
const SurfaceFormatInfo *depthFormats = nullptr;
261-
262257
const bool nv12ExtensionEnabled = device->getDeviceInfo().nv12Extension;
263258
const bool packedYuvExtensionEnabled = device->getDeviceInfo().packedYuvExtension;
264-
bool appendPlanarYUVSurfaces = false;
265-
bool appendPackedYUVSurfaces = false;
266-
bool appendDepthSurfaces = true;
267259

268-
if (flags & CL_MEM_READ_ONLY) {
269-
numImageFormats = numReadOnlySurfaceFormats;
270-
baseSurfaceFormats = readOnlySurfaceFormats;
271-
depthFormats = readOnlyDepthSurfaceFormats;
272-
numDepthFormats = numReadOnlyDepthSurfaceFormats;
273-
appendPlanarYUVSurfaces = true;
274-
appendPackedYUVSurfaces = true;
275-
} else if (flags & CL_MEM_WRITE_ONLY) {
276-
numImageFormats = numWriteOnlySurfaceFormats;
277-
baseSurfaceFormats = writeOnlySurfaceFormats;
278-
depthFormats = readWriteDepthSurfaceFormats;
279-
numDepthFormats = numReadWriteDepthSurfaceFormats;
280-
} else if (nv12ExtensionEnabled && (flags & CL_MEM_NO_ACCESS_INTEL)) {
281-
numImageFormats = numReadOnlySurfaceFormats;
282-
baseSurfaceFormats = readOnlySurfaceFormats;
283-
appendPlanarYUVSurfaces = true;
284-
} else {
285-
numImageFormats = numReadWriteSurfaceFormats;
286-
baseSurfaceFormats = readWriteSurfaceFormats;
287-
depthFormats = readWriteDepthSurfaceFormats;
288-
numDepthFormats = numReadWriteDepthSurfaceFormats;
289-
}
290-
291-
if (!Image::isImage2d(imageType)) {
292-
appendPlanarYUVSurfaces = false;
293-
appendPackedYUVSurfaces = false;
294-
}
295-
if (!Image::isImage2dOr2dArray(imageType)) {
296-
appendDepthSurfaces = false;
297-
}
298-
299-
if (imageFormats) {
300-
cl_uint entry = 0;
301-
auto appendFormats = [&](const SurfaceFormatInfo *srcSurfaceFormats, size_t srcFormatsCount) {
302-
for (size_t srcFormatPos = 0; srcFormatPos < srcFormatsCount && entry < numEntries; ++srcFormatPos, ++entry) {
303-
imageFormats[entry] = srcSurfaceFormats[srcFormatPos].OCLImageFormat;
260+
auto appendImageFormats = [&](ArrayRef<const SurfaceFormatInfo> formats) {
261+
if (imageFormats) {
262+
size_t offset = numImageFormats;
263+
for (size_t i = 0; i < formats.size() && offset < numEntries; ++i) {
264+
imageFormats[offset++] = formats[i].OCLImageFormat;
304265
}
305-
};
306-
307-
appendFormats(baseSurfaceFormats, numImageFormats);
308-
309-
if (nv12ExtensionEnabled && appendPlanarYUVSurfaces) {
310-
appendFormats(planarYuvSurfaceFormats, numPlanarYuvSurfaceFormats);
311266
}
267+
numImageFormats += formats.size();
268+
};
312269

313-
if (appendDepthSurfaces) {
314-
appendFormats(depthFormats, numDepthFormats);
270+
if (flags & CL_MEM_READ_ONLY) {
271+
appendImageFormats(SurfaceFormats::readOnly());
272+
if (Image::isImage2d(imageType) && nv12ExtensionEnabled) {
273+
appendImageFormats(SurfaceFormats::planarYuv());
315274
}
316-
317-
if (packedYuvExtensionEnabled && appendPackedYUVSurfaces) {
318-
appendFormats(packedYuvSurfaceFormats, numPackedYuvSurfaceFormats);
275+
if (Image::isImage2dOr2dArray(imageType)) {
276+
appendImageFormats(SurfaceFormats::readOnlyDepth());
319277
}
320-
}
321-
322-
if (numImageFormatsReturned) {
323-
if (nv12ExtensionEnabled && appendPlanarYUVSurfaces) {
324-
numImageFormats += numPlanarYuvSurfaceFormats;
278+
if (Image::isImage2d(imageType) && packedYuvExtensionEnabled) {
279+
appendImageFormats(SurfaceFormats::packedYuv());
325280
}
326-
if (packedYuvExtensionEnabled && appendPackedYUVSurfaces) {
327-
numImageFormats += numPackedYuvSurfaceFormats;
281+
} else if (flags & CL_MEM_WRITE_ONLY) {
282+
appendImageFormats(SurfaceFormats::writeOnly());
283+
if (Image::isImage2dOr2dArray(imageType)) {
284+
appendImageFormats(SurfaceFormats::readWriteDepth());
328285
}
329-
if (appendDepthSurfaces) {
330-
numImageFormats += numDepthFormats;
286+
} else if (nv12ExtensionEnabled && (flags & CL_MEM_NO_ACCESS_INTEL)) {
287+
appendImageFormats(SurfaceFormats::readOnly());
288+
if (Image::isImage2d(imageType)) {
289+
appendImageFormats(SurfaceFormats::planarYuv());
331290
}
332-
291+
} else {
292+
appendImageFormats(SurfaceFormats::readWrite());
293+
if (Image::isImage2dOr2dArray(imageType)) {
294+
appendImageFormats(SurfaceFormats::readWriteDepth());
295+
}
296+
}
297+
if (numImageFormatsReturned) {
333298
*numImageFormatsReturned = static_cast<cl_uint>(numImageFormats);
334299
}
335300
return CL_SUCCESS;
336301
}
302+
337303
} // namespace OCLRT

runtime/helpers/surface_formats.cpp

+81-14
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@
99
#include "runtime/helpers/array_count.h"
1010
#include "runtime/gmm_helper/gmm_lib.h"
1111
#include "runtime/api/cl_types.h"
12+
#include "validators.h"
13+
#include "runtime/mem_obj/image.h"
1214

1315
namespace OCLRT {
1416

1517
// clang-format off
1618

1719
//Initialize this with the required formats first.
1820
//Append the optional one later
19-
const SurfaceFormatInfo readOnlySurfaceFormats[] = {
21+
const SurfaceFormatInfo SurfaceFormats::readOnlySurfaceFormats[] = {
2022
{{CL_RGBA, CL_UNORM_INT8}, GMM_FORMAT_R8G8B8A8_UNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM , 0, 4, 1, 4},
2123
{{CL_RGBA, CL_UNORM_INT16}, GMM_FORMAT_R16G16B16A16_UNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM , 0, 4, 2, 8},
2224
{{CL_RGBA, CL_SIGNED_INT8}, GMM_FORMAT_R8G8B8A8_SINT_TYPE, GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_SINT , 0, 4, 1, 4},
@@ -72,7 +74,7 @@ const SurfaceFormatInfo readOnlySurfaceFormats[] = {
7274
{{CL_RGBA, CL_SNORM_INT16}, GMM_FORMAT_R16G16B16A16_SNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_SNORM , 0, 4, 2, 8},
7375
};
7476

75-
const SurfaceFormatInfo writeOnlySurfaceFormats[] = {
77+
const SurfaceFormatInfo SurfaceFormats::writeOnlySurfaceFormats[] = {
7678
{{CL_RGBA, CL_UNORM_INT8}, GMM_FORMAT_R8G8B8A8_UNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM , 0, 4, 1, 4},
7779
{{CL_RGBA, CL_UNORM_INT16}, GMM_FORMAT_R16G16B16A16_UNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM , 0, 4, 2, 8},
7880
{{CL_RGBA, CL_SIGNED_INT8}, GMM_FORMAT_R8G8B8A8_SINT_TYPE, GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_SINT , 0, 4, 1, 4},
@@ -119,7 +121,7 @@ const SurfaceFormatInfo writeOnlySurfaceFormats[] = {
119121
{{CL_RGBA, CL_SNORM_INT16}, GMM_FORMAT_R16G16B16A16_SNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_SNORM , 0, 4, 2, 8},
120122
};
121123

122-
const SurfaceFormatInfo readWriteSurfaceFormats[] = {
124+
const SurfaceFormatInfo SurfaceFormats::readWriteSurfaceFormats[] = {
123125
{{CL_RGBA, CL_UNORM_INT8}, GMM_FORMAT_R8G8B8A8_UNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_UNORM , 0, 4, 1, 4},
124126
{{CL_RGBA, CL_UNORM_INT16}, GMM_FORMAT_R16G16B16A16_UNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R16G16B16A16_UNORM , 0, 4, 2, 8},
125127
{{CL_RGBA, CL_SIGNED_INT8}, GMM_FORMAT_R8G8B8A8_SINT_TYPE, GFX3DSTATE_SURFACEFORMAT_R8G8B8A8_SINT , 0, 4, 1, 4},
@@ -167,40 +169,105 @@ const SurfaceFormatInfo readWriteSurfaceFormats[] = {
167169
};
168170

169171
#if SUPPORT_YUV
170-
const SurfaceFormatInfo packedYuvSurfaceFormats[] = {
172+
const SurfaceFormatInfo SurfaceFormats::packedYuvSurfaceFormats[] = {
171173
{{CL_YUYV_INTEL, CL_UNORM_INT8}, GMM_FORMAT_YUY2, GFX3DSTATE_SURFACEFORMAT_YCRCB_NORMAL , 0, 2, 1, 2},
172174
{{CL_UYVY_INTEL, CL_UNORM_INT8}, GMM_FORMAT_UYVY, GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPY , 0, 2, 1, 2},
173175
{{CL_YVYU_INTEL, CL_UNORM_INT8}, GMM_FORMAT_YVYU, GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPUV , 0, 2, 1, 2},
174176
{{CL_VYUY_INTEL, CL_UNORM_INT8}, GMM_FORMAT_VYUY, GFX3DSTATE_SURFACEFORMAT_YCRCB_SWAPUVY , 0, 2, 1, 2}
175177
};
176178

177-
const SurfaceFormatInfo planarYuvSurfaceFormats[] = {
179+
const SurfaceFormatInfo SurfaceFormats::planarYuvSurfaceFormats[] = {
178180
{{CL_NV12_INTEL, CL_UNORM_INT8}, GMM_FORMAT_NV12, GFX3DSTATE_SURFACEFORMAT_NV12 , 0, 1, 1, 1}
179181
};
180182

181-
const size_t numPackedYuvSurfaceFormats = arrayCount(packedYuvSurfaceFormats);
182-
const size_t numPlanarYuvSurfaceFormats = arrayCount(planarYuvSurfaceFormats);
183+
183184
#endif
184185

185-
const SurfaceFormatInfo readOnlyDepthSurfaceFormats[] = {
186+
const SurfaceFormatInfo SurfaceFormats::readOnlyDepthSurfaceFormats[] = {
186187
{{ CL_DEPTH, CL_FLOAT}, GMM_FORMAT_R32_FLOAT_TYPE, GFX3DSTATE_SURFACEFORMAT_R32_FLOAT , 0, 1, 4, 4},
187188
{{ CL_DEPTH, CL_UNORM_INT16}, GMM_FORMAT_R16_UNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R16_UNORM , 0, 1, 2, 2},
188189
{{ CL_DEPTH_STENCIL, CL_UNORM_INT24}, GMM_FORMAT_GENERIC_32BIT, GFX3DSTATE_SURFACEFORMAT_R24_UNORM_X8_TYPELESS , 0, 1, 4, 4},
189190
{{ CL_DEPTH_STENCIL, CL_FLOAT}, GMM_FORMAT_R32G32_FLOAT_TYPE, GFX3DSTATE_SURFACEFORMAT_R32_FLOAT_X8X24_TYPELESS, 0, 2, 4, 8}
190191
};
191192

192-
const SurfaceFormatInfo readWriteDepthSurfaceFormats[] = {
193+
const SurfaceFormatInfo SurfaceFormats::readWriteDepthSurfaceFormats[] = {
193194
{{ CL_DEPTH, CL_FLOAT}, GMM_FORMAT_R32_FLOAT_TYPE, GFX3DSTATE_SURFACEFORMAT_R32_FLOAT , 0, 1, 4, 4},
194195
{{ CL_DEPTH, CL_UNORM_INT16}, GMM_FORMAT_R16_UNORM_TYPE, GFX3DSTATE_SURFACEFORMAT_R16_UNORM , 0, 1, 2, 2}
195196
};
196197

197-
const size_t numReadOnlyDepthSurfaceFormats = arrayCount(readOnlyDepthSurfaceFormats);
198-
const size_t numReadWriteDepthSurfaceFormats = arrayCount(readWriteDepthSurfaceFormats);
198+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::readOnly() noexcept {
199+
return ArrayRef<const SurfaceFormatInfo>(readOnlySurfaceFormats);
200+
}
201+
202+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::writeOnly() noexcept {
203+
return ArrayRef<const SurfaceFormatInfo>(writeOnlySurfaceFormats);
204+
}
205+
206+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::readWrite() noexcept {
207+
return ArrayRef<const SurfaceFormatInfo>(readWriteSurfaceFormats);
208+
}
209+
210+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::packedYuv() noexcept {
211+
#if SUPPORT_YUV
212+
return ArrayRef<const SurfaceFormatInfo>(packedYuvSurfaceFormats);
213+
#else
214+
return ArrayRef<const SurfaceFormatInfo>();
215+
#endif
216+
}
217+
218+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::planarYuv() noexcept {
219+
#if SUPPORT_YUV
220+
return ArrayRef<const SurfaceFormatInfo>(planarYuvSurfaceFormats);
221+
#else
222+
return ArrayRef<const SurfaceFormatInfo>();
223+
#endif
224+
}
225+
226+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::readOnlyDepth() noexcept {
227+
return ArrayRef<const SurfaceFormatInfo>(readOnlyDepthSurfaceFormats);
228+
}
229+
230+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::readWriteDepth() noexcept {
231+
return ArrayRef<const SurfaceFormatInfo>(readWriteDepthSurfaceFormats);
232+
}
199233

234+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::surfaceFormats(cl_mem_flags flags) noexcept {
235+
if (flags & CL_MEM_READ_ONLY) {
236+
return readOnly();
237+
}
238+
else if (flags & CL_MEM_WRITE_ONLY) {
239+
return writeOnly();
240+
}
241+
else {
242+
return readWrite();
243+
}
244+
}
200245

201-
const size_t numReadOnlySurfaceFormats = arrayCount(readOnlySurfaceFormats);
202-
const size_t numWriteOnlySurfaceFormats = arrayCount(writeOnlySurfaceFormats);
203-
const size_t numReadWriteSurfaceFormats = arrayCount(readWriteSurfaceFormats);
246+
ArrayRef<const SurfaceFormatInfo> SurfaceFormats::surfaceFormats(cl_mem_flags flags, const cl_image_format *imageFormat) noexcept {
247+
if (OCLRT::IsNV12Image(imageFormat)) {
248+
return planarYuv();
249+
}
250+
else if (IsPackedYuvImage(imageFormat)) {
251+
return packedYuv();
252+
}
253+
else if (Image::isDepthFormat(*imageFormat)) {
254+
if (flags & CL_MEM_READ_ONLY) {
255+
return readOnlyDepth();
256+
}
257+
else {
258+
return readWriteDepth();
259+
}
260+
}
261+
else if (flags & CL_MEM_READ_ONLY) {
262+
return readOnly();
263+
}
264+
else if (flags & CL_MEM_WRITE_ONLY) {
265+
return writeOnly();
266+
}
267+
else {
268+
return readWrite();
269+
}
270+
}
204271

205272
// clang-format on
206273
} // namespace OCLRT

runtime/helpers/surface_formats.h

+21-17
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#endif
1515

1616
#include "runtime/gmm_helper/gmm_lib.h"
17+
#include "runtime/utilities/arrayref.h"
1718

1819
namespace OCLRT {
1920
enum GFX3DSTATE_SURFACEFORMAT : unsigned short {
@@ -227,26 +228,29 @@ struct McsSurfaceInfo {
227228
uint32_t multisampleCount;
228229
};
229230

230-
extern const size_t numReadOnlySurfaceFormats;
231-
extern const size_t numWriteOnlySurfaceFormats;
232-
extern const size_t numReadWriteSurfaceFormats;
233-
234-
extern const SurfaceFormatInfo readOnlySurfaceFormats[];
235-
extern const SurfaceFormatInfo writeOnlySurfaceFormats[];
236-
extern const SurfaceFormatInfo readWriteSurfaceFormats[];
237-
extern const SurfaceFormatInfo noAccessSurfaceFormats[];
238-
231+
class SurfaceFormats {
232+
private:
233+
static const SurfaceFormatInfo readOnlySurfaceFormats[];
234+
static const SurfaceFormatInfo writeOnlySurfaceFormats[];
235+
static const SurfaceFormatInfo readWriteSurfaceFormats[];
236+
static const SurfaceFormatInfo readOnlyDepthSurfaceFormats[];
237+
static const SurfaceFormatInfo readWriteDepthSurfaceFormats[];
239238
#ifdef SUPPORT_YUV
240-
extern const size_t numPackedYuvSurfaceFormats;
241-
extern const size_t numPlanarYuvSurfaceFormats;
242-
extern const SurfaceFormatInfo packedYuvSurfaceFormats[];
243-
extern const SurfaceFormatInfo planarYuvSurfaceFormats[];
239+
static const SurfaceFormatInfo packedYuvSurfaceFormats[];
240+
static const SurfaceFormatInfo planarYuvSurfaceFormats[];
244241
#endif
245242

246-
extern const size_t numReadOnlyDepthSurfaceFormats;
247-
extern const size_t numReadWriteDepthSurfaceFormats;
243+
public:
244+
static ArrayRef<const SurfaceFormatInfo> readOnly() noexcept;
245+
static ArrayRef<const SurfaceFormatInfo> writeOnly() noexcept;
246+
static ArrayRef<const SurfaceFormatInfo> readWrite() noexcept;
247+
static ArrayRef<const SurfaceFormatInfo> packedYuv() noexcept;
248+
static ArrayRef<const SurfaceFormatInfo> planarYuv() noexcept;
249+
static ArrayRef<const SurfaceFormatInfo> readOnlyDepth() noexcept;
250+
static ArrayRef<const SurfaceFormatInfo> readWriteDepth() noexcept;
248251

249-
extern const SurfaceFormatInfo readOnlyDepthSurfaceFormats[];
250-
extern const SurfaceFormatInfo readWriteDepthSurfaceFormats[];
252+
static ArrayRef<const SurfaceFormatInfo> surfaceFormats(cl_mem_flags flags) noexcept;
253+
static ArrayRef<const SurfaceFormatInfo> surfaceFormats(cl_mem_flags flags, const cl_image_format *imageFormat) noexcept;
254+
};
251255

252256
} // namespace OCLRT

0 commit comments

Comments
 (0)