GrTextureBuffer.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright (C) 2009-2023, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <Tests/Framework/Framework.h>
  6. #include <Tests/Gr/GrCommon.h>
  7. #include <AnKi/Gr.h>
  8. ANKI_TEST(Gr, TextureBuffer)
  9. {
  10. ConfigSet& cfg = ConfigSet::allocateSingleton(allocAligned, nullptr);
  11. cfg.setGrValidation(true);
  12. NativeWindow* win = createWindow(cfg);
  13. GrManager* gr = createGrManager(win);
  14. {
  15. const CString shaderSrc = R"(
  16. layout(binding = 0) uniform textureBuffer u_tbuff;
  17. layout(binding = 1) buffer b_buff
  18. {
  19. Vec4 u_buff[];
  20. };
  21. void main()
  22. {
  23. u_buff[0] = texelFetch(u_tbuff, I32(gl_GlobalInvocationID.x));
  24. }
  25. )";
  26. ShaderPtr shader = createShader(shaderSrc, ShaderType::kCompute, *gr);
  27. ShaderProgramInitInfo progInit;
  28. progInit.m_computeShader = shader.get();
  29. ShaderProgramPtr prog = gr->newShaderProgram(progInit);
  30. BufferInitInfo buffInit;
  31. buffInit.m_mapAccess = BufferMapAccessBit::kWrite;
  32. buffInit.m_size = sizeof(U8) * 4;
  33. buffInit.m_usage = BufferUsageBit::kAllTexture;
  34. BufferPtr texBuff = gr->newBuffer(buffInit);
  35. I8* data = static_cast<I8*>(texBuff->map(0, kMaxPtrSize, BufferMapAccessBit::kWrite));
  36. const Vec4 values(-1.0f, -0.25f, 0.1345f, 0.8952f);
  37. for(U i = 0; i < 4; ++i)
  38. {
  39. data[i] = I8(values[i] * 127.0f);
  40. }
  41. texBuff->unmap();
  42. buffInit.m_mapAccess = BufferMapAccessBit::kRead;
  43. buffInit.m_size = sizeof(F32) * 4;
  44. buffInit.m_usage = BufferUsageBit::kAllStorage;
  45. BufferPtr storageBuff = gr->newBuffer(buffInit);
  46. CommandBufferInitInfo cmdbInit;
  47. cmdbInit.m_flags = CommandBufferFlag::kSmallBatch | CommandBufferFlag::kGeneralWork;
  48. CommandBufferPtr cmdb = gr->newCommandBuffer(cmdbInit);
  49. cmdb->bindReadOnlyTextureBuffer(0, 0, texBuff.get(), 0, kMaxPtrSize, Format::kR8G8B8A8_Snorm);
  50. cmdb->bindStorageBuffer(0, 1, storageBuff.get(), 0, kMaxPtrSize);
  51. cmdb->bindShaderProgram(prog.get());
  52. cmdb->dispatchCompute(1, 1, 1);
  53. cmdb->flush();
  54. gr->finish();
  55. const Vec4* inData = static_cast<const Vec4*>(storageBuff->map(0, kMaxPtrSize, BufferMapAccessBit::kRead));
  56. for(U i = 0; i < 4; ++i)
  57. {
  58. ANKI_TEST_EXPECT_NEAR(values[i], (*inData)[i], 0.01f);
  59. }
  60. storageBuff->unmap();
  61. }
  62. GrManager::freeSingleton();
  63. NativeWindow::freeSingleton();
  64. }