mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
250 lines
6.2 KiB
C++
250 lines
6.2 KiB
C++
//
|
|
// Copyright (c) 2017 The Khronos Group Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
#include "imageHelpers.h"
|
|
|
|
size_t get_format_type_size( const cl_image_format *format )
|
|
{
|
|
return get_channel_data_type_size( format->image_channel_data_type );
|
|
}
|
|
|
|
size_t get_channel_data_type_size( cl_channel_type channelType )
|
|
{
|
|
switch( channelType )
|
|
{
|
|
case CL_SNORM_INT8:
|
|
case CL_UNORM_INT8:
|
|
case CL_SIGNED_INT8:
|
|
case CL_UNSIGNED_INT8:
|
|
return 1;
|
|
|
|
case CL_SNORM_INT16:
|
|
case CL_UNORM_INT16:
|
|
case CL_SIGNED_INT16:
|
|
case CL_UNSIGNED_INT16:
|
|
case CL_HALF_FLOAT:
|
|
#ifdef CL_SFIXED14_APPLE
|
|
case CL_SFIXED14_APPLE:
|
|
#endif
|
|
return sizeof( cl_short );
|
|
|
|
case CL_SIGNED_INT32:
|
|
case CL_UNSIGNED_INT32:
|
|
return sizeof( cl_int );
|
|
|
|
case CL_UNORM_SHORT_565:
|
|
case CL_UNORM_SHORT_555:
|
|
#ifdef OBSOLETE_FORAMT
|
|
case CL_UNORM_SHORT_565_REV:
|
|
case CL_UNORM_SHORT_555_REV:
|
|
#endif
|
|
return 2;
|
|
|
|
#ifdef OBSOLETE_FORAMT
|
|
case CL_UNORM_INT_8888:
|
|
case CL_UNORM_INT_8888_REV:
|
|
return 4;
|
|
#endif
|
|
|
|
case CL_UNORM_INT_101010:
|
|
#ifdef OBSOLETE_FORAMT
|
|
case CL_UNORM_INT_101010_REV:
|
|
#endif
|
|
return 4;
|
|
|
|
case CL_FLOAT:
|
|
return sizeof( cl_float );
|
|
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
size_t get_format_channel_count( const cl_image_format *format )
|
|
{
|
|
return get_channel_order_channel_count( format->image_channel_order );
|
|
}
|
|
|
|
size_t get_channel_order_channel_count( cl_channel_order order )
|
|
{
|
|
switch( order )
|
|
{
|
|
case CL_R:
|
|
case CL_A:
|
|
case CL_Rx:
|
|
case CL_INTENSITY:
|
|
case CL_LUMINANCE:
|
|
return 1;
|
|
|
|
case CL_RG:
|
|
case CL_RA:
|
|
case CL_RGx:
|
|
return 2;
|
|
|
|
case CL_RGB:
|
|
case CL_RGBx:
|
|
return 3;
|
|
|
|
case CL_RGBA:
|
|
case CL_ARGB:
|
|
case CL_BGRA:
|
|
#ifdef CL_1RGB_APPLE
|
|
case CL_1RGB_APPLE:
|
|
#endif
|
|
#ifdef CL_BGR1_APPLE
|
|
case CL_BGR1_APPLE:
|
|
#endif
|
|
return 4;
|
|
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int is_format_signed( const cl_image_format *format )
|
|
{
|
|
switch( format->image_channel_data_type )
|
|
{
|
|
case CL_SNORM_INT8:
|
|
case CL_SIGNED_INT8:
|
|
case CL_SNORM_INT16:
|
|
case CL_SIGNED_INT16:
|
|
case CL_SIGNED_INT32:
|
|
case CL_HALF_FLOAT:
|
|
case CL_FLOAT:
|
|
#ifdef CL_SFIXED14_APPLE
|
|
case CL_SFIXED14_APPLE:
|
|
#endif
|
|
return 1;
|
|
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
size_t get_pixel_size( cl_image_format *format )
|
|
{
|
|
switch( format->image_channel_data_type )
|
|
{
|
|
case CL_SNORM_INT8:
|
|
case CL_UNORM_INT8:
|
|
case CL_SIGNED_INT8:
|
|
case CL_UNSIGNED_INT8:
|
|
return get_format_channel_count( format );
|
|
|
|
case CL_SNORM_INT16:
|
|
case CL_UNORM_INT16:
|
|
case CL_SIGNED_INT16:
|
|
case CL_UNSIGNED_INT16:
|
|
case CL_HALF_FLOAT:
|
|
#ifdef CL_SFIXED14_APPLE
|
|
case CL_SFIXED14_APPLE:
|
|
#endif
|
|
return get_format_channel_count( format ) * sizeof( cl_ushort );
|
|
|
|
case CL_SIGNED_INT32:
|
|
case CL_UNSIGNED_INT32:
|
|
return get_format_channel_count( format ) * sizeof( cl_int );
|
|
|
|
case CL_UNORM_SHORT_565:
|
|
case CL_UNORM_SHORT_555:
|
|
#ifdef OBSOLETE_FORAMT
|
|
case CL_UNORM_SHORT_565_REV:
|
|
case CL_UNORM_SHORT_555_REV:
|
|
#endif
|
|
return 2;
|
|
|
|
#ifdef OBSOLETE_FORAMT
|
|
case CL_UNORM_INT_8888:
|
|
case CL_UNORM_INT_8888_REV:
|
|
return 4;
|
|
#endif
|
|
|
|
case CL_UNORM_INT_101010:
|
|
#ifdef OBSOLETE_FORAMT
|
|
case CL_UNORM_INT_101010_REV:
|
|
#endif
|
|
return 4;
|
|
|
|
case CL_FLOAT:
|
|
return get_format_channel_count( format ) * sizeof( cl_float );
|
|
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
int get_8_bit_image_format( cl_context context, cl_mem_object_type objType, cl_mem_flags flags, size_t channelCount, cl_image_format *outFormat )
|
|
{
|
|
cl_image_format formatList[ 128 ];
|
|
unsigned int outFormatCount, i;
|
|
int error;
|
|
|
|
|
|
/* Make sure each image format is supported */
|
|
if ((error = clGetSupportedImageFormats( context, flags, objType, 128, formatList, &outFormatCount )))
|
|
return error;
|
|
|
|
|
|
/* Look for one that is an 8-bit format */
|
|
for( i = 0; i < outFormatCount; i++ )
|
|
{
|
|
if( formatList[ i ].image_channel_data_type == CL_SNORM_INT8 ||
|
|
formatList[ i ].image_channel_data_type == CL_UNORM_INT8 ||
|
|
formatList[ i ].image_channel_data_type == CL_SIGNED_INT8 ||
|
|
formatList[ i ].image_channel_data_type == CL_UNSIGNED_INT8 )
|
|
{
|
|
if ( !channelCount || ( channelCount && ( get_format_channel_count( &formatList[ i ] ) == channelCount ) ) )
|
|
{
|
|
*outFormat = formatList[ i ];
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int get_32_bit_image_format( cl_context context, cl_mem_object_type objType, cl_mem_flags flags, size_t channelCount, cl_image_format *outFormat )
|
|
{
|
|
cl_image_format formatList[ 128 ];
|
|
unsigned int outFormatCount, i;
|
|
int error;
|
|
|
|
|
|
/* Make sure each image format is supported */
|
|
if ((error = clGetSupportedImageFormats( context, flags, objType, 128, formatList, &outFormatCount )))
|
|
return error;
|
|
|
|
/* Look for one that is an 8-bit format */
|
|
for( i = 0; i < outFormatCount; i++ )
|
|
{
|
|
if( formatList[ i ].image_channel_data_type == CL_UNORM_INT_101010 ||
|
|
formatList[ i ].image_channel_data_type == CL_FLOAT ||
|
|
formatList[ i ].image_channel_data_type == CL_SIGNED_INT32 ||
|
|
formatList[ i ].image_channel_data_type == CL_UNSIGNED_INT32 )
|
|
{
|
|
if ( !channelCount || ( channelCount && ( get_format_channel_count( &formatList[ i ] ) == channelCount ) ) )
|
|
{
|
|
*outFormat = formatList[ i ];
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|