Use ssbo for model transforms

This commit is contained in:
Atlante45 2016-01-14 15:28:17 -08:00
parent 23cf72bd6c
commit 3e027fc5c5
3 changed files with 8 additions and 13 deletions

View file

@ -13,7 +13,7 @@
<@if GLPROFILE == PC_GL @>
<@def GPU_FEATURE_PROFILE GPU_CORE@>
<@def VERSION_HEADER #version 410 core@>
<@def VERSION_HEADER #version 430 core@>
<@elif GLPROFILE == MAC_GL @>
<@def GPU_FEATURE_PROFILE GPU_CORE@>
<@def VERSION_HEADER #version 410 core@>

View file

@ -143,6 +143,7 @@ void GLBackend::TransformStageState::transfer() const {
}
glBindBuffer(GL_UNIFORM_BUFFER, _cameraBuffer);
glBufferData(GL_UNIFORM_BUFFER, bufferData.size(), bufferData.data(), GL_DYNAMIC_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
if (!_objects.empty()) {
@ -150,12 +151,9 @@ void GLBackend::TransformStageState::transfer() const {
bufferData.resize(byteSize);
memcpy(bufferData.data(), _objects.data(), byteSize);
glBindBuffer(GL_UNIFORM_BUFFER, _objectBuffer);
glBufferData(GL_UNIFORM_BUFFER, bufferData.size(), bufferData.data(), GL_DYNAMIC_DRAW);
}
if (!_objects.empty() || !_cameras.empty()) {
glBindBuffer(GL_UNIFORM_BUFFER, 0);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, TRANSFORM_OBJECT_SLOT, _objectBuffer);
glBufferData(GL_SHADER_STORAGE_BUFFER, bufferData.size(), bufferData.data(), GL_DYNAMIC_DRAW);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
}
CHECK_GL_ERROR();
@ -177,8 +175,7 @@ void GLBackend::TransformStageState::update(size_t commandIndex, const StereoSta
_cameraBuffer, offset, sizeof(Backend::TransformCamera));
}
glBindBufferBase(GL_UNIFORM_BUFFER, TRANSFORM_OBJECT_SLOT, _objectBuffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, TRANSFORM_OBJECT_SLOT, _objectBuffer);
(void)CHECK_GL_ERROR();
}

View file

@ -25,12 +25,10 @@ struct TransformCamera {
vec4 _viewport;
};
const int MAX_OBJECTS = 512; // NEEDS to match GLBackend::TransformStageState::update's MAX_OBJECT
in ivec2 _drawCallInfo;
layout(std140) uniform transformObjectBuffer {
TransformObject _object[MAX_OBJECTS];
layout(std430, binding=6) buffer transformObjectBuffer {
TransformObject _object[];
};
TransformObject getTransformObject() {
return _object[_drawCallInfo.x];