1
1

buffer.d 1.8 KB

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