AnimEngine
Buffers.hpp
1 #pragma once
2 #ifndef KJY_OBJECT_ORIENTED_OPENGL_BUFFERS_HPP_
3 #define KJY_OBJECT_ORIENTED_OPENGL_BUFFERS_HPP_
4 #include "../OOOGL_Core.hpp"
5 #include "../Core_Utilities.hpp"
6 #include <glad/glad.h>
7 #include <memory>
8 #include <string>
9 #include <stack>
10 
11 namespace OOOGL{
12 
13 class OpenGlBuffer : public OglObject{
14  public:
15  OpenGlBuffer(GLenum buffer_type) : OglObject(_destroyBuffer), buffer_type(buffer_type) {
16  glGenBuffers(1, getIdPtr());
17  glBindBuffer(buffer_type, getNameDirect());
18  glBindBuffer(buffer_type, 0);
19  binding_purity = BINDINGS_UNCLEAN;
20  }
21  OpenGlBuffer(const OpenGlBuffer& other) : OglObject(other), buffer_type(other.buffer_type) {}
22 
23  virtual void bind() const {glBindBuffer(buffer_type, getNameDirect());};
24  virtual void unbind() const {glBindBuffer(buffer_type, 0);};
25 
26  virtual void bufferData(GLsizeiptr size, const GLvoid* data, GLenum usage) {
27  glBindBuffer(buffer_type, getNameDirect());
28  CONDITIONALLY_CHECKED_GL_CALL(glBufferData(buffer_type, size, data, usage));
29  glBindBuffer(buffer_type, 0);
30  }
31  virtual void bufferSubData(GLintptr offset, GLsizeiptr size, const GLvoid* data) {
32  glBindBuffer(buffer_type, getNameDirect());
33  CONDITIONALLY_CHECKED_GL_CALL(glBufferSubData(buffer_type, offset, size, data));
34  glBindBuffer(buffer_type, 0);
35  }
36  virtual void bufferStorage(GLsizeiptr size, const GLvoid* data, GLbitfield flags) {
37  glBindBuffer(buffer_type, getNameDirect());
38  CONDITIONALLY_CHECKED_GL_CALL(glBufferStorage(buffer_type, size, data, flags));
39  glBindBuffer(buffer_type, 0);
40  }
41  virtual void clearBufferData(GLenum internal_format, GLenum format, GLenum type, const void* data) {
42  glBindBuffer(buffer_type, getNameDirect());
43  CONDITIONALLY_CHECKED_GL_CALL(glClearBufferData(buffer_type, internal_format, format, type, data));
44  glBindBuffer(buffer_type, 0);
45  }
46  virtual void clearBufferSubData(GLenum internal_format, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data) {
47  glBindBuffer(buffer_type, getNameDirect());
48  CONDITIONALLY_CHECKED_GL_CALL(glClearBufferSubData(buffer_type, internal_format, offset, size, format, type, data));
49  glBindBuffer(buffer_type, 0);
50  }
51  virtual void invalidateBufferData() {
52  glBindBuffer(buffer_type, getNameDirect());
53  CONDITIONALLY_CHECKED_GL_CALL(glInvalidateBufferData(getNameDirect()));
54  glBindBuffer(buffer_type, 0);
55  }
56  virtual void invalidateBufferSubData(GLintptr offset, GLsizeiptr length) {
57  glBindBuffer(buffer_type, getNameDirect());
58  CONDITIONALLY_CHECKED_GL_CALL(glInvalidateBufferSubData(buffer_type, offset, length));
59  glBindBuffer(buffer_type, 0);
60  }
61 
62  static void copy_buffer_subdata(const OpenGlBuffer& read_buffer, const OpenGlBuffer& write_buffer, GLintptr read_offset, GLintptr write_offset, GLsizei size){
63  // CONDITIONALLY_CHECKED_GL_CALL((read_buffer.getNameDirect(), write_buffer.getNameDirect(), read_offset, write_offset, size));
64  }
65 
66  inline GLenum getBufferType() const {return(buffer_type);}
67 
68  private:
69  static void _destroyBuffer(const GLuint* name){
70  glDeleteBuffers(1, name);
71  }
72  GLenum buffer_type = GL_INVALID_ENUM;
73 };
74 
75 /* Indicates the buffer as one compatible with the `bindBufferBase` family of functions.
76  * GL_ATOMIC_COUNTER_BUFFER, GL_TRANSFORM_FEEDBACK_BUFFER, GL_UNIFORM_BUFFER and GL_SHADER_STORAGE_BUFFER.
77  */
79  public:
80  IndexBindableBuffer(GLenum buffer_type) : OpenGlBuffer(buffer_type) {}
81  virtual void bindBase(GLuint index) {
82  _is_index_bound_ = true;
83  _bound_index_ = index;
84  CONDITIONALLY_CHECKED_GL_CALL(glBindBufferBase(getBufferType(), index, getNameDirect()));
85  }
86  virtual void bindBaseRange(GLuint index, GLintptr offset, GLsizeiptr size) {
87  _is_index_bound_ = true;
88  _bound_index_ = index;
89  CONDITIONALLY_CHECKED_GL_CALL(glBindBufferRange(getBufferType(), index, getNameDirect(), offset, size));
90  }
91  virtual void unbindFromBase() {
92  if(_is_index_bound_) CONDITIONALLY_CHECKED_GL_CALL(glBindBufferBase(getBufferType(), _bound_index_, 0));
93  _is_index_bound_ = false;
94  }
95  private:
96  bool _is_index_bound_ = false;
97  GLuint _bound_index_ = 0;
98 };
99 
100 /* Other families of buffers that might justify another interface
101  * glGetBufferParameteriv: GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, and GL_PIXEL_UNPACK_BUFFER.
102  * None others I can find so far.
103  */
104 
105 
106 class ArrayBuffer : public OpenGlBuffer{
107  public:
108  ArrayBuffer() : OpenGlBuffer(GL_ARRAY_BUFFER) {}
109 
111  enum AttribPtrType {FLOATING, INTEGRAL, LONG_INTEGRAL};
112  AttribPtrType attrib_pointer_type = FLOATING;
113  GLint size = 3;
114  GLenum type = GL_FLOAT;
115  GLboolean normalized = GL_FALSE;
116  GLsizei stride = 0;
117  const GLvoid* offset = (const GLvoid*) 0;
118  };
119 
120  PointerConfig preferred_config;
121 };
123  public:
124  AtomicCounterBuffer() : IndexBindableBuffer(GL_ATOMIC_COUNTER_BUFFER) {}
125 };
127  public:
128  CopyReadBuffer() : OpenGlBuffer(GL_COPY_READ_BUFFER) {}
129 };
131  public:
132  CopyWriteBuffer() : OpenGlBuffer(GL_COPY_WRITE_BUFFER) {}
133 };
135  public:
136  DispatchIndirectBuffer() : OpenGlBuffer(GL_DISPATCH_INDIRECT_BUFFER) {}
137 };
139  public:
140  DrawIndirectBuffer() : OpenGlBuffer(GL_DRAW_INDIRECT_BUFFER) {}
141 };
143  public:
144  ElementArrayBuffer() : OpenGlBuffer(GL_ELEMENT_ARRAY_BUFFER) {}
145 };
147  public:
148  PixelPackBuffer() : OpenGlBuffer(GL_PIXEL_PACK_BUFFER) {}
149 };
151  public:
152  PixelUnpackBuffer() : OpenGlBuffer(GL_PIXEL_UNPACK_BUFFER) {}
153 };
154 class QueryBuffer : public OpenGlBuffer{
155  public:
156  QueryBuffer() : OpenGlBuffer(GL_QUERY_BUFFER) {}
157 };
159  public:
160  ShaderStorageBuffer() : IndexBindableBuffer(GL_SHADER_STORAGE_BUFFER) {}
161 };
163  public:
164  TextureBuffer() : OpenGlBuffer(GL_TEXTURE_BUFFER) {}
165 };
167  public:
168  TransformFeedbackBuffer() : IndexBindableBuffer(GL_TRANSFORM_FEEDBACK_BUFFER) {}
169 };
171  public:
172  UniformBuffer() : IndexBindableBuffer(GL_UNIFORM_BUFFER) {}
173 };
174 
175 
176 } // Namespace OOOGL
177 
178 #endif
Definition: Buffers.hpp:142
Definition: Buffers.hpp:138
Definition: Buffers.hpp:122
Definition: Buffers.hpp:13
Definition: OOOGL_Core.hpp:105
Definition: Buffers.hpp:158
Definition: Buffers.hpp:170
Definition: Buffers.hpp:130
Definition: Buffers.hpp:166
Definition: Buffers.hpp:146
Definition: Buffers.hpp:110
Definition: Buffers.hpp:134
Definition: Buffers.hpp:126
Definition: Buffers.hpp:162
Definition: Buffers.hpp:78
Definition: Core_Utilities.cpp:3
Definition: Buffers.hpp:106
Definition: Buffers.hpp:154
Definition: Buffers.hpp:150