diff options
Diffstat (limited to 'src/RenderBackend/OpenGL/DeviceMemory.cpp')
-rw-r--r-- | src/RenderBackend/OpenGL/DeviceMemory.cpp | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/src/RenderBackend/OpenGL/DeviceMemory.cpp b/src/RenderBackend/OpenGL/DeviceMemory.cpp index 9e33ac9..faf2943 100644 --- a/src/RenderBackend/OpenGL/DeviceMemory.cpp +++ b/src/RenderBackend/OpenGL/DeviceMemory.cpp @@ -3,7 +3,33 @@ namespace amalgine { - DeviceMemory::DeviceMemory() + u32 getOpenglStorageType(DeviceMemory::StorageType storageType) + { + switch(storageType) + { + case DeviceMemory::StorageType::STATIC: return GL_STATIC_DRAW; + case DeviceMemory::StorageType::DYNAMIC: return GL_DYNAMIC_DRAW; + case DeviceMemory::StorageType::STREAM: return GL_STREAM_DRAW; + } + } + + u32 getOpenglPrimitiveType(DeviceMemory::PrimitiveType primitiveType) + { + switch(primitiveType) + { + case DeviceMemory::PrimitiveType::TRIANGLE: return GL_TRIANGLES; + } + } + + u32 getPrimitiveTypePointsPerVertices(DeviceMemory::PrimitiveType primitiveType) + { + switch(primitiveType) + { + case DeviceMemory::PrimitiveType::TRIANGLE: return 3; + } + } + + DeviceMemory::DeviceMemory() : primitiveType(0), numVertices(0) { glGenBuffers(1, &vertexBufferObjectId); } @@ -13,24 +39,29 @@ namespace amalgine glDeleteBuffers(1, &vertexBufferObjectId); } - void DeviceMemory::copyAsStatic(const DataView<f32> &data) + void DeviceMemory::operator delete(void *data) { - copy(data, GL_STATIC_DRAW); + free(data); } - void DeviceMemory::copyAsDynamic(const DataView<f32> &data) + void DeviceMemory::use() const { - copy(data, GL_DYNAMIC_DRAW); + // TODO: Bind vao here? + glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjectId); } - void DeviceMemory::copyAsStream(const DataView<f32> &data) + void DeviceMemory::copy(const DataView<f32> &data, StorageType storageType, PrimitiveType primitiveType) { - copy(data, GL_STREAM_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjectId); + glBufferData(GL_ARRAY_BUFFER, data.getByteSize(), data.data, getOpenglStorageType(storageType)); + this->primitiveType = getOpenglPrimitiveType(primitiveType); + numVertices = getPrimitiveTypePointsPerVertices(primitiveType); } - void DeviceMemory::copy(const DataView<f32> &data, i32 storageType) + void DeviceMemory::draw() { - glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjectId); - glBufferData(GL_ARRAY_BUFFER, data.getByteSize(), data.data, storageType); + if(primitiveType == 0) + throw DeviceMemoryEmpty("Unable to draw buffer as no data has been copied to device memory"); + glDrawArrays(primitiveType, 0, 3); } } |