BsD3D11SamplerState.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsD3D11SamplerState.h"
  4. #include "BsD3D11RenderAPI.h"
  5. #include "BsD3D11Device.h"
  6. #include "BsD3D11Mappings.h"
  7. #include "BsRenderStats.h"
  8. namespace BansheeEngine
  9. {
  10. D3D11SamplerStateCore::D3D11SamplerStateCore(const SAMPLER_STATE_DESC& desc)
  11. :SamplerStateCore(desc), mSamplerState(nullptr)
  12. { }
  13. D3D11SamplerStateCore::~D3D11SamplerStateCore()
  14. {
  15. SAFE_RELEASE(mSamplerState);
  16. BS_INC_RENDER_STAT_CAT(ResDestroyed, RenderStatObject_SamplerState);
  17. }
  18. void D3D11SamplerStateCore::createInternal()
  19. {
  20. D3D11_SAMPLER_DESC samplerState;
  21. ZeroMemory(&samplerState, sizeof(D3D11_SAMPLER_DESC));
  22. samplerState.AddressU = D3D11Mappings::get(mProperties.getTextureAddressingMode().u);
  23. samplerState.AddressV = D3D11Mappings::get(mProperties.getTextureAddressingMode().v);
  24. samplerState.AddressW = D3D11Mappings::get(mProperties.getTextureAddressingMode().w);
  25. samplerState.BorderColor[0] = mProperties.getBorderColor()[0];
  26. samplerState.BorderColor[1] = mProperties.getBorderColor()[1];
  27. samplerState.BorderColor[2] = mProperties.getBorderColor()[2];
  28. samplerState.BorderColor[3] = mProperties.getBorderColor()[3];
  29. samplerState.ComparisonFunc = D3D11Mappings::get(mProperties.getComparisonFunction());
  30. samplerState.MaxAnisotropy = mProperties.getTextureAnisotropy();
  31. samplerState.MaxLOD = mProperties.getMaximumMip();
  32. samplerState.MinLOD = mProperties.getMinimumMip();
  33. samplerState.MipLODBias = mProperties.getTextureMipmapBias();
  34. bool isComparison = ((mProperties.getTextureFiltering(FT_MIN) & FO_USE_COMPARISON) &
  35. (mProperties.getTextureFiltering(FT_MAG) & FO_USE_COMPARISON) &
  36. (mProperties.getTextureFiltering(FT_MIP) & FO_USE_COMPARISON)) != 0;
  37. FilterOptions minFilter = (FilterOptions)(mProperties.getTextureFiltering(FT_MIN) & ~FO_USE_COMPARISON);
  38. FilterOptions magFilter = (FilterOptions)(mProperties.getTextureFiltering(FT_MAG) & ~FO_USE_COMPARISON);
  39. FilterOptions mipFilter = (FilterOptions)(mProperties.getTextureFiltering(FT_MIP) & ~FO_USE_COMPARISON);
  40. if (minFilter == FO_ANISOTROPIC && magFilter == FO_ANISOTROPIC && mipFilter == FO_ANISOTROPIC)
  41. {
  42. samplerState.Filter = D3D11_FILTER_ANISOTROPIC;
  43. }
  44. else
  45. {
  46. if(minFilter == FO_POINT || minFilter == FO_NONE)
  47. {
  48. if(magFilter == FO_POINT || magFilter == FO_NONE)
  49. {
  50. if(mipFilter == FO_POINT || mipFilter == FO_NONE)
  51. samplerState.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
  52. else if(mipFilter == FO_LINEAR)
  53. samplerState.Filter = D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR;
  54. }
  55. else if(magFilter == FO_LINEAR)
  56. {
  57. if(mipFilter == FO_POINT || mipFilter == FO_NONE)
  58. samplerState.Filter = D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT;
  59. else if(mipFilter == FO_LINEAR)
  60. samplerState.Filter = D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR;
  61. }
  62. }
  63. else if(minFilter == FO_LINEAR)
  64. {
  65. if(magFilter == FO_POINT || magFilter == FO_NONE)
  66. {
  67. if(mipFilter == FO_POINT || mipFilter == FO_NONE)
  68. samplerState.Filter = D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT;
  69. else if(mipFilter == FO_LINEAR)
  70. samplerState.Filter = D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR;
  71. }
  72. else if(magFilter == FO_LINEAR)
  73. {
  74. if(mipFilter == FO_POINT || mipFilter == FO_NONE)
  75. samplerState.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
  76. else if(mipFilter == FO_LINEAR)
  77. samplerState.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
  78. }
  79. }
  80. }
  81. if(isComparison)
  82. {
  83. // Adds COMPARISON flag to the filter
  84. // See: http://msdn.microsoft.com/en-us/library/windows/desktop/ff476132(v=vs.85).aspx
  85. samplerState.Filter = (D3D11_FILTER)(0x80 | samplerState.Filter);
  86. }
  87. D3D11RenderAPI* rs = static_cast<D3D11RenderAPI*>(RenderAPICore::instancePtr());
  88. D3D11Device& device = rs->getPrimaryDevice();
  89. HRESULT hr = device.getD3D11Device()->CreateSamplerState(&samplerState, &mSamplerState);
  90. if(FAILED(hr) || device.hasError())
  91. {
  92. String errorDescription = device.getErrorDescription();
  93. BS_EXCEPT(RenderingAPIException, "Cannot create sampler state.\nError Description:" + errorDescription);
  94. }
  95. BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_SamplerState);
  96. SamplerStateCore::createInternal();
  97. }
  98. }