diff options
author | dec05eba <dec05eba@protonmail.com> | 2017-12-26 17:29:28 +0100 |
---|---|---|
committer | dec05eba <dec05eba@protonmail.com> | 2021-11-18 15:21:48 +0100 |
commit | ffe9dac56488ebfc9f5c37c4e400f4f5469a8a46 (patch) | |
tree | 5958b66f16d217e31215d2f6ec56bb341ec06a76 /src/RenderBackend/OpenGL/DeviceMemory.cpp | |
parent | b5f06b6c4cd07f3073897af32626b9b21a4d2ef8 (diff) |
Add device memory, device frame. Rendering works
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); } } |