Bug 1186111 - Implemented pack unpremultiply for 16f formats. r=jgilbert

This commit is contained in:
Kyle 2015-07-21 14:37:32 -04:00
parent 236aa9654e
commit 3e88efc8dd

View File

@ -890,6 +890,16 @@ pack<WebGLTexelFormat::RGB16F, WebGLTexelPremultiplicationOp::Premultiply, uint1
dst[2] = packToFloat16(unpackFromFloat16(src[2]) * scaleFactor);
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::RGB16F, WebGLTexelPremultiplicationOp::Unpremultiply, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
float unpackedAlpha = unpackFromFloat16(src[3]);
float scaleFactor = unpackedAlpha ? 1.0f / unpackedAlpha : 1.0f;
dst[0] = packToFloat16(unpackFromFloat16(src[0]) * scaleFactor);
dst[1] = packToFloat16(unpackFromFloat16(src[1]) * scaleFactor);
dst[2] = packToFloat16(unpackFromFloat16(src[2]) * scaleFactor);
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::RGBA16F, WebGLTexelPremultiplicationOp::None, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
@ -909,6 +919,17 @@ pack<WebGLTexelFormat::RGBA16F, WebGLTexelPremultiplicationOp::Premultiply, uint
dst[3] = src[3];
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::RGBA16F, WebGLTexelPremultiplicationOp::Unpremultiply, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
float unpackedAlpha = unpackFromFloat16(src[3]);
float scaleFactor = unpackedAlpha ? 1.0f / unpackedAlpha : 1.0f;
dst[0] = packToFloat16(unpackFromFloat16(src[0]) * scaleFactor);
dst[1] = packToFloat16(unpackFromFloat16(src[1]) * scaleFactor);
dst[2] = packToFloat16(unpackFromFloat16(src[2]) * scaleFactor);
dst[3] = src[3];
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::A16F, WebGLTexelPremultiplicationOp::None, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
@ -921,6 +942,12 @@ pack<WebGLTexelFormat::A16F, WebGLTexelPremultiplicationOp::Premultiply, uint16_
dst[0] = src[3];
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::A16F, WebGLTexelPremultiplicationOp::Unpremultiply, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
dst[0] = src[3];
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::R16F, WebGLTexelPremultiplicationOp::None, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
@ -934,6 +961,14 @@ pack<WebGLTexelFormat::R16F, WebGLTexelPremultiplicationOp::Premultiply, uint16_
dst[0] = packToFloat16(unpackFromFloat16(src[0]) * scaleFactor);
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::R16F, WebGLTexelPremultiplicationOp::Unpremultiply, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
float unpackedAlpha = unpackFromFloat16(src[3]);
float scaleFactor = unpackedAlpha ? 1.0f / unpackedAlpha : 1.0f;
dst[0] = packToFloat16(unpackFromFloat16(src[0]) * scaleFactor);
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::RA16F, WebGLTexelPremultiplicationOp::None, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
@ -949,6 +984,15 @@ pack<WebGLTexelFormat::RA16F, WebGLTexelPremultiplicationOp::Premultiply, uint16
dst[1] = scaleFactor;
}
template<> MOZ_ALWAYS_INLINE void
pack<WebGLTexelFormat::RA16F, WebGLTexelPremultiplicationOp::Unpremultiply, uint16_t, uint16_t>(const uint16_t* __restrict src, uint16_t* __restrict dst)
{
float unpackedAlpha = unpackFromFloat16(src[3]);
float scaleFactor = unpackedAlpha ? 1.0f / unpackedAlpha : 1.0f;
dst[0] = packToFloat16(unpackFromFloat16(src[0]) * scaleFactor);
dst[1] = src[3];
}
/****** END CODE SHARED WITH WEBKIT ******/
template<typename SrcType, typename DstType> MOZ_ALWAYS_INLINE void