Device texture functions should not normalize the sampled pixel (#1826)
* Device texture functions should not normalize the sampled pixel. This is already done by HW. * Add support to use h/w capability for normalized float data convertion for driver API's Co-authored-by: ansurya <50609411+ansurya@users.noreply.github.com>
Этот коммит содержится в:
@@ -57,6 +57,7 @@ struct __HIP_TEXTURE_ATTRIB texture : public textureReference {
|
||||
texture(int norm = 0, enum hipTextureFilterMode fMode = hipFilterModePoint,
|
||||
enum hipTextureAddressMode aMode = hipAddressModeClamp) {
|
||||
normalized = norm;
|
||||
readMode = hipReadModeNormalizedFloat;
|
||||
filterMode = fMode;
|
||||
addressMode[0] = aMode;
|
||||
addressMode[1] = aMode;
|
||||
@@ -68,6 +69,7 @@ struct __HIP_TEXTURE_ATTRIB texture : public textureReference {
|
||||
texture(int norm, enum hipTextureFilterMode fMode, enum hipTextureAddressMode aMode,
|
||||
struct hipChannelFormatDesc desc) {
|
||||
normalized = norm;
|
||||
readMode = hipReadModeNormalizedFloat;
|
||||
filterMode = fMode;
|
||||
addressMode[0] = aMode;
|
||||
addressMode[1] = aMode;
|
||||
|
||||
@@ -157,32 +157,16 @@ union TData {
|
||||
|
||||
#define TEXTURE_RETURN_UINT_XYZW return make_uint4(texel.u.x, texel.u.y, texel.u.z, texel.u.w);
|
||||
|
||||
#define TEXTURE_RETURN_FLOAT return (texFormatToSize[texRef.format] == 1)? texel.f.x : (float)texel.u.x/texFormatToSize[texRef.format];
|
||||
#define TEXTURE_RETURN_FLOAT return texel.f.x;
|
||||
|
||||
#define TEXTURE_RETURN_FLOAT_X return (texFormatToSize[texRef.format] == 1)? make_float1(texel.f.x) : make_float1((float)texel.u.x/texFormatToSize[texRef.format]);
|
||||
#define TEXTURE_RETURN_FLOAT_X return make_float1(texel.f.x);
|
||||
|
||||
#define TEXTURE_RETURN_FLOAT_XY return (texFormatToSize[texRef.format] == 1)? make_float2(texel.f.x, texel.f.y) : make_float2((float)texel.u.x/texFormatToSize[texRef.format], (float)texel.u.y/texFormatToSize[texRef.format]);
|
||||
#define TEXTURE_RETURN_FLOAT_XY return make_float2(texel.f.x, texel.f.y);
|
||||
|
||||
#define TEXTURE_RETURN_FLOAT_XYZW return (texFormatToSize[texRef.format] == 1)? make_float4(texel.f.x, texel.f.y, texel.f.z, texel.f.w) : make_float4((float)texel.u.x/texFormatToSize[texRef.format], (float)texel.u.y/texFormatToSize[texRef.format], (float)texel.u.z/texFormatToSize[texRef.format], (float)texel.u.w/texFormatToSize[texRef.format]) ;
|
||||
#define TEXTURE_RETURN_FLOAT_XYZW return make_float4(texel.f.x, texel.f.y, texel.f.z, texel.f.w);
|
||||
|
||||
extern "C" {
|
||||
|
||||
// this is really a sparse array with only valid values being the ones indexed by the enum hipArray_Format(e.g. texFormatToSize[HIP_AD_FORMAT_UNSIGNED_INT8] = UCHAR_MAX)
|
||||
__device__ __constant__ static int texFormatToSize[] = {
|
||||
1, /* HIP_AD_FORMAT_NOT_INITIALIZED */
|
||||
UCHAR_MAX, /* HIP_AD_FORMAT_UNSIGNED_INT8 */
|
||||
USHRT_MAX, /* HIP_AD_FORMAT_UNSIGNED_INT16 */
|
||||
1, /* HIP_AD_FORMAT_UNSIGNED_INT32 */
|
||||
1,1,1,1, /* Invalid values */
|
||||
SCHAR_MAX, /* HIP_AD_FORMAT_SIGNED_INT8 */
|
||||
SHRT_MAX, /* HIP_AD_FORMAT_SIGNED_INT16 */
|
||||
1, /* HIP_AD_FORMAT_SIGNED_INT32 */
|
||||
1,1,1,1,1, /* Invalid values */
|
||||
1, /* HIP_AD_FORMAT_HALF */
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* Invalid values */
|
||||
1 /* HIP_AD_FORMAT_FLOAT */
|
||||
};
|
||||
|
||||
__device__
|
||||
__hip_float4_vector_value_type __ockl_image_sample_1D(
|
||||
unsigned int ADDRESS_SPACE_CONSTANT* i, unsigned int ADDRESS_SPACE_CONSTANT* s,
|
||||
|
||||
@@ -73,6 +73,7 @@ enum hipTextureReadMode { hipReadModeElementType = 0, hipReadModeNormalizedFloat
|
||||
*/
|
||||
typedef struct textureReference {
|
||||
int normalized;
|
||||
enum hipTextureReadMode readMode;// used only for driver API's
|
||||
enum hipTextureFilterMode filterMode;
|
||||
enum hipTextureAddressMode addressMode[3]; // Texture address mode for up to 3 dimensions
|
||||
struct hipChannelFormatDesc channelDesc;
|
||||
|
||||
Ссылка в новой задаче
Block a user