bool MFSamplerState_CreatePlatformSpecific(MFSamplerState *pSS) { D3D11_SAMPLER_DESC samplerDesc; if(pSS->stateDesc.magFilter == MFTexFilter_Anisotropic || pSS->stateDesc.minFilter == MFTexFilter_Anisotropic || pSS->stateDesc.mipFilter == MFTexFilter_Anisotropic) samplerDesc.Filter = D3D11_ENCODE_ANISOTROPIC_FILTER(false); else samplerDesc.Filter = D3D11_ENCODE_BASIC_FILTER(sFilterType[pSS->stateDesc.minFilter], sFilterType[pSS->stateDesc.magFilter], sFilterType[pSS->stateDesc.mipFilter], false); samplerDesc.AddressU = sTexAddress[pSS->stateDesc.addressU]; samplerDesc.AddressV = sTexAddress[pSS->stateDesc.addressV]; samplerDesc.AddressW = sTexAddress[pSS->stateDesc.addressW]; samplerDesc.MipLODBias = pSS->stateDesc.mipLODBias; samplerDesc.MaxAnisotropy = pSS->stateDesc.maxAnisotropy; samplerDesc.ComparisonFunc = sCompareFunc[pSS->stateDesc.comparisonFunc]; samplerDesc.BorderColor[0] = pSS->stateDesc.borderColour.x; samplerDesc.BorderColor[1] = pSS->stateDesc.borderColour.y; samplerDesc.BorderColor[2] = pSS->stateDesc.borderColour.z; samplerDesc.BorderColor[3] = pSS->stateDesc.borderColour.w; samplerDesc.MinLOD = pSS->stateDesc.minLOD; samplerDesc.MaxLOD = pSS->stateDesc.maxLOD; ID3D11SamplerState *pD3D11SS; HRESULT hr = g_pd3dDevice->CreateSamplerState(&samplerDesc, &pD3D11SS); pSS->pPlatformData = pD3D11SS; return SUCCEEDED(hr); }
D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy, GLenum comparisonMode) { bool comparison = comparisonMode != GL_NONE; if (maxAnisotropy > 1.0f) { return D3D11_ENCODE_ANISOTROPIC_FILTER(static_cast<D3D11_COMPARISON_FUNC>(comparison)); } else { D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT; D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT; switch (minFilter) { case GL_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break; case GL_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break; case GL_NEAREST_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break; case GL_LINEAR_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break; case GL_NEAREST_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_LINEAR; break; case GL_LINEAR_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_LINEAR; break; default: UNREACHABLE(); } D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT; switch (magFilter) { case GL_NEAREST: dxMag = D3D11_FILTER_TYPE_POINT; break; case GL_LINEAR: dxMag = D3D11_FILTER_TYPE_LINEAR; break; default: UNREACHABLE(); } return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, static_cast<D3D11_COMPARISON_FUNC>(comparison)); } }
D3D11_FILTER ConvertFilter(GLenum minFilter, GLenum magFilter, float maxAnisotropy) { if (maxAnisotropy > 1.0f) { return D3D11_ENCODE_ANISOTROPIC_FILTER(false); } else { D3D11_FILTER_TYPE dxMin = D3D11_FILTER_TYPE_POINT; D3D11_FILTER_TYPE dxMip = D3D11_FILTER_TYPE_POINT; switch (minFilter) { case GL_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break; case GL_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break; case GL_NEAREST_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_POINT; break; case GL_LINEAR_MIPMAP_NEAREST: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_POINT; break; case GL_NEAREST_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_POINT; dxMip = D3D11_FILTER_TYPE_LINEAR; break; case GL_LINEAR_MIPMAP_LINEAR: dxMin = D3D11_FILTER_TYPE_LINEAR; dxMip = D3D11_FILTER_TYPE_LINEAR; break; default: UNREACHABLE(); } D3D11_FILTER_TYPE dxMag = D3D11_FILTER_TYPE_POINT; switch (magFilter) { case GL_NEAREST: dxMag = D3D11_FILTER_TYPE_POINT; break; case GL_LINEAR: dxMag = D3D11_FILTER_TYPE_LINEAR; break; default: UNREACHABLE(); } return D3D11_ENCODE_BASIC_FILTER(dxMin, dxMag, dxMip, false); } }