Name Strings

    cl_amd_media_ops

    #pragma OPENCL EXTENSION cl_amd_media_ops : enable

Contributors

    Benedict Gaster, AMD
    Michael Houston, AMD
    Giduthuri Radha, AMD
    Micah Villmow, AMD
    Bixia Zheng, AMD

Version

    Version 1, March 28, 2010

Number

    OpenCL Extension #9

Status

    Complete, shipping as part of ATi Stream SDK 2.1

Extension Type

    OpenCL compiler directive for extensions

Dependencies

    None

Overview

    The directive when enabled adds the following built-in functions to
    the OpenCL language.
    
    Note: typen denote opencl scalar type {n = 1} and vector types {n =
    4, 8, 16}.
 
    Build-in Function   
      uint  amd_pack(float4 src)
    Description
      dst =   ((((uint)src.s0) & 0xff)      )
            + ((((uint)src.s1) & 0xff) <<  8)
            + ((((uint)src.s2) & 0xff) << 16)
            + ((((uint)src.s3) & 0xff) << 24)
    
    Build-in Function      
      floatn  amd_unpack3(unitn src)
    Description
      dst.s0 = (float)((src.s0 >> 24) & 0xff)
      similar operation applied to other components of the vectors
    
    Build-in Function   
      floatn   amd_unpack2 (unitn src)
    Description
      dst.s0 = (float)((src.s0 >> 16) & 0xff)
      similar operation applied to other components of the vectors
    
    Build-in Function 
      floatn   amd_unpack1 (unitn src)
    Description
      dst.s0 = (float)((src.s0 >> 8) & 0xff)
      similar operation applied to other components of the vectors
    
    Build-in Function   
      floatn   amd_unpack0 (unitn src)
    Description
      dst.s0 = (float)(src.s0 & 0xff)
      similar operation applied to other components of the vectors
    
    Build-in Function   
      uintn  amd_bitalign (uintn src0, uintn src1, uintn src2)
    Description
      dst.s0 =  (uint) (((((long)src0.s0) << 32) | (long)src1.s0) >> (src2.s0 & 31))
      similar operation applied to other components of the vectors.
    
     
    Build-in Function
      uintn  amd_bytealign (uintn src0, uintn src1, uintn src2)
    Description
      dst.s0 =  (uint) (((((long)src0.s0) << 32) | (long)src1.s0) >> ((src2.s0 & 3)*8))
      similar operation applied to other components of the vectors
    
    Build-in Function   
      uintn  amd_lerp (uintn src0, uintn src1, uintn src2)
    Description
      dst.s0 = (((((src0.s0 >>  0) & 0xff) + ((src1.s0 >>  0) & 0xff) + ((src2.s0 >>  0) & 1)) >> 1) <<  0) +
               (((((src0.s0 >>  8) & 0xff) + ((src1.s0 >>  8) & 0xff) + ((src2.s0 >>  8) & 1)) >> 1) <<  8) +
               (((((src0.s0 >> 16) & 0xff) + ((src1.s0 >> 16) & 0xff) + ((src2.s0 >> 16) & 1)) >> 1) << 16) +
               (((((src0.s0 >> 24) & 0xff) + ((src1.s0 >> 24) & 0xff) + ((src2.s0 >> 24) & 1)) >> 1) << 24);
      similar operation applied to other components of the vectors
    
    Build-in Function  
      uintn  amd_sad (uintn src0, uintn src1, uintn src2)  
    Description
      dst.s0 = src2.s0 + 
               abs(((src0.s0 >>  0) & 0xff) - ((src1.s0 >>  0) & 0xff)) +
               abs(((src0.s0 >>  8) & 0xff) - ((src1.s0 >>  8) & 0xff)) +
               abs(((src0.s0 >> 16) & 0xff) - ((src1.s0 >> 16) & 0xff)) +
               abs(((src0.s0 >> 24) & 0xff) - ((src1.s0 >> 24) & 0xff));
      similar operation applied to other components of the vectors
    
    Build-in Function   
      uintn  amd_sadhi (uintn src0, uintn src1n, uintn src2)
    Description
      dst.s0 = src2.s0 + 
               (abs(((src0.s0 >>  0) & 0xff) - ((src1.s0 >>  0) & 0xff)) << 16) +
               (abs(((src0.s0 >>  8) & 0xff) - ((src1.s0 >>  8) & 0xff)) << 16) +
               (abs(((src0.s0 >> 16) & 0xff) - ((src1.s0 >> 16) & 0xff)) << 16) +
               (abs(((src0.s0 >> 24) & 0xff) - ((src1.s0 >> 24) & 0xff)) << 16);
      similar operation applied to other components of the vectors
    
    Build-in Function   
      uint  amd_sad4(uint4 src0, uint4 src1, uint src2)
    Description
      dst   = src2   + 
               abs(((src0.s0 >>  0) & 0xff) - ((src1.s0 >>  0) & 0xff)) +
               abs(((src0.s0 >>  8) & 0xff) - ((src1.s0 >>  8) & 0xff)) +
               abs(((src0.s0 >> 16) & 0xff) - ((src1.s0 >> 16) & 0xff)) +
               abs(((src0.s0 >> 24) & 0xff) - ((src1.s0 >> 24) & 0xff)) +
               abs(((src0.s1 >>  0) & 0xff) - ((src1.s0 >>  0) & 0xff)) +
               abs(((src0.s1 >>  8) & 0xff) - ((src1.s1 >>  8) & 0xff)) +
               abs(((src0.s1 >> 16) & 0xff) - ((src1.s1 >> 16) & 0xff)) +
               abs(((src0.s1 >> 24) & 0xff) - ((src1.s1 >> 24) & 0xff)) +
               abs(((src0.s2 >>  0) & 0xff) - ((src1.s2 >>  0) & 0xff)) +
               abs(((src0.s2 >>  8) & 0xff) - ((src1.s2 >>  8) & 0xff)) +
               abs(((src0.s2 >> 16) & 0xff) - ((src1.s2 >> 16) & 0xff)) +
               abs(((src0.s2 >> 24) & 0xff) - ((src1.s2 >> 24) & 0xff)) +
               abs(((src0.s3 >>  0) & 0xff) - ((src1.s3 >>  0) & 0xff)) +
               abs(((src0.s3 >>  8) & 0xff) - ((src1.s3 >>  8) & 0xff)) +
               abs(((src0.s3 >> 16) & 0xff) - ((src1.s3 >> 16) & 0xff)) +
               abs(((src0.s3 >> 24) & 0xff) - ((src1.s3 >> 24) & 0xff));
    
Header File

    None

New Types

    None

New Procedures and Functions

    None
