diff --git a/include/bgfx.h b/include/bgfx.h index fb3642806..05a281666 100644 --- a/include/bgfx.h +++ b/include/bgfx.h @@ -177,11 +177,13 @@ #define BGFX_TEXTURE_W_SHIFT 8 #define BGFX_TEXTURE_W_MASK UINT32_C(0x00000300) #define BGFX_TEXTURE_MIN_POINT UINT32_C(0x00001000) +#define BGFX_TEXTURE_MIN_ANISOTROPIC UINT32_C(0x00002000) #define BGFX_TEXTURE_MIN_SHIFT 12 -#define BGFX_TEXTURE_MIN_MASK UINT32_C(0x00001000) +#define BGFX_TEXTURE_MIN_MASK UINT32_C(0x00003000) #define BGFX_TEXTURE_MAG_POINT UINT32_C(0x00010000) +#define BGFX_TEXTURE_MAG_ANISOTROPIC UINT32_C(0x00020000) #define BGFX_TEXTURE_MAG_SHIFT 16 -#define BGFX_TEXTURE_MAG_MASK UINT32_C(0x00010000) +#define BGFX_TEXTURE_MAG_MASK UINT32_C(0x00030000) #define BGFX_TEXTURE_MIP_POINT UINT32_C(0x00100000) #define BGFX_TEXTURE_MIP_SHIFT 20 #define BGFX_TEXTURE_MIP_MASK UINT32_C(0x00100000) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 12fefd7c8..1ed1149be 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -98,6 +98,42 @@ namespace bgfx D3D11_TEXTURE_ADDRESS_CLAMP, }; + /* + * D3D11_FILTER_MIN_MAG_MIP_POINT = 0x00, + * D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR = 0x01, + * D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT = 0x04, + * D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR = 0x05, + * D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT = 0x10, + * D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR = 0x11, + * D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT = 0x14, + * D3D11_FILTER_MIN_MAG_MIP_LINEAR = 0x15, + * D3D11_FILTER_ANISOTROPIC = 0x55, + * + * According to D3D11_FILTER enum bits for mip, mag and mip are: + * 0x10 // MIN_LINEAR + * 0x04 // MAG_LINEAR + * 0x01 // MIP_LINEAR + */ + + static const uint32_t s_textureFilter[3][3] = + { + { + 0x10, // min linear + 0x00, // min point + 0x55, // anisotopic + }, + { + 0x04, // mag linear + 0x00, // mag point + 0x55, // anisotopic + }, + { + 0x01, // mip linear + 0x00, // mip point + 0x55, // anisotopic + }, + }; + struct TextureFormatInfo { DXGI_FORMAT m_fmt; @@ -1265,13 +1301,19 @@ namespace bgfx void Texture::create(const Memory* _mem, uint32_t _flags) { - _flags &= BGFX_TEXTURE_U_MASK|BGFX_TEXTURE_V_MASK|BGFX_TEXTURE_W_MASK; + _flags &= BGFX_TEXTURE_MIN_MASK|BGFX_TEXTURE_MAG_MASK|BGFX_TEXTURE_MIP_MASK + | BGFX_TEXTURE_U_MASK|BGFX_TEXTURE_V_MASK|BGFX_TEXTURE_W_MASK + ; m_sampler = s_renderCtx.m_samplerStateCache.find(_flags); if (NULL == m_sampler) { + uint8_t minFilter = s_textureFilter[0][(_flags&BGFX_TEXTURE_MIN_MASK)>>BGFX_TEXTURE_MIN_SHIFT]; + uint8_t magFilter = s_textureFilter[1][(_flags&BGFX_TEXTURE_MAG_MASK)>>BGFX_TEXTURE_MAG_SHIFT]; + uint8_t mipFilter = s_textureFilter[2][(_flags&BGFX_TEXTURE_MIP_MASK)>>BGFX_TEXTURE_MIP_SHIFT]; + D3D11_SAMPLER_DESC desc; - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + desc.Filter = (D3D11_FILTER)(minFilter|magFilter|mipFilter); desc.AddressU = s_textureAddress[(_flags&BGFX_TEXTURE_U_MASK)>>BGFX_TEXTURE_U_SHIFT]; desc.AddressV = s_textureAddress[(_flags&BGFX_TEXTURE_V_MASK)>>BGFX_TEXTURE_V_SHIFT]; desc.AddressW = s_textureAddress[(_flags&BGFX_TEXTURE_W_MASK)>>BGFX_TEXTURE_W_SHIFT]; diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 38f7a79aa..cf545a28c 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -827,6 +827,7 @@ namespace bgfx { GL_LINEAR, GL_NEAREST, + GL_LINEAR, }; struct TextureFormatInfo