bilinearUpscale.hlsl 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // The MIT License(MIT)
  2. //
  3. // Copyright(c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy of
  6. // this software and associated documentation files(the "Software"), to deal in
  7. // the Software without restriction, including without limitation the rights to
  8. // use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of
  9. // the Software, and to permit persons to whom the Software is furnished to do so,
  10. // subject to the following conditions :
  11. //
  12. // The above copyright notice and this permission notice shall be included in all
  13. // copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  17. // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR
  18. // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  19. // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  20. // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21. #ifndef BLOCK_WIDTH
  22. #define BLOCK_WIDTH 16
  23. #endif
  24. #ifndef BLOCK_HEIGHT
  25. #define BLOCK_HEIGHT 16
  26. #endif
  27. SamplerState samplerLinearClamp : register(s0);
  28. cbuffer cb : register(b0) {
  29. uint kInputViewportOriginX;
  30. uint kInputViewportOriginY;
  31. uint kInputViewportWidth;
  32. uint kInputViewportHeight;
  33. uint kOutputViewportOriginX;
  34. uint kOutputViewportOriginY;
  35. uint kOutputViewportWidth;
  36. uint kOutputViewportHeight;
  37. float kScaleX;
  38. float kScaleY;
  39. float kDstNormX;
  40. float kDstNormY;
  41. float kSrcNormX;
  42. float kSrcNormY;
  43. }
  44. Texture2D in_texture : register(t0); // image srv
  45. RWTexture2D<unorm float4> out_texture : register(u0); // working uav
  46. [numthreads(BLOCK_WIDTH, BLOCK_HEIGHT, 1)]
  47. void main(uint3 id : SV_DispatchThreadID) {
  48. float dX = (id.x + 0.5f) * kScaleX;
  49. float dY = (id.y + 0.5f) * kScaleY;
  50. if (id.x < kOutputViewportWidth && id.y < kOutputViewportHeight && dX < kInputViewportWidth && dY < kInputViewportHeight) {
  51. float uvX = (dX + kInputViewportOriginX) * kSrcNormX;
  52. float uvY = (dY + kInputViewportOriginY) * kSrcNormY;
  53. uint dstX = id.x + kOutputViewportOriginX;
  54. uint dstY = id.y + kOutputViewportOriginY;
  55. out_texture[uint2(dstX, dstY)] = in_texture.SampleLevel(samplerLinearClamp, float2(uvX, uvY), 0);
  56. }
  57. }