CmD3D11SamplerState.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "CmD3D11SamplerState.h"
  2. #include "CmD3D11RenderSystem.h"
  3. #include "CmD3D11Device.h"
  4. #include "CmD3D11Mappings.h"
  5. namespace CamelotFramework
  6. {
  7. D3D11SamplerState::D3D11SamplerState()
  8. :mSamplerState(nullptr)
  9. { }
  10. D3D11SamplerState::~D3D11SamplerState()
  11. {
  12. }
  13. void D3D11SamplerState::initialize_internal()
  14. {
  15. D3D11_SAMPLER_DESC samplerState;
  16. ZeroMemory(&samplerState, sizeof(D3D11_SAMPLER_DESC));
  17. samplerState.AddressU = D3D11Mappings::get(mData.addressMode.u);
  18. samplerState.AddressV = D3D11Mappings::get(mData.addressMode.v);
  19. samplerState.AddressW = D3D11Mappings::get(mData.addressMode.w);
  20. samplerState.BorderColor[0] = mData.borderColor[0];
  21. samplerState.BorderColor[1] = mData.borderColor[1];
  22. samplerState.BorderColor[2] = mData.borderColor[2];
  23. samplerState.BorderColor[3] = mData.borderColor[3];
  24. samplerState.ComparisonFunc = D3D11Mappings::get(mData.comparisonFunc);
  25. samplerState.MaxAnisotropy = mData.maxAniso;
  26. samplerState.MaxLOD = mData.mipMax;
  27. samplerState.MinLOD = mData.mipMin;
  28. samplerState.MipLODBias =mData.mipmapBias;
  29. bool isComparison = ((mData.minFilter & FO_USE_COMPARISON) & (mData.magFilter & FO_USE_COMPARISON) & (mData.mipFilter & FO_USE_COMPARISON)) != 0;
  30. FilterOptions minFilter = (FilterOptions)(mData.minFilter & ~FO_USE_COMPARISON);
  31. FilterOptions magFilter = (FilterOptions)(mData.magFilter & ~FO_USE_COMPARISON);
  32. FilterOptions mipFilter = (FilterOptions)(mData.mipFilter & ~FO_USE_COMPARISON);
  33. if(minFilter == FO_ANISOTROPIC && mData.magFilter == FO_ANISOTROPIC && mData.mipFilter == FO_ANISOTROPIC)
  34. {
  35. samplerState.Filter = D3D11_FILTER_ANISOTROPIC;
  36. }
  37. else
  38. {
  39. if(minFilter == FO_POINT || minFilter == FO_NONE)
  40. {
  41. if(magFilter == FO_POINT || magFilter == FO_NONE)
  42. {
  43. if(mipFilter == FO_POINT || mipFilter == FO_NONE)
  44. samplerState.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
  45. else if(mipFilter == FO_LINEAR)
  46. samplerState.Filter = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
  47. }
  48. else if(magFilter == FO_LINEAR)
  49. {
  50. if(mipFilter == FO_POINT || mipFilter == FO_NONE)
  51. samplerState.Filter = D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT;
  52. else if(mipFilter == FO_LINEAR)
  53. samplerState.Filter = D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR;
  54. }
  55. }
  56. else if(minFilter == FO_LINEAR)
  57. {
  58. if(magFilter == FO_POINT || magFilter == FO_NONE)
  59. {
  60. if(mipFilter == FO_POINT || mipFilter == FO_NONE)
  61. samplerState.Filter = D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT;
  62. else if(mipFilter == FO_LINEAR)
  63. samplerState.Filter = D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR;
  64. }
  65. else if(magFilter == FO_LINEAR)
  66. {
  67. if(mipFilter == FO_POINT || mipFilter == FO_NONE)
  68. samplerState.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
  69. else if(mipFilter == FO_LINEAR)
  70. samplerState.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
  71. }
  72. }
  73. }
  74. if(isComparison)
  75. {
  76. // Adds COMPARISON flag to the filter
  77. // See: http://msdn.microsoft.com/en-us/library/windows/desktop/ff476132(v=vs.85).aspx
  78. samplerState.Filter = (D3D11_FILTER)(0x80 | samplerState.Filter);
  79. }
  80. D3D11RenderSystem* rs = static_cast<D3D11RenderSystem*>(RenderSystem::instancePtr());
  81. D3D11Device& device = rs->getPrimaryDevice();
  82. HRESULT hr = device.getD3D11Device()->CreateSamplerState(&samplerState, &mSamplerState);
  83. if(FAILED(hr) || device.hasError())
  84. {
  85. String errorDescription = device.getErrorDescription();
  86. CM_EXCEPT(RenderingAPIException, "Cannot create sampler state.\nError Description:" + errorDescription);
  87. }
  88. SamplerState::initialize_internal();
  89. }
  90. void D3D11SamplerState::destroy_internal()
  91. {
  92. SAFE_RELEASE(mSamplerState);
  93. SamplerState::destroy_internal();
  94. }
  95. }