aboutsummaryrefslogtreecommitdiff
path: root/src/RenderBackend/OpenGL/DeviceMemory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/RenderBackend/OpenGL/DeviceMemory.cpp')
-rw-r--r--src/RenderBackend/OpenGL/DeviceMemory.cpp51
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);
}
}