2014-07-04 16:17:05 -04:00
//
// Copyright (c) 2010 Advanced Micro Devices, Inc. All rights reserved.
//
#include "platform/commandqueue.hpp"
#include "device/device.hpp"
#include "device/blit.hpp"
#include "utils/debug.hpp"
namespace device {
HostBlitManager :: HostBlitManager ( VirtualDevice & vDev , Setup setup )
: BlitManager ( setup )
, vDev_ ( vDev )
, dev_ ( vDev . device ())
{ }
bool
HostBlitManager :: readBuffer (
device :: Memory & srcMemory ,
void * dstHost ,
const amd :: Coord3D & origin ,
const amd :: Coord3D & size ,
bool entire ) const
{
// Map the device memory to CPU visible
void * src = srcMemory . cpuMap ( vDev_ , Memory :: CpuReadOnly );
if ( NULL == src ) {
LogError ( "Couldn't map device memory for host read" );
return false ;
}
// Copy memory
amd :: Os :: fastMemcpy ( dstHost ,
reinterpret_cast < const_address > ( src ) + origin [ 0 ], size [ 0 ]);
// Unmap device memory
srcMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: readBufferRect (
device :: Memory & srcMemory ,
void * dstHost ,
const amd :: BufferRect & bufRect ,
const amd :: BufferRect & hostRect ,
const amd :: Coord3D & size ,
bool entire ) const
{
// Map source memory
void * src = srcMemory . cpuMap ( vDev_ , Memory :: CpuReadOnly );
if ( src == NULL ) {
LogError ( "Couldn't map source memory" );
return false ;
}
size_t srcOffset ;
size_t dstOffset ;
for ( size_t z = 0 ; z < size [ 2 ]; ++ z ) {
for ( size_t y = 0 ; y < size [ 1 ]; ++ y ) {
srcOffset = bufRect . offset ( 0 , y , z );
dstOffset = hostRect . offset ( 0 , y , z );
// Copy memory line by line
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dstHost ) + dstOffset ),
( reinterpret_cast < const_address > ( src ) + srcOffset ),
size [ 0 ]);
}
}
// Unmap source memory
srcMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: readImage (
device :: Memory & srcMemory ,
void * dstHost ,
const amd :: Coord3D & origin ,
const amd :: Coord3D & size ,
size_t rowPitch ,
size_t slicePitch ,
bool entire ) const
{
size_t startLayer = origin [ 2 ];
size_t numLayers = size [ 2 ];
if ( srcMemory . owner () -> getType () == CL_MEM_OBJECT_IMAGE1D_ARRAY ) {
startLayer = origin [ 1 ];
numLayers = size [ 1 ];
}
// rowPitch and slicePitch in bytes
size_t srcRowPitch ;
size_t srcSlicePitch ;
// Get physical GPU memmory
void * src = srcMemory . cpuMap ( vDev_ , Memory :: CpuReadOnly ,
startLayer , numLayers , & srcRowPitch , & srcSlicePitch );
if ( NULL == src ) {
LogError ( "Couldn't map GPU memory for host read" );
return false ;
}
size_t elementSize = srcMemory . owner () -> asImage () -> getImageFormat (). getElementSize ();
size_t srcOffsBase = origin [ 0 ] * elementSize ;
size_t copySize = size [ 0 ] * elementSize ;
size_t srcOffs ;
size_t dstOffs = 0 ;
// Make sure we use the right pitch if it's not specified
if ( rowPitch == 0 ) {
rowPitch = size [ 0 ] * elementSize ;
}
// Make sure we use the right slice if it's not specified
if ( slicePitch == 0 ) {
slicePitch = size [ 0 ] * size [ 1 ] * elementSize ;
}
// Adjust destination offset with Y dimension
srcOffsBase += srcRowPitch * origin [ 1 ];
// Adjust the destination offset with Z dimension
srcOffsBase += srcSlicePitch * origin [ 2 ];
// Copy memory line by line
for ( size_t slice = 0 ; slice < size [ 2 ]; ++ slice ) {
srcOffs = srcOffsBase + slice * srcSlicePitch ;
dstOffs = slice * slicePitch ;
// Copy memory line by line
for ( size_t row = 0 ; row < size [ 1 ]; ++ row ) {
// Copy memory
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dstHost ) + dstOffs ),
( reinterpret_cast < const_address > ( src ) + srcOffs ),
copySize );
srcOffs += srcRowPitch ;
dstOffs += rowPitch ;
}
}
// Unmap the device memory
srcMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: writeBuffer (
const void * srcHost ,
device :: Memory & dstMemory ,
const amd :: Coord3D & origin ,
const amd :: Coord3D & size ,
bool entire ) const
{
uint flags = 0 ;
if ( entire ) {
flags = Memory :: CpuWriteOnly ;
}
// Map the device memory to CPU visible
void * dst = dstMemory . cpuMap ( vDev_ , flags );
if ( NULL == dst ) {
LogError ( "Couldn't map GPU memory for host write" );
return false ;
}
// Copy memory
amd :: Os :: fastMemcpy (
reinterpret_cast < address > ( dst ) + origin [ 0 ], srcHost , size [ 0 ]);
// Unmap the device memory
dstMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: writeBufferRect (
const void * srcHost ,
device :: Memory & dstMemory ,
const amd :: BufferRect & hostRect ,
const amd :: BufferRect & bufRect ,
const amd :: Coord3D & size ,
bool entire ) const
{
// Map destination memory
void * dst = dstMemory . cpuMap ( vDev_ , ( entire ) ? Memory :: CpuWriteOnly : 0 );
if ( dst == NULL ) {
LogError ( "Couldn't map destination memory" );
return false ;
}
size_t srcOffset ;
size_t dstOffset ;
for ( size_t z = 0 ; z < size [ 2 ]; ++ z ) {
for ( size_t y = 0 ; y < size [ 1 ]; ++ y ) {
srcOffset = hostRect . offset ( 0 , y , z );
dstOffset = bufRect . offset ( 0 , y , z );
// Copy memory line by line
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dst ) + dstOffset ),
( reinterpret_cast < const_address > ( srcHost ) + srcOffset ),
size [ 0 ]);
}
}
// Unmap destination memory
dstMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: writeImage (
const void * srcHost ,
device :: Memory & dstMemory ,
const amd :: Coord3D & origin ,
const amd :: Coord3D & size ,
size_t rowPitch ,
size_t slicePitch ,
bool entire ) const
{
uint flags = 0 ;
if ( entire ) {
flags = Memory :: CpuWriteOnly ;
}
size_t startLayer = origin [ 2 ];
size_t numLayers = size [ 2 ];
if ( dstMemory . owner () -> getType () == CL_MEM_OBJECT_IMAGE1D_ARRAY ) {
startLayer = origin [ 1 ];
numLayers = size [ 1 ];
}
// rowPitch and slicePitch in bytes
size_t dstRowPitch ;
size_t dstSlicePitch ;
// Map the device memory to CPU visible
void * dst = dstMemory . cpuMap ( vDev_ , flags ,
startLayer , numLayers , & dstRowPitch , & dstSlicePitch );
if ( NULL == dst ) {
LogError ( "Couldn't map GPU memory for host write" );
return false ;
}
size_t elementSize = dstMemory . owner () -> asImage () -> getImageFormat (). getElementSize ();
size_t srcOffs = 0 ;
size_t copySize = size [ 0 ] * elementSize ;
size_t dstOffsBase = origin [ 0 ] * elementSize ;
size_t dstOffs ;
// Make sure we use the right pitch if it's not specified
if ( rowPitch == 0 ) {
rowPitch = size [ 0 ] * elementSize ;
}
// Make sure we use the right slice if it's not specified
if ( slicePitch == 0 ) {
slicePitch = size [ 0 ] * size [ 1 ] * elementSize ;
}
// Adjust the destination offset with Y dimension
dstOffsBase += dstRowPitch * origin [ 1 ];
// Adjust the destination offset with Z dimension
dstOffsBase += dstSlicePitch * origin [ 2 ];
// Copy memory slice by slice
for ( size_t slice = 0 ; slice < size [ 2 ]; ++ slice ) {
dstOffs = dstOffsBase + slice * dstSlicePitch ;
srcOffs = slice * slicePitch ;
// Copy memory line by line
for ( size_t row = 0 ; row < size [ 1 ]; ++ row ) {
// Copy memory
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dst ) + dstOffs ),
( reinterpret_cast < const_address > ( srcHost ) + srcOffs ),
copySize );
dstOffs += dstRowPitch ;
srcOffs += rowPitch ;
}
}
// Unmap the device memory
dstMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: copyBuffer (
device :: Memory & srcMemory ,
device :: Memory & dstMemory ,
const amd :: Coord3D & srcOrigin ,
const amd :: Coord3D & dstOrigin ,
const amd :: Coord3D & size ,
bool entire ) const
{
// Map source memory
void * src = srcMemory . cpuMap ( vDev_ ,
// Overlap detection
( & srcMemory == & dstMemory ) ? 0 : Memory :: CpuReadOnly );
if ( src == NULL ) {
LogError ( "Couldn't map source memory" );
return false ;
}
// Map destination memory
void * dst = dstMemory . cpuMap ( vDev_ , ( entire ) ? Memory :: CpuWriteOnly : 0 );
if ( dst == NULL ) {
LogError ( "Couldn't map destination memory" );
return false ;
}
// Straight forward buffer copy
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dst ) + dstOrigin [ 0 ]),
( reinterpret_cast < const_address > ( src ) + srcOrigin [ 0 ]),
size [ 0 ]);
// Unmap source and destination memory
dstMemory . cpuUnmap ( vDev_ );
srcMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: copyBufferRect (
device :: Memory & srcMemory ,
device :: Memory & dstMemory ,
const amd :: BufferRect & srcRect ,
const amd :: BufferRect & dstRect ,
const amd :: Coord3D & size ,
bool entire ) const
{
// Map source memory
void * src = srcMemory . cpuMap ( vDev_ ,
// Overlap detection
( & srcMemory == & dstMemory ) ? 0 : Memory :: CpuReadOnly );
if ( src == NULL ) {
LogError ( "Couldn't map source memory" );
return false ;
}
// Map destination memory
void * dst = dstMemory . cpuMap ( vDev_ , ( entire ) ? Memory :: CpuWriteOnly : 0 );
if ( dst == NULL ) {
LogError ( "Couldn't map destination memory" );
return false ;
}
for ( size_t z = 0 ; z < size [ 2 ]; ++ z ) {
for ( size_t y = 0 ; y < size [ 1 ]; ++ y ) {
size_t srcOffset = srcRect . offset ( 0 , y , z );
size_t dstOffset = dstRect . offset ( 0 , y , z );
// Copy memory line by line
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dst ) + dstOffset ),
( reinterpret_cast < const_address > ( src ) + srcOffset ),
size [ 0 ]);
}
}
// Unmap source and destination memory
dstMemory . cpuUnmap ( vDev_ );
srcMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: copyImageToBuffer (
device :: Memory & srcMemory ,
device :: Memory & dstMemory ,
const amd :: Coord3D & srcOrigin ,
const amd :: Coord3D & dstOrigin ,
const amd :: Coord3D & size ,
bool entire ,
size_t rowPitch ,
size_t slicePitch ) const
{
size_t startLayer = srcOrigin [ 2 ];
size_t numLayers = size [ 2 ];
if ( srcMemory . owner () -> getType () == CL_MEM_OBJECT_IMAGE1D_ARRAY ) {
startLayer = srcOrigin [ 1 ];
numLayers = size [ 1 ];
}
// rowPitch and slicePitch in bytes
size_t srcRowPitch ;
size_t srcSlicePitch ;
// Map source memory
void * src = srcMemory . cpuMap ( vDev_ , Memory :: CpuReadOnly ,
startLayer , numLayers , & srcRowPitch , & srcSlicePitch );
if ( src == NULL ) {
LogError ( "Couldn't map source memory" );
return false ;
}
size_t elementSize = srcMemory . owner () -> asImage () -> getImageFormat (). getElementSize ();
// Map destination memory
void * dst = dstMemory . cpuMap ( vDev_ , ( entire ) ? Memory :: CpuWriteOnly : 0 );
if ( dst == NULL ) {
LogError ( "Couldn't map destination memory" );
return false ;
}
size_t srcOffs = srcOrigin [ 0 ];
size_t dstOffs = dstOrigin [ 0 ];
size_t srcOffsOrg ;
size_t copySize = size [ 0 ];
// Calculate the offset in bytes
srcOffs *= elementSize ;
copySize *= elementSize ;
// Adjust source offset with Y and Z dimensions
srcOffs += srcRowPitch * srcOrigin [ 1 ];
srcOffs += srcSlicePitch * srcOrigin [ 2 ];
srcOffsOrg = srcOffs ;
// Copy memory slice by slice
for ( size_t slice = 0 ; slice < size [ 2 ]; ++ slice ) {
srcOffs = srcOffsOrg + slice * srcSlicePitch ;
// Copy memory line by line
for ( size_t rows = 0 ; rows < size [ 1 ]; ++ rows ) {
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dst ) + dstOffs ),
( reinterpret_cast < const_address > ( src ) + srcOffs ),
copySize );
srcOffs += srcRowPitch ;
dstOffs += copySize ;
}
}
// Unmap source and destination memory
srcMemory . cpuUnmap ( vDev_ );
dstMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: copyBufferToImage (
device :: Memory & srcMemory ,
device :: Memory & dstMemory ,
const amd :: Coord3D & srcOrigin ,
const amd :: Coord3D & dstOrigin ,
const amd :: Coord3D & size ,
bool entire ,
size_t rowPitch ,
size_t slicePitch ) const
{
// Map source memory
void * src = srcMemory . cpuMap ( vDev_ , Memory :: CpuReadOnly );
if ( src == NULL ) {
LogError ( "Couldn't map source memory" );
return false ;
}
size_t startLayer = dstOrigin [ 2 ];
size_t numLayers = size [ 2 ];
if ( dstMemory . owner () -> getType () == CL_MEM_OBJECT_IMAGE1D_ARRAY ) {
startLayer = dstOrigin [ 1 ];
numLayers = size [ 1 ];
}
// rowPitch and slicePitch in bytes
size_t dstRowPitch ;
size_t dstSlicePitch ;
// Map destination memory
void * dst = dstMemory . cpuMap ( vDev_ , ( entire ) ? Memory :: CpuWriteOnly : 0 ,
startLayer , numLayers , & dstRowPitch , & dstSlicePitch );
if ( dst == NULL ) {
LogError ( "Couldn't map destination memory" );
return false ;
}
size_t elementSize = dstMemory . owner () -> asImage () -> getImageFormat (). getElementSize ();
size_t srcOffs = srcOrigin [ 0 ];
size_t dstOffs = dstOrigin [ 0 ];
size_t dstOffsOrg ;
size_t copySize = size [ 0 ];
// Calculate the offset in bytes
dstOffs *= elementSize ;
copySize *= elementSize ;
// Adjust destination offset with Y and Z dimension
dstOffs += dstRowPitch * dstOrigin [ 1 ];
dstOffs += dstSlicePitch * dstOrigin [ 2 ];
dstOffsOrg = dstOffs ;
// Copy memory slice by slice
for ( size_t slice = 0 ; slice < size [ 2 ]; ++ slice ) {
dstOffs = dstOffsOrg + slice * dstSlicePitch ;
// Copy memory line by line
for ( size_t rows = 0 ; rows < size [ 1 ]; ++ rows ) {
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dst ) + dstOffs ),
( reinterpret_cast < const_address > ( src ) + srcOffs ),
copySize );
srcOffs += copySize ;
dstOffs += dstRowPitch ;
}
}
// Unmap source and destination memory
srcMemory . cpuUnmap ( vDev_ );
dstMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: copyImage (
device :: Memory & srcMemory ,
device :: Memory & dstMemory ,
const amd :: Coord3D & srcOrigin ,
const amd :: Coord3D & dstOrigin ,
const amd :: Coord3D & size ,
bool entire ) const
{
size_t startLayer = srcOrigin [ 2 ];
size_t numLayers = size [ 2 ];
if ( srcMemory . owner () -> getType () == CL_MEM_OBJECT_IMAGE1D_ARRAY ) {
startLayer = srcOrigin [ 1 ];
numLayers = size [ 1 ];
}
// rowPitch and slicePitch in bytes
size_t srcRowPitch ;
size_t srcSlicePitch ;
// Map source memory
void * src = srcMemory . cpuMap ( vDev_ , Memory :: CpuReadOnly ,
startLayer , numLayers , & srcRowPitch , & srcSlicePitch );
if ( src == NULL ) {
LogError ( "Couldn't map source memory" );
return false ;
}
if ( dstMemory . owner () -> getType () == CL_MEM_OBJECT_IMAGE1D_ARRAY ) {
startLayer = dstOrigin [ 1 ];
numLayers = size [ 1 ];
}
else {
startLayer = dstOrigin [ 2 ];
numLayers = size [ 2 ];
}
// rowPitch and slicePitch in bytes
size_t dstRowPitch ;
size_t dstSlicePitch ;
// Map destination memory
void * dst = dstMemory . cpuMap ( vDev_ , ( entire ) ? Memory :: CpuWriteOnly : 0 ,
startLayer , numLayers , & dstRowPitch , & dstSlicePitch );
if ( dst == NULL ) {
LogError ( "Couldn't map destination memory" );
return false ;
}
size_t elementSize = dstMemory . owner () -> asImage () -> getImageFormat (). getElementSize ();
assert ( elementSize == srcMemory . owner () -> asImage () -> getImageFormat (). getElementSize ());
size_t srcOffs = srcOrigin [ 0 ];
size_t dstOffs = dstOrigin [ 0 ];
size_t srcOffsOrg ;
size_t dstOffsOrg ;
size_t copySize = size [ 0 ];
// Calculate the offsets in bytes
srcOffs *= elementSize ;
dstOffs *= elementSize ;
copySize *= elementSize ;
// Adjust destination and sorce offsets with Y dimension
srcOffs += srcRowPitch * srcOrigin [ 1 ];
dstOffs += dstRowPitch * dstOrigin [ 1 ];
// Adjust destination and sorce offsets with Z dimension
srcOffs += srcSlicePitch * srcOrigin [ 2 ];
dstOffs += dstSlicePitch * dstOrigin [ 2 ];
srcOffsOrg = srcOffs ;
dstOffsOrg = dstOffs ;
// Copy memory slice by slice
for ( size_t slice = 0 ; slice < size [ 2 ]; ++ slice ) {
srcOffs = srcOffsOrg + slice * srcSlicePitch ;
dstOffs = dstOffsOrg + slice * dstSlicePitch ;
// Copy memory line by line
for ( size_t rows = 0 ; rows < size [ 1 ]; ++ rows ) {
amd :: Os :: fastMemcpy (
( reinterpret_cast < address > ( dst ) + dstOffs ),
( reinterpret_cast < const_address > ( src ) + srcOffs ),
copySize );
srcOffs += srcRowPitch ;
dstOffs += dstRowPitch ;
}
}
// Unmap source and destination memory
srcMemory . cpuUnmap ( vDev_ );
dstMemory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: fillBuffer (
device :: Memory & memory ,
const void * pattern ,
size_t patternSize ,
const amd :: Coord3D & origin ,
const amd :: Coord3D & size ,
bool entire
) const
{
// Map memory
void * fillMem = memory . cpuMap ( vDev_ , ( entire ) ? Memory :: CpuWriteOnly : 0 );
if ( fillMem == NULL ) {
LogError ( "Couldn't map destination memory" );
return false ;
}
size_t offset = origin [ 0 ];
size_t fillSize = size [ 0 ];
if (( fillSize % patternSize ) != 0 ) {
LogError ( "Misaligned buffer size and pattern size!" );
}
// Fill the buffer memory with a pattern
for ( size_t i = 0 ; i < ( fillSize / patternSize ); i ++ ) {
memcpy (
( reinterpret_cast < address > ( fillMem ) + offset ),
( reinterpret_cast < const_address > ( pattern )),
patternSize
);
offset += patternSize ;
}
// Unmap source and destination memory
memory . cpuUnmap ( vDev_ );
return true ;
}
bool
HostBlitManager :: fillImage (
device :: Memory & memory ,
const void * pattern ,
const amd :: Coord3D & origin ,
const amd :: Coord3D & size ,
bool entire
) const
{
size_t startLayer = origin [ 2 ];
size_t numLayers = size [ 2 ];
if ( memory . owner () -> getType () == CL_MEM_OBJECT_IMAGE1D_ARRAY ) {
startLayer = origin [ 1 ];
numLayers = size [ 1 ];
}
// rowPitch and slicePitch in bytes
size_t devRowPitch ;
size_t devSlicePitch ;
2014-07-22 17:42:44 -04:00
void * newpattern = const_cast < void *> ( pattern );
cl_float4 fFillColor ;
// Converting a linear RGB floating-point color value to a normalized 8-bit unsigned integer sRGB value so that the cpu path can treat sRGB as RGB for host transfer.
if ( memory . owner () -> asImage () -> getImageFormat (). image_channel_order == CL_sRGBA ) {
float * fColor = static_cast < float *> ( newpattern );
fFillColor . s [ 0 ] = sRGBmap ( fColor [ 0 ]) / 255.0f ;
fFillColor . s [ 1 ] = sRGBmap ( fColor [ 1 ]) / 255.0f ;
fFillColor . s [ 2 ] = sRGBmap ( fColor [ 2 ]) / 255.0f ;
fFillColor . s [ 3 ] = fColor [ 3 ];
newpattern = static_cast < void *> ( & fFillColor );
}
2014-07-04 16:17:05 -04:00
// Map memory
void * fillMem = memory . cpuMap ( vDev_ , ( entire ) ? Memory :: CpuWriteOnly : 0 ,
startLayer , numLayers , & devRowPitch , & devSlicePitch );
if ( fillMem == NULL ) {
LogError ( "Couldn't map destination memory" );
return false ;
}
float fillValue [ 4 ];
memset ( fillValue , 0 , sizeof ( fillValue ));
2014-07-22 17:42:44 -04:00
memory . owner () -> asImage () -> getImageFormat (). formatColor ( newpattern , fillValue );
2014-07-04 16:17:05 -04:00
size_t elementSize = memory . owner () -> asImage () -> getImageFormat (). getElementSize ();
size_t offset = origin [ 0 ] * elementSize ;
size_t offsetOrg ;
// Adjust offset with Y dimension
offset += devRowPitch * origin [ 1 ];
// Adjust offset with Z dimension
offset += devSlicePitch * origin [ 2 ];
offsetOrg = offset ;
// Fill the image memory with a pattern
for ( size_t slice = 0 ; slice < size [ 2 ]; ++ slice ) {
offset = offsetOrg + slice * devSlicePitch ;
for ( size_t rows = 0 ; rows < size [ 1 ]; ++ rows ) {
size_t pixOffset = offset ;
// Copy memory pixel by pixel
for ( size_t column = 0 ; column < size [ 0 ]; ++ column ) {
memcpy (
( reinterpret_cast < address > ( fillMem ) + pixOffset ),
( reinterpret_cast < const_address > ( fillValue )),
elementSize
);
pixOffset += elementSize ;
}
offset += devRowPitch ;
}
}
// Unmap memory
memory . cpuUnmap ( vDev_ );
return true ;
}
2014-07-22 17:42:44 -04:00
cl_uint
HostBlitManager :: sRGBmap ( float fc ) const
{
double c = ( double ) fc ;
#ifdef ATI_OS_LINUX
if ( isnan ( c ))
c = 0.0 ;
#else
if ( _isnan ( c ))
c = 0.0 ;
#endif
if ( c > 1.0 )
c = 1.0 ;
else if ( c < 0.0 )
c = 0.0 ;
else if ( c < 0.0031308 )
c = 12.92 * c ;
else
c = ( 1055.0 / 1000.0 ) * pow ( c , 5.0 / 12.0 ) - ( 55.0 / 1000.0 );
return ( cl_uint )( c * 255.0 + 0.5 );
}
2014-07-04 16:17:05 -04:00
} // namespace gpu