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 +++++++++++------------------------- BuddhaTest/src/Helpers.cpp | 4 ++-- 2 files changed, 13 insertions(+), 27 deletions(-) (limited to 'BuddhaTest/src') 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(); diff --git a/BuddhaTest/src/Helpers.cpp b/BuddhaTest/src/Helpers.cpp index e499f0c..2a687d2 100644 --- a/BuddhaTest/src/Helpers.cpp +++ b/BuddhaTest/src/Helpers.cpp @@ -264,9 +264,9 @@ namespace Helpers } int maxSSBOSize; glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE,&maxSSBOSize); - if((static_cast(imageWidth) * static_cast(imageHeight)) > static_cast(maxSSBOSize)/2) //divided by 2, as we have 4 bytes per int, but only half the image height + if((static_cast(imageWidth) * static_cast(imageHeight)) > static_cast(maxSSBOSize)/6) //divided by 3*2, as we have three colors per pixel, 4 bytes per int, but only half the image height { - std::cerr << "Requested buffer size is larger than maximum allowed by graphics driver. Max pixel number: " << maxSSBOSize/2 << std::endl; + std::cerr << "Requested buffer size is larger than maximum allowed by graphics driver. Max pixel number: " << maxSSBOSize/6 << std::endl; std::cerr << "You can override this limit check using the --ignoreMaxBufferSize 1 command line parameter, but doing so is your own risk." << std::endl; if(ignoreMaxBufferSize == 0) return false; -- cgit v1.2.3