BsD3D11SamplerState.cpp 4.1 KB

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