GrTextureBuffer.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright (C) 2009-present, 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. g_cvarGrValidation = true;
  11. initWindow();
  12. initGrManager();
  13. {
  14. const CString shaderSrc = R"(
  15. layout(binding = 0) uniform textureBuffer u_tbuff;
  16. layout(binding = 1) buffer b_buff
  17. {
  18. Vec4 u_buff[];
  19. };
  20. void main()
  21. {
  22. u_buff[0] = texelFetch(u_tbuff, I32(gl_GlobalInvocationID.x));
  23. }
  24. )";
  25. ShaderPtr shader = createShader(shaderSrc, ShaderType::kCompute);
  26. ShaderProgramInitInfo progInit;
  27. progInit.m_computeShader = shader.get();
  28. ShaderProgramPtr prog = GrManager::getSingleton().newShaderProgram(progInit);
  29. BufferInitInfo buffInit;
  30. buffInit.m_mapAccess = BufferMapAccessBit::kWrite;
  31. buffInit.m_size = sizeof(U8) * 4;
  32. buffInit.m_usage = BufferUsageBit::kAllUav | BufferUsageBit::kAllSrv;
  33. BufferPtr texBuff = GrManager::getSingleton().newBuffer(buffInit);
  34. I8* data = static_cast<I8*>(texBuff->map(0, kMaxPtrSize, BufferMapAccessBit::kWrite));
  35. const Vec4 values(-1.0f, -0.25f, 0.1345f, 0.8952f);
  36. for(U i = 0; i < 4; ++i)
  37. {
  38. data[i] = I8(values[i] * 127.0f);
  39. }
  40. texBuff->unmap();
  41. buffInit.m_mapAccess = BufferMapAccessBit::kRead;
  42. buffInit.m_size = sizeof(F32) * 4;
  43. buffInit.m_usage = BufferUsageBit::kAllUav | BufferUsageBit::kAllSrv;
  44. BufferPtr storageBuff = GrManager::getSingleton().newBuffer(buffInit);
  45. CommandBufferInitInfo cmdbInit;
  46. cmdbInit.m_flags = CommandBufferFlag::kSmallBatch | CommandBufferFlag::kGeneralWork;
  47. CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cmdbInit);
  48. cmdb->bindSrv(0, 0, BufferView(texBuff.get()), Format::kR8G8B8A8_Snorm);
  49. cmdb->bindUav(0, 0, BufferView(storageBuff.get()));
  50. cmdb->bindShaderProgram(prog.get());
  51. cmdb->dispatchCompute(1, 1, 1);
  52. cmdb->endRecording();
  53. GrManager::getSingleton().submit(cmdb.get());
  54. GrManager::getSingleton().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. }