1
1

buffer.d 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. module three.gl.buffer;
  2. public import derelict.opengl3.gl3;
  3. import three.gl.util;
  4. enum GlBufferTarget {
  5. Array = GL_ARRAY_BUFFER,
  6. AtomicCounter = GL_ATOMIC_COUNTER_BUFFER,
  7. CopyRead= GL_COPY_READ_BUFFER,
  8. CopyWrite = GL_COPY_WRITE_BUFFER,
  9. DrawIndirect = GL_DRAW_INDIRECT_BUFFER,
  10. DispatchIndirect = GL_DISPATCH_INDIRECT_BUFFER,
  11. ElementArray = GL_ELEMENT_ARRAY_BUFFER,
  12. PixelPack = GL_PIXEL_PACK_BUFFER,
  13. PixelUnpack = GL_PIXEL_UNPACK_BUFFER,
  14. QueryBuffer = GL_QUERY_BUFFER,
  15. ShaderStorage = GL_SHADER_STORAGE_BUFFER,
  16. Texture = GL_TEXTURE_BUFFER,
  17. TransformFeedback = GL_TRANSFORM_FEEDBACK_BUFFER,
  18. Uniform = GL_UNIFORM_BUFFER
  19. }
  20. struct GlBuffer(GlBufferTarget Target, T) {
  21. alias BufferTarget = Target;
  22. alias ValueType = T;
  23. GLuint handle;
  24. GLuint length;
  25. T* data;
  26. void construct(GLuint length, GLbitfield createFlags, GLbitfield mapFlags) {
  27. glCheck!glGenBuffers(1, &this.handle);
  28. bind();
  29. glCheck!glBufferStorage(Target, length * T.sizeof, null, createFlags);
  30. this.data = cast(T*)glCheck!glMapBufferRange(Target, 0, length * T.sizeof, mapFlags);
  31. this.length = length;
  32. if (this.data is null) {
  33. throw new Exception("glMapBufferRange failed, probable bug.");
  34. }
  35. }
  36. void destruct() {
  37. bind(); // bind!
  38. glCheck!glUnmapBuffer(Target);
  39. glCheck!glDeleteBuffers(1, &this.handle);
  40. }
  41. void bind() {
  42. glCheck!glBindBuffer(Target, this.handle);
  43. }
  44. void unbind() {
  45. glCheck!glBindBuffer(Target, 0);
  46. }
  47. }
  48. alias GlArrayBuffer(T) = GlBuffer!(GlBufferTarget.Array, T);
  49. alias GlElementArrayBuffer(T) = GlBuffer!(GlBufferTarget.ElementArray, T);
  50. alias GlShaderStorageBuffer(T) = GlBuffer!(GlBufferTarget.ShaderStorage, T);
  51. alias GlDrawIndirectBuffer(T) = GlBuffer!(GlBufferTarget.DrawIndirect, T);
  52. alias GlDispatchIndirectBuffer(T) = GlBuffer!(GlBufferTarget.DispatchIndirect, T);
  53. alias GlTextureBuffer(T) = GlBuffer!(GlBufferTarget.Texture, T);
  54. alias GlUniformBuffer(T) = GlBuffer!(GlBufferTarget.Uniform, T);