diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2014-01-01 17:14:35 -0600 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2014-01-01 17:14:35 -0600 |
| commit | d36355e45caf6229b1f99f7559bc50cf7641ffe4 (patch) | |
| tree | 81eb4e7ad06cbb58d0f2a7684c899734d7f0d626 /Source/Core/VideoBackends | |
| parent | 7a818e05ef3b1e59375cb50a42a056d729432b6a (diff) | |
| parent | 1118226f270d2b44d10dd3cebd9f89fd38042680 (diff) | |
Merge branch 'buffer_storage'
Diffstat (limited to 'Source/Core/VideoBackends')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/GLUtil.h | 3 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/Render.cpp | 7 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/Render.h | 1 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/StreamBuffer.cpp | 53 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/StreamBuffer.h | 5 |
5 files changed, 54 insertions, 15 deletions
diff --git a/Source/Core/VideoBackends/OGL/GLUtil.h b/Source/Core/VideoBackends/OGL/GLUtil.h index 48466fe580..6ba2187ad0 100644 --- a/Source/Core/VideoBackends/OGL/GLUtil.h +++ b/Source/Core/VideoBackends/OGL/GLUtil.h @@ -30,10 +30,13 @@ #define GL_READ_WRITE 0x88BA #define GL_SRC1_ALPHA 0 #define GL_BGRA GL_RGBA +#define GL_MAP_COHERENT_BIT 0 +#define GL_MAP_PERSISTENT_BIT 0 #define glDrawElementsBaseVertex(...) #define glDrawRangeElementsBaseVertex(...) #define glRenderbufferStorageMultisampleCoverageNV(...) #define glViewportIndexedf(...) +#define glBufferStorage(...) #endif #else #define TEX2D GL_TEXTURE_RECTANGLE_ARB diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 7204ab0d68..8a7c499192 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -486,7 +486,9 @@ Renderer::Renderer() g_ogl_config.bSupportsGLSLCache = TO_BOOL(GLEW_ARB_get_program_binary); g_ogl_config.bSupportsGLPinnedMemory = TO_BOOL(GLEW_AMD_pinned_memory); g_ogl_config.bSupportsGLSync = TO_BOOL(GLEW_ARB_sync); - g_ogl_config.bSupportsGLBaseVertex = TO_BOOL(GLEW_ARB_draw_elements_base_vertex); + g_ogl_config.bSupportsGLBaseVertex = TO_BOOL(GLEW_ARB_draw_elements_base_vertex) && + !DriverDetails::HasBug(DriverDetails::BUG_BROKENPINNEDMEMORY); + g_ogl_config.bSupportsGLBufferStorage = TO_BOOL(GLEW_ARB_buffer_storage); g_ogl_config.bSupportCoverageMSAA = TO_BOOL(GLEW_NV_framebuffer_multisample_coverage); g_ogl_config.bSupportSampleShading = TO_BOOL(GLEW_ARB_sample_shading); g_ogl_config.bSupportOGL31 = TO_BOOL(GLEW_VERSION_3_1); @@ -555,7 +557,7 @@ Renderer::Renderer() g_ogl_config.gl_renderer, g_ogl_config.gl_version), 5000); - WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s", + WARN_LOG(VIDEO,"Missing OGL Extensions: %s%s%s%s%s%s%s%s%s%s%s", g_ActiveConfig.backend_info.bSupportsDualSourceBlend ? "" : "DualSourceBlend ", g_ActiveConfig.backend_info.bSupportsGLSLUBO ? "" : "UniformBuffer ", g_ActiveConfig.backend_info.bSupportsPrimitiveRestart ? "" : "PrimitiveRestart ", @@ -563,6 +565,7 @@ Renderer::Renderer() g_ogl_config.bSupportsGLPinnedMemory ? "" : "PinnedMemory ", g_ogl_config.bSupportsGLSLCache ? "" : "ShaderCache ", g_ogl_config.bSupportsGLBaseVertex ? "" : "BaseVertex ", + g_ogl_config.bSupportsGLBufferStorage ? "" : "BufferStorage ", g_ogl_config.bSupportsGLSync ? "" : "Sync ", g_ogl_config.bSupportCoverageMSAA ? "" : "CSAA ", g_ogl_config.bSupportSampleShading ? "" : "SSAA " diff --git a/Source/Core/VideoBackends/OGL/Render.h b/Source/Core/VideoBackends/OGL/Render.h index 9489d5c7ac..58ba086d18 100644 --- a/Source/Core/VideoBackends/OGL/Render.h +++ b/Source/Core/VideoBackends/OGL/Render.h @@ -22,6 +22,7 @@ extern struct VideoConfig { bool bSupportsGLPinnedMemory; bool bSupportsGLSync; bool bSupportsGLBaseVertex; + bool bSupportsGLBufferStorage; bool bSupportCoverageMSAA; bool bSupportSampleShading; GLSL_VERSION eSupportedGLSLVersion; diff --git a/Source/Core/VideoBackends/OGL/StreamBuffer.cpp b/Source/Core/VideoBackends/OGL/StreamBuffer.cpp index 1c0c3a0da0..c80dc6e703 100644 --- a/Source/Core/VideoBackends/OGL/StreamBuffer.cpp +++ b/Source/Core/VideoBackends/OGL/StreamBuffer.cpp @@ -33,7 +33,11 @@ StreamBuffer::StreamBuffer(u32 type, size_t size, StreamType uploadType) g_Config.bHackedBufferUpload = false; } - if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA) + if (g_ogl_config.bSupportsGLBufferStorage && + !(DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTORAGE) && type == GL_ARRAY_BUFFER) && + (m_uploadtype & BUFFERSTORAGE)) + m_uploadtype = BUFFERSTORAGE; + else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERSUBDATA) && !DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERSTREAM)) m_uploadtype = BUFFERSUBDATA; else if(!g_ogl_config.bSupportsGLBaseVertex && (m_uploadtype & BUFFERDATA)) @@ -81,9 +85,9 @@ void StreamBuffer::Alloc ( size_t size, u32 stride ) break; case MAP_AND_SYNC: case PINNED_MEMORY: - + case BUFFERSTORAGE: // insert waiting slots for used memory - for(size_t i=SLOT(m_used_iterator); i<SLOT(m_iterator); i++) + for (size_t i = SLOT(m_used_iterator); i < SLOT(m_iterator); i++) { fences[i] = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); } @@ -98,7 +102,7 @@ void StreamBuffer::Alloc ( size_t size, u32 stride ) m_free_iterator = iter_end; // if buffer is full - if(iter_end >= m_size) { + if (iter_end >= m_size) { // insert waiting slots in unused space at the end of the buffer for (size_t i = SLOT(m_used_iterator); i < SYNC_POINTS; i++) @@ -111,7 +115,7 @@ void StreamBuffer::Alloc ( size_t size, u32 stride ) iter_end = size; // wait for space at the start - for(u32 i=0; i<=SLOT(iter_end); i++) + for (u32 i = 0; i <= SLOT(iter_end); i++) { glClientWaitSync(fences[i], GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED); glDeleteSync(fences[i]); @@ -130,7 +134,7 @@ void StreamBuffer::Alloc ( size_t size, u32 stride ) m_iterator_aligned = 0; break; case STREAM_DETECT: - case DETECT_MASK: // Just to shutup warnings + case DETECT_MASK: // To shutup compiler warnings break; } m_iterator = m_iterator_aligned; @@ -151,8 +155,9 @@ size_t StreamBuffer::Upload ( u8* data, size_t size ) break; case PINNED_MEMORY: case MAP_AND_RISK: - if(pointer) - memcpy(pointer+m_iterator, data, size); + case BUFFERSTORAGE: + if (pointer) + memcpy(pointer + m_iterator, data, size); break; case BUFFERSUBDATA: glBufferSubData(m_buffertype, m_iterator, size, data); @@ -161,7 +166,7 @@ size_t StreamBuffer::Upload ( u8* data, size_t size ) glBufferData(m_buffertype, size, data, GL_STREAM_DRAW); break; case STREAM_DETECT: - case DETECT_MASK: // Just to shutup warnings + case DETECT_MASK: // To shutup compiler warnings break; } size_t ret = m_iterator; @@ -206,6 +211,26 @@ void StreamBuffer::Init() Init(); } break; + + case BUFFERSTORAGE: + glGetError(); // errors before this allocation should be ignored + fences = new GLsync[SYNC_POINTS]; + for (u32 i = 0; i<SYNC_POINTS; i++) + fences[i] = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + + glBindBuffer(m_buffertype, m_buffer); + + // PERSISTANT_BIT to make sure that the buffer can be used while mapped + // COHERENT_BIT is set so we don't have to use a MemoryBarrier on write + // CLIENT_STORAGE_BIT is set since we access the buffer more frequently on the client side then server side + glBufferStorage(m_buffertype, m_size, NULL, + GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT | GL_CLIENT_STORAGE_BIT); + pointer = (u8*)glMapBufferRange(m_buffertype, 0, m_size, + GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + if(!pointer) + ERROR_LOG(VIDEO, "Buffer allocation failed"); + break; + case MAP_AND_RISK: glBindBuffer(m_buffertype, m_buffer); glBufferData(m_buffertype, m_size, NULL, GL_STREAM_DRAW); @@ -218,7 +243,7 @@ void StreamBuffer::Init() glBindBuffer(m_buffertype, m_buffer); break; case STREAM_DETECT: - case DETECT_MASK: // Just to shutup warnings + case DETECT_MASK: // To shutup compiler warnings break; } } @@ -240,8 +265,14 @@ void StreamBuffer::Shutdown() glFinish(); // ogl pipeline must be flushed, else this buffer can be in use FreeAlignedMemory(pointer); break; + case BUFFERSTORAGE: + DeleteFences(); + glUnmapBuffer(m_buffertype); + glBindBuffer(m_buffertype, 0); + glFinish(); // ogl pipeline must be flushed, else this buffer can be in use + break; case STREAM_DETECT: - case DETECT_MASK: // Just to shutup warnings + case DETECT_MASK: // To shutup compiler warnings break; } } diff --git a/Source/Core/VideoBackends/OGL/StreamBuffer.h b/Source/Core/VideoBackends/OGL/StreamBuffer.h index 37472dc28a..bd503fd067 100644 --- a/Source/Core/VideoBackends/OGL/StreamBuffer.h +++ b/Source/Core/VideoBackends/OGL/StreamBuffer.h @@ -18,14 +18,15 @@ namespace OGL { enum StreamType { - DETECT_MASK = 0x7F, + DETECT_MASK = 0xFF, STREAM_DETECT = (1 << 0), MAP_AND_ORPHAN = (1 << 1), MAP_AND_SYNC = (1 << 2), MAP_AND_RISK = (1 << 3), PINNED_MEMORY = (1 << 4), BUFFERSUBDATA = (1 << 5), - BUFFERDATA = (1 << 6) + BUFFERDATA = (1 << 6), + BUFFERSTORAGE = (1 << 7), }; class StreamBuffer { |
