 				return _sampler.m_texture.Sample(_sampler.m_sampler, _coord);
 			}
 
+			vec4 bgfxTexture2DBias(BgfxSampler2D _sampler, vec2 _coord, float _bias)
+			{
+				return _sampler.m_texture.SampleBias(_sampler.m_sampler, _coord, _bias);
+			}
+
 			vec4 bgfxTexture2DLod(BgfxSampler2D _sampler, vec2 _coord, float _level)
 			{
 				return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level);
+			}
+
+			vec4 bgfxTexture2DLodOffset(BgfxSampler2D _sampler, vec2 _coord, float _level, ivec2 _offset)
+			{
+				return _sampler.m_texture.SampleLevel(_sampler.m_sampler, _coord, _level, _offset);
 			}
 
 			vec4 bgfxTexture2DProj(BgfxSampler2D _sampler, vec3 _coord)

			#		define sampler2DArray BgfxSampler2DArray
			#		define texture2DArray(_sampler, _coord) bgfxTexture2DArray(_sampler, _coord)
			#		define texture2DArrayLod(_sampler, _coord, _lod) bgfxTexture2DArrayLod(_sampler, _coord, _lod)

			#		define SAMPLER2DMS(_name, _reg) \
						uniform Texture2DMS<vec4> _name ## Texture : REGISTER(t, _reg); \


			vec3 fixCubeLookup(vec3 _v, float _lod, float _topLevelCubeSize)
			{
				// Reference(s):
				// - Seamless cube-map filtering
				//   https://web.archive.org/web/20190411181934/http://the-witness.net/news/2012/02/seamless-cube-map-filtering/
				float ax = abs(_v.x);
				float ay = abs(_v.y);
				float az = abs(_v.z);
