Added integer type texture support to SamplerCore code This cl doesn't entirely enable integer texture sampling, but it adds the required cases in SamplerCore. To fully enable these types, only a few small selection functions will be required so that the proper types use the proper sampling code. Change-Id: Ie101d782dd9b43c96d8e0198c49fe9ec6855b007 Reviewed-on: https://swiftshader-review.googlesource.com/4150 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/SamplerCore.cpp b/src/Shader/SamplerCore.cpp index c760ff7..1bc2c4d 100644 --- a/src/Shader/SamplerCore.cpp +++ b/src/Shader/SamplerCore.cpp
@@ -188,8 +188,39 @@ switch(state.textureFormat) { + case FORMAT_R8I_SNORM: + case FORMAT_G8R8I_SNORM: + case FORMAT_X8B8G8R8I_SNORM: + case FORMAT_A8B8G8R8I_SNORM: case FORMAT_R8: case FORMAT_R5G6B5: + case FORMAT_G8R8: + case FORMAT_R8I: + case FORMAT_R8UI: + case FORMAT_G8R8I: + case FORMAT_G8R8UI: + case FORMAT_X8B8G8R8I: + case FORMAT_X8B8G8R8UI: + case FORMAT_A8B8G8R8I: + case FORMAT_A8B8G8R8UI: + case FORMAT_R16I: + case FORMAT_R16UI: + case FORMAT_G16R16: + case FORMAT_G16R16I: + case FORMAT_G16R16UI: + case FORMAT_X16B16G16R16I: + case FORMAT_X16B16G16R16UI: + case FORMAT_A16B16G16R16: + case FORMAT_A16B16G16R16I: + case FORMAT_A16B16G16R16UI: + case FORMAT_R32I: + case FORMAT_R32UI: + case FORMAT_G32R32I: + case FORMAT_G32R32UI: + case FORMAT_X32B32G32R32I: + case FORMAT_X32B32G32R32UI: + case FORMAT_A32B32G32R32I: + case FORMAT_A32B32G32R32UI: case FORMAT_X8R8G8B8: case FORMAT_X8B8G8R8: case FORMAT_A8R8G8B8: @@ -200,9 +231,6 @@ case FORMAT_V16U16: case FORMAT_A16W16V16U16: case FORMAT_Q16W16V16U16: - case FORMAT_G8R8: - case FORMAT_G16R16: - case FORMAT_A16B16G16R16: case FORMAT_YV12_BT601: case FORMAT_YV12_BT709: case FORMAT_YV12_JFIF: @@ -234,6 +262,7 @@ c.w = Short4(0x1000, 0x1000, 0x1000, 0x1000); case FORMAT_A32B32G32R32F: break; + case FORMAT_D32F: case FORMAT_D32F_LOCKABLE: case FORMAT_D32FS8_TEXTURE: case FORMAT_D32FS8_SHADOW: @@ -364,21 +393,51 @@ } else { - if(state.sRGB && isRGBComponent(component)) + switch(state.textureFormat) { - sRGBtoLinear16_8_12(cs[component]); // FIXME: Perform linearization at surface level for read-only textures - convertSigned12(c[component], cs[component]); - } - else - { - if(hasUnsignedTextureComponent(component)) + case FORMAT_R8I: + case FORMAT_G8R8I: + case FORMAT_X8B8G8R8I: + case FORMAT_A8B8G8R8I: + c[component] = As<Float4>(Int4(cs[component]) >> 8); + break; + case FORMAT_R8UI: + case FORMAT_G8R8UI: + case FORMAT_X8B8G8R8UI: + case FORMAT_A8B8G8R8UI: + c[component] = As<Float4>(Int4(As<UShort4>(cs[component]) >> 8)); + break; + case FORMAT_R16I: + case FORMAT_G16R16I: + case FORMAT_X16B16G16R16I: + case FORMAT_A16B16G16R16I: + c[component] = As<Float4>(Int4(cs[component])); + break; + case FORMAT_R16UI: + case FORMAT_G16R16UI: + case FORMAT_X16B16G16R16UI: + case FORMAT_A16B16G16R16UI: + c[component] = As<Float4>(Int4(As<UShort4>(cs[component]))); + break; + default: + // Normalized integer formats + if(state.sRGB && isRGBComponent(component)) { - convertUnsigned16(c[component], cs[component]); + sRGBtoLinear16_8_12(cs[component]); // FIXME: Perform linearization at surface level for read-only textures + convertSigned12(c[component], cs[component]); } else { - convertSigned15(c[component], cs[component]); + if(hasUnsignedTextureComponent(component)) + { + convertUnsigned16(c[component], cs[component]); + } + else + { + convertSigned15(c[component], cs[component]); + } } + break; } } } @@ -390,8 +449,43 @@ { switch(state.textureFormat) { + case FORMAT_R8I: + case FORMAT_R8UI: + case FORMAT_R16I: + case FORMAT_R16UI: + case FORMAT_R32I: + case FORMAT_R32UI: + c.y = As<Float4>(UInt4(0)); + case FORMAT_G8R8I: + case FORMAT_G8R8UI: + case FORMAT_G16R16I: + case FORMAT_G16R16UI: + case FORMAT_G32R32I: + case FORMAT_G32R32UI: + c.z = As<Float4>(UInt4(0)); + case FORMAT_X8B8G8R8I: + case FORMAT_X8B8G8R8UI: + case FORMAT_X16B16G16R16I: + case FORMAT_X16B16G16R16UI: + case FORMAT_X32B32G32R32I: + case FORMAT_X32B32G32R32UI: + c.w = As<Float4>(UInt4(1)); + case FORMAT_A8B8G8R8I: + case FORMAT_A8B8G8R8UI: + case FORMAT_A16B16G16R16I: + case FORMAT_A16B16G16R16UI: + case FORMAT_A32B32G32R32I: + case FORMAT_A32B32G32R32UI: + break; + case FORMAT_R8I_SNORM: + case FORMAT_G8R8I_SNORM: + case FORMAT_X8B8G8R8I_SNORM: + case FORMAT_A8B8G8R8I_SNORM: case FORMAT_R8: case FORMAT_R5G6B5: + case FORMAT_G8R8: + case FORMAT_G16R16: + case FORMAT_A16B16G16R16: case FORMAT_X8R8G8B8: case FORMAT_X8B8G8R8: case FORMAT_A8R8G8B8: @@ -402,9 +496,6 @@ case FORMAT_V16U16: case FORMAT_A16W16V16U16: case FORMAT_Q16W16V16U16: - case FORMAT_G8R8: - case FORMAT_G16R16: - case FORMAT_A16B16G16R16: if(componentCount < 2) c.y = Float4(1.0f); if(componentCount < 3) c.z = Float4(1.0f); if(componentCount < 4) c.w = Float4(1.0f); @@ -433,6 +524,7 @@ c.w = Float4(1.0f); case FORMAT_A32B32G32R32F: break; + case FORMAT_D32F: case FORMAT_D32F_LOCKABLE: case FORMAT_D32FS8_TEXTURE: case FORMAT_D32FS8_SHADOW: @@ -1635,6 +1727,9 @@ c.w = UnpackHigh(As<Byte8>(c.w), As<Byte8>(c.w)); break; case FORMAT_A8B8G8R8: + case FORMAT_A8B8G8R8I: + case FORMAT_A8B8G8R8UI: + case FORMAT_A8B8G8R8I_SNORM: case FORMAT_Q8W8V8U8: c.z = c.x; c.x = As<Short4>(UnpackLow(c.x, c.y)); @@ -1671,6 +1766,9 @@ c.y = UnpackHigh(As<Byte8>(c.y), As<Byte8>(c.y)); c.x = UnpackLow(As<Byte8>(c.x), As<Byte8>(c.x)); break; + case FORMAT_X8B8G8R8I_SNORM: + case FORMAT_X8B8G8R8UI: + case FORMAT_X8B8G8R8I: case FORMAT_X8B8G8R8: case FORMAT_X8L8V8U8: c.z = c.x; @@ -1695,6 +1793,9 @@ switch(state.textureFormat) { case FORMAT_G8R8: + case FORMAT_G8R8I: + case FORMAT_G8R8UI: + case FORMAT_G8R8I_SNORM: case FORMAT_V8U8: case FORMAT_A8L8: c.y = (c.x & Short4(0xFF00u, 0xFF00u, 0xFF00u, 0xFF00u)) | As<Short4>(As<UShort4>(c.x) >> 8); @@ -2063,6 +2164,26 @@ { case FORMAT_R5G6B5: return true; + case FORMAT_R8I_SNORM: + case FORMAT_G8R8I_SNORM: + case FORMAT_X8B8G8R8I_SNORM: + case FORMAT_A8B8G8R8I_SNORM: + case FORMAT_R8I: + case FORMAT_R8UI: + case FORMAT_G8R8I: + case FORMAT_G8R8UI: + case FORMAT_X8B8G8R8I: + case FORMAT_X8B8G8R8UI: + case FORMAT_A8B8G8R8I: + case FORMAT_A8B8G8R8UI: + case FORMAT_R32I: + case FORMAT_R32UI: + case FORMAT_G32R32I: + case FORMAT_G32R32UI: + case FORMAT_X32B32G32R32I: + case FORMAT_X32B32G32R32UI: + case FORMAT_A32B32G32R32I: + case FORMAT_A32B32G32R32UI: case FORMAT_G8R8: case FORMAT_X8R8G8B8: case FORMAT_X8B8G8R8: @@ -2078,6 +2199,7 @@ case FORMAT_R8: case FORMAT_L8: case FORMAT_A8L8: + case FORMAT_D32F: case FORMAT_D32F_LOCKABLE: case FORMAT_D32FS8_TEXTURE: case FORMAT_D32FS8_SHADOW: @@ -2087,6 +2209,14 @@ case FORMAT_V16U16: case FORMAT_A16W16V16U16: case FORMAT_Q16W16V16U16: + case FORMAT_R16I: + case FORMAT_R16UI: + case FORMAT_G16R16I: + case FORMAT_G16R16UI: + case FORMAT_X16B16G16R16I: + case FORMAT_X16B16G16R16UI: + case FORMAT_A16B16G16R16I: + case FORMAT_A16B16G16R16UI: case FORMAT_YV12_BT601: case FORMAT_YV12_BT709: case FORMAT_YV12_JFIF: @@ -2114,11 +2244,24 @@ case FORMAT_R8: case FORMAT_L8: case FORMAT_A8L8: + case FORMAT_R8I_SNORM: + case FORMAT_G8R8I_SNORM: + case FORMAT_X8B8G8R8I_SNORM: + case FORMAT_A8B8G8R8I_SNORM: + case FORMAT_R8I: + case FORMAT_R8UI: + case FORMAT_G8R8I: + case FORMAT_G8R8UI: + case FORMAT_X8B8G8R8I: + case FORMAT_X8B8G8R8UI: + case FORMAT_A8B8G8R8I: + case FORMAT_A8B8G8R8UI: return true; case FORMAT_R5G6B5: case FORMAT_R32F: case FORMAT_G32R32F: case FORMAT_A32B32G32R32F: + case FORMAT_D32F: case FORMAT_D32F_LOCKABLE: case FORMAT_D32FS8_TEXTURE: case FORMAT_D32FS8_SHADOW: @@ -2128,6 +2271,22 @@ case FORMAT_V16U16: case FORMAT_A16W16V16U16: case FORMAT_Q16W16V16U16: + case FORMAT_R32I: + case FORMAT_R32UI: + case FORMAT_G32R32I: + case FORMAT_G32R32UI: + case FORMAT_X32B32G32R32I: + case FORMAT_X32B32G32R32UI: + case FORMAT_A32B32G32R32I: + case FORMAT_A32B32G32R32UI: + case FORMAT_R16I: + case FORMAT_R16UI: + case FORMAT_G16R16I: + case FORMAT_G16R16UI: + case FORMAT_X16B16G16R16I: + case FORMAT_X16B16G16R16UI: + case FORMAT_A16B16G16R16I: + case FORMAT_A16B16G16R16UI: case FORMAT_YV12_BT601: case FORMAT_YV12_BT709: case FORMAT_YV12_JFIF: @@ -2144,6 +2303,26 @@ switch(state.textureFormat) { case FORMAT_R5G6B5: + case FORMAT_R8I_SNORM: + case FORMAT_G8R8I_SNORM: + case FORMAT_X8B8G8R8I_SNORM: + case FORMAT_A8B8G8R8I_SNORM: + case FORMAT_R8I: + case FORMAT_R8UI: + case FORMAT_G8R8I: + case FORMAT_G8R8UI: + case FORMAT_X8B8G8R8I: + case FORMAT_X8B8G8R8UI: + case FORMAT_A8B8G8R8I: + case FORMAT_A8B8G8R8UI: + case FORMAT_R32I: + case FORMAT_R32UI: + case FORMAT_G32R32I: + case FORMAT_G32R32UI: + case FORMAT_X32B32G32R32I: + case FORMAT_X32B32G32R32UI: + case FORMAT_A32B32G32R32I: + case FORMAT_A32B32G32R32UI: case FORMAT_G8R8: case FORMAT_X8R8G8B8: case FORMAT_X8B8G8R8: @@ -2159,6 +2338,7 @@ case FORMAT_R8: case FORMAT_L8: case FORMAT_A8L8: + case FORMAT_D32F: case FORMAT_D32F_LOCKABLE: case FORMAT_D32FS8_TEXTURE: case FORMAT_D32FS8_SHADOW: @@ -2169,6 +2349,14 @@ case FORMAT_L16: case FORMAT_G16R16: case FORMAT_A16B16G16R16: + case FORMAT_R16I: + case FORMAT_R16UI: + case FORMAT_G16R16I: + case FORMAT_G16R16UI: + case FORMAT_X16B16G16R16I: + case FORMAT_X16B16G16R16UI: + case FORMAT_A16B16G16R16I: + case FORMAT_A16B16G16R16UI: case FORMAT_V16U16: case FORMAT_A16W16V16U16: case FORMAT_Q16W16V16U16: @@ -2189,6 +2377,26 @@ case FORMAT_YV12_JFIF: return true; case FORMAT_R5G6B5: + case FORMAT_R8I_SNORM: + case FORMAT_G8R8I_SNORM: + case FORMAT_X8B8G8R8I_SNORM: + case FORMAT_A8B8G8R8I_SNORM: + case FORMAT_R8I: + case FORMAT_R8UI: + case FORMAT_G8R8I: + case FORMAT_G8R8UI: + case FORMAT_X8B8G8R8I: + case FORMAT_X8B8G8R8UI: + case FORMAT_A8B8G8R8I: + case FORMAT_A8B8G8R8UI: + case FORMAT_R32I: + case FORMAT_R32UI: + case FORMAT_G32R32I: + case FORMAT_G32R32UI: + case FORMAT_X32B32G32R32I: + case FORMAT_X32B32G32R32UI: + case FORMAT_A32B32G32R32I: + case FORMAT_A32B32G32R32UI: case FORMAT_G8R8: case FORMAT_X8R8G8B8: case FORMAT_X8B8G8R8: @@ -2204,12 +2412,21 @@ case FORMAT_R8: case FORMAT_L8: case FORMAT_A8L8: + case FORMAT_D32F: case FORMAT_D32F_LOCKABLE: case FORMAT_D32FS8_TEXTURE: case FORMAT_D32FS8_SHADOW: case FORMAT_L16: case FORMAT_G16R16: case FORMAT_A16B16G16R16: + case FORMAT_R16I: + case FORMAT_R16UI: + case FORMAT_G16R16I: + case FORMAT_G16R16UI: + case FORMAT_X16B16G16R16I: + case FORMAT_X16B16G16R16UI: + case FORMAT_A16B16G16R16I: + case FORMAT_A16B16G16R16UI: case FORMAT_V16U16: case FORMAT_A16W16V16U16: case FORMAT_Q16W16V16U16: @@ -2226,6 +2443,26 @@ switch(state.textureFormat) { case FORMAT_R5G6B5: return component < 3; + case FORMAT_R8I_SNORM: return component < 1; + case FORMAT_G8R8I_SNORM: return component < 2; + case FORMAT_X8B8G8R8I_SNORM: return component < 3; + case FORMAT_A8B8G8R8I_SNORM: return component < 3; + case FORMAT_R8I: return component < 1; + case FORMAT_R8UI: return component < 1; + case FORMAT_G8R8I: return component < 2; + case FORMAT_G8R8UI: return component < 2; + case FORMAT_X8B8G8R8I: return component < 3; + case FORMAT_X8B8G8R8UI: return component < 3; + case FORMAT_A8B8G8R8I: return component < 3; + case FORMAT_A8B8G8R8UI: return component < 3; + case FORMAT_R32I: return component < 1; + case FORMAT_R32UI: return component < 1; + case FORMAT_G32R32I: return component < 2; + case FORMAT_G32R32UI: return component < 2; + case FORMAT_X32B32G32R32I: return component < 3; + case FORMAT_X32B32G32R32UI: return component < 3; + case FORMAT_A32B32G32R32I: return component < 3; + case FORMAT_A32B32G32R32UI: return component < 3; case FORMAT_G8R8: return component < 2; case FORMAT_X8R8G8B8: return component < 3; case FORMAT_X8B8G8R8: return component < 3; @@ -2241,12 +2478,21 @@ case FORMAT_R8: return component < 1; case FORMAT_L8: return component < 1; case FORMAT_A8L8: return component < 1; + case FORMAT_D32F: return false; case FORMAT_D32F_LOCKABLE: return false; case FORMAT_D32FS8_TEXTURE: return false; case FORMAT_D32FS8_SHADOW: return false; case FORMAT_L16: return component < 1; case FORMAT_G16R16: return component < 2; case FORMAT_A16B16G16R16: return component < 3; + case FORMAT_R16I: return component < 1; + case FORMAT_R16UI: return component < 1; + case FORMAT_G16R16I: return component < 2; + case FORMAT_G16R16UI: return component < 2; + case FORMAT_X16B16G16R16I: return component < 3; + case FORMAT_X16B16G16R16UI: return component < 3; + case FORMAT_A16B16G16R16I: return component < 3; + case FORMAT_A16B16G16R16UI: return component < 3; case FORMAT_V16U16: return false; case FORMAT_A16W16V16U16: return false; case FORMAT_Q16W16V16U16: return false;