From dc193156a82a80cc8d2321cf065019035855516f Mon Sep 17 00:00:00 2001 From: Andreas Grois Date: Sun, 18 Mar 2018 21:11:39 +0100 Subject: Undo splitting of buffers in three. Makes buffer access much faster Not kidding here. For the default parameters this increased the maximum pixel brightness in the image by a factor of 2.25. This has the drawback that the maximum possible image size got reduced, but hey, there's a command line switch to ignore all size limits ;-) --- BuddhaTest/src/BuddhaTest.cpp | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) (limited to 'BuddhaTest/src/BuddhaTest.cpp') diff --git a/BuddhaTest/src/BuddhaTest.cpp b/BuddhaTest/src/BuddhaTest.cpp index 0a99fee..c1f054d 100644 --- a/BuddhaTest/src/BuddhaTest.cpp +++ b/BuddhaTest/src/BuddhaTest.cpp @@ -112,17 +112,12 @@ int main(int argc, char * argv[]) glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); - GLuint drawBuffer[3]; - glGenBuffers(3, drawBuffer); - for(int i=0; i < 3; ++i) - { - glBindBuffer(GL_SHADER_STORAGE_BUFFER, drawBuffer[i]); - { - glBufferData(GL_SHADER_STORAGE_BUFFER, 4 * pixelCount, nullptr, GL_DYNAMIC_COPY); - glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R8,GL_RED,GL_UNSIGNED_INT,nullptr); - } - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2+i, drawBuffer[i]); - } + GLuint drawBuffer; + glGenBuffers(1, &drawBuffer); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, drawBuffer); + glBufferData(GL_SHADER_STORAGE_BUFFER, 4 *3* pixelCount, nullptr, GL_DYNAMIC_COPY); + glClearBufferData(GL_SHADER_STORAGE_BUFFER,GL_R8,GL_RED,GL_UNSIGNED_INT,nullptr); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, drawBuffer); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); //the state buffer is special. While making each entry 8 bytes large and using std430 layout, the data is never read back, @@ -235,25 +230,16 @@ int main(int argc, char * argv[]) if(!settings.pngFilename.empty()) { glMemoryBarrier(GL_ALL_BARRIER_BITS); - std::vector> readBackBuffers(3,std::vector(pixelCount)); - for(int i = 0; i < 3; ++i) - { - glBindBuffer(GL_SHADER_STORAGE_BUFFER, drawBuffer[i]); - glGetBufferSubData(GL_SHADER_STORAGE_BUFFER,0,4 * pixelCount,readBackBuffers[i].data()); - } + std::vector readBackBuffer(pixelCount*3); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, drawBuffer); + glGetBufferSubData(GL_SHADER_STORAGE_BUFFER,0,4 *3* pixelCount,readBackBuffer.data()); - //too lazy to change WriteOutputPng... - std::vector combinedBuffer(3*pixelCount); - for(uint32_t i=0;i<3*pixelCount;++i) - { - combinedBuffer[i] = readBackBuffers[i%3][i/3]; - } - Helpers::WriteOutputPNG(settings.pngFilename,combinedBuffer,settings.imageWidth,bufferHeight, settings.pngGamma, settings.pngColorScale); + Helpers::WriteOutputPNG(settings.pngFilename,readBackBuffer,settings.imageWidth,bufferHeight, settings.pngGamma, settings.pngColorScale); } //a bit of cleanup glDeleteBuffers(1,&vertexbuffer); - glDeleteBuffers(3,drawBuffer); + glDeleteBuffers(1,&drawBuffer); glDeleteBuffers(1,&stateBuffer); glfwTerminate(); -- cgit v1.2.3