From b360b7bd2b69c428bef5ee8020805704a059f5c5 Mon Sep 17 00:00:00 2001 From: vladislavbelov Date: Thu, 3 Jun 2021 22:06:59 +0000 Subject: [PATCH] Disallow hardware without VBO support to simplify vertex buffer usages. Tested By: Stan Differential Revision: https://code.wildfiregames.com/D4054 This was SVN commit r25659. --- binaries/data/config/default.cfg | 2 - source/ps/GameSetup/GameSetup.cpp | 1 + source/renderer/DecalRData.cpp | 6 +-- source/renderer/PatchRData.cpp | 6 +-- source/renderer/Renderer.cpp | 4 -- source/renderer/Renderer.h | 1 - source/renderer/RenderingOptions.cpp | 3 -- source/renderer/RenderingOptions.h | 2 - source/renderer/VertexBuffer.cpp | 65 ++++++++-------------------- source/renderer/VertexBuffer.h | 5 --- 10 files changed, 23 insertions(+), 72 deletions(-) diff --git a/binaries/data/config/default.cfg b/binaries/data/config/default.cfg index b480c13fe8..28ef8ee526 100644 --- a/binaries/data/config/default.cfg +++ b/binaries/data/config/default.cfg @@ -96,8 +96,6 @@ showsky = true ; for a debugging of a system without GL_KHR_debug. gl.checkerrorafterswap = false -novbo = false - ; Disable hardware cursors nohwcursor = false diff --git a/source/ps/GameSetup/GameSetup.cpp b/source/ps/GameSetup/GameSetup.cpp index 3f97712591..3ac6a2af0a 100644 --- a/source/ps/GameSetup/GameSetup.cpp +++ b/source/ps/GameSetup/GameSetup.cpp @@ -981,6 +981,7 @@ void InitGraphics(const CmdLineArgs& args, int flags, const std::vector& i CFG_GET_VAL("renderpath", renderPath); if ((ogl_HaveExtensions(0, "GL_ARB_vertex_program", "GL_ARB_fragment_program", NULL) != 0 // ARB && ogl_HaveExtensions(0, "GL_ARB_vertex_shader", "GL_ARB_fragment_shader", NULL) != 0) // GLSL + || !ogl_HaveExtension("GL_ARB_vertex_buffer_object") // VBO || RenderPathEnum::FromString(renderPath) == FIXED) { // It doesn't make sense to continue working here, because we're not diff --git a/source/renderer/DecalRData.cpp b/source/renderer/DecalRData.cpp index 48876385f6..64145330be 100644 --- a/source/renderer/DecalRData.cpp +++ b/source/renderer/DecalRData.cpp @@ -203,11 +203,9 @@ void CDecalRData::RenderDecals( batch.indices->m_Owner->Bind(); } - u8* indexBase = batch.indices->m_Owner->GetBindAddress() + sizeof(u16) * (batch.indices->m_Index); + u8* indexBase = nullptr; if (!g_Renderer.m_SkipSubmit) - { - glDrawElements(GL_TRIANGLES, batch.indices->m_Count, GL_UNSIGNED_SHORT, indexBase); - } + glDrawElements(GL_TRIANGLES, batch.indices->m_Count, GL_UNSIGNED_SHORT, indexBase + sizeof(u16) * (batch.indices->m_Index)); // bump stats g_Renderer.m_Stats.m_DrawCalls++; diff --git a/source/renderer/PatchRData.cpp b/source/renderer/PatchRData.cpp index 94d9d86e63..8c5367ed17 100644 --- a/source/renderer/PatchRData.cpp +++ b/source/renderer/PatchRData.cpp @@ -733,7 +733,7 @@ void CPatchRData::RenderBases( batch.first.push_back(splat.m_IndexCount); - u8* indexBase = patch->m_VBBaseIndices->m_Owner->GetBindAddress(); + u8* indexBase = nullptr; batch.second.push_back(indexBase + sizeof(u16)*(patch->m_VBBaseIndices->m_Index + splat.m_IndexStart)); } } @@ -898,7 +898,7 @@ void CPatchRData::RenderBlends( BatchElements& batch = PooledPairGet(PooledMapGet(batches.back().m_Batches, vertices->m_Owner, arena), indices->m_Owner, arena); batch.first.push_back(splats.back().m_IndexCount); - u8* indexBase = indices->m_Owner->GetBindAddress(); + u8* indexBase = nullptr; batch.second.push_back(indexBase + sizeof(u16)*(indices->m_Index + splats.back().m_IndexStart)); splats.pop_back(); @@ -1052,7 +1052,7 @@ void CPatchRData::RenderStreams(const std::vector& patches, const batch.first.push_back(patch->m_VBBaseIndices->m_Count); - u8* indexBase = patch->m_VBBaseIndices->m_Owner->GetBindAddress(); + u8* indexBase = nullptr; batch.second.push_back(indexBase + sizeof(u16)*(patch->m_VBBaseIndices->m_Index)); } diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 05c5b4a129..a13a2020a9 100644 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -443,7 +443,6 @@ CRenderer::~CRenderer() void CRenderer::EnumCaps() { // assume support for nothing - m_Caps.m_VBO = false; m_Caps.m_ARBProgram = false; m_Caps.m_ARBProgramShadow = false; m_Caps.m_VertexShader = false; @@ -452,9 +451,6 @@ void CRenderer::EnumCaps() m_Caps.m_PrettyWater = false; // now start querying extensions - if (!g_RenderingOptions.GetNoVBO() && ogl_HaveExtension("GL_ARB_vertex_buffer_object")) - m_Caps.m_VBO = true; - if (0 == ogl_HaveExtensions(0, "GL_ARB_vertex_program", "GL_ARB_fragment_program", NULL)) { m_Caps.m_ARBProgram = true; diff --git a/source/renderer/Renderer.h b/source/renderer/Renderer.h index dfad74f97e..61b45c8792 100644 --- a/source/renderer/Renderer.h +++ b/source/renderer/Renderer.h @@ -107,7 +107,6 @@ public: struct Caps { - bool m_VBO; bool m_ARBProgram; bool m_ARBProgramShadow; bool m_VertexShader; diff --git a/source/renderer/RenderingOptions.cpp b/source/renderer/RenderingOptions.cpp index 9f20ab37b7..c620a501ee 100755 --- a/source/renderer/RenderingOptions.cpp +++ b/source/renderer/RenderingOptions.cpp @@ -76,7 +76,6 @@ CStr8 RenderPathEnum::ToString(RenderPath path) CRenderingOptions::CRenderingOptions() : m_ConfigHooks(new ConfigHooks()) { - m_NoVBO = false; m_RenderPath = RenderPath::DEFAULT; m_Shadows = false; m_WaterEffects = false; @@ -168,8 +167,6 @@ void CRenderingOptions::ReadConfigAndSetupHooks() }); m_ConfigHooks->Setup("silhouettes", m_Silhouettes); - m_ConfigHooks->Setup("novbo", m_NoVBO); - m_ConfigHooks->Setup("forcealphatest", m_ForceAlphaTest); m_ConfigHooks->Setup("gpuskinning", [this]() { bool enabled; diff --git a/source/renderer/RenderingOptions.h b/source/renderer/RenderingOptions.h index 4e432e5d69..8ce84bf08b 100755 --- a/source/renderer/RenderingOptions.h +++ b/source/renderer/RenderingOptions.h @@ -80,8 +80,6 @@ OPTION_DEFAULT_SETTER(NAME, TYPE); OPTION_GETTER(NAME, TYPE); OPTION_DEF(NAME, T #define OPTION_WITH_SIDE_EFFECT(NAME, TYPE)\ OPTION_CUSTOM_SETTER(NAME, TYPE); OPTION_GETTER(NAME, TYPE); OPTION_DEF(NAME, TYPE); - OPTION(NoVBO, bool); - OPTION_WITH_SIDE_EFFECT(Shadows, bool); OPTION_WITH_SIDE_EFFECT(ShadowPCF, bool); OPTION_WITH_SIDE_EFFECT(PreferGLSL, bool); diff --git a/source/renderer/VertexBuffer.cpp b/source/renderer/VertexBuffer.cpp index 229fd96906..8d144b85c3 100644 --- a/source/renderer/VertexBuffer.cpp +++ b/source/renderer/VertexBuffer.cpp @@ -40,7 +40,7 @@ CVertexBuffer::CVertexBuffer(size_t vertexSize, GLenum usage, GLenum target) } CVertexBuffer::CVertexBuffer(size_t vertexSize, GLenum usage, GLenum target, size_t maximumBufferSize) - : m_VertexSize(vertexSize), m_Handle(0), m_SysMem(0), m_Usage(usage), m_Target(target), m_HasNeededChunks(false) + : m_VertexSize(vertexSize), m_Handle(0), m_Usage(usage), m_Target(target), m_HasNeededChunks(false) { size_t size = maximumBufferSize; @@ -56,17 +56,10 @@ CVertexBuffer::CVertexBuffer(size_t vertexSize, GLenum usage, GLenum target, siz m_MaxVertices = m_FreeVertices = size / vertexSize; // allocate raw buffer - if (g_Renderer.m_Caps.m_VBO) - { - pglGenBuffersARB(1, &m_Handle); - pglBindBufferARB(m_Target, m_Handle); - pglBufferDataARB(m_Target, m_MaxVertices * m_VertexSize, 0, m_Usage); - pglBindBufferARB(m_Target, 0); - } - else - { - m_SysMem = new u8[m_MaxVertices * m_VertexSize]; - } + pglGenBuffersARB(1, &m_Handle); + pglBindBufferARB(m_Target, m_Handle); + pglBufferDataARB(m_Target, m_MaxVertices * m_VertexSize, 0, m_Usage); + pglBindBufferARB(m_Target, 0); // create sole free chunk VBChunk* chunk = new VBChunk; @@ -84,8 +77,6 @@ CVertexBuffer::~CVertexBuffer() if (m_Handle) pglDeleteBuffersARB(1, &m_Handle); - SAFE_ARRAY_DELETE(m_SysMem); - for (VBChunk* const& chunk : m_FreeList) delete chunk; } @@ -204,29 +195,21 @@ void CVertexBuffer::Release(VBChunk* chunk) // UpdateChunkVertices: update vertex data for given chunk void CVertexBuffer::UpdateChunkVertices(VBChunk* chunk, void* data) { - if (g_Renderer.m_Caps.m_VBO) + ENSURE(m_Handle); + if (UseStreaming(m_Usage)) { - ENSURE(m_Handle); - if (UseStreaming(m_Usage)) - { - // The VBO is now out of sync with the backing store - chunk->m_Dirty = true; + // The VBO is now out of sync with the backing store + chunk->m_Dirty = true; - // Sanity check: Make sure the caller hasn't tried to reallocate - // their backing store - ENSURE(data == chunk->m_BackingStore); - } - else - { - pglBindBufferARB(m_Target, m_Handle); - pglBufferSubDataARB(m_Target, chunk->m_Index * m_VertexSize, chunk->m_Count * m_VertexSize, data); - pglBindBufferARB(m_Target, 0); - } + // Sanity check: Make sure the caller hasn't tried to reallocate + // their backing store + ENSURE(data == chunk->m_BackingStore); } else { - ENSURE(m_SysMem); - memcpy(m_SysMem + chunk->m_Index * m_VertexSize, data, chunk->m_Count * m_VertexSize); + pglBindBufferARB(m_Target, m_Handle); + pglBufferSubDataARB(m_Target, chunk->m_Index * m_VertexSize, chunk->m_Count * m_VertexSize, data); + pglBindBufferARB(m_Target, 0); } } @@ -235,9 +218,6 @@ void CVertexBuffer::UpdateChunkVertices(VBChunk* chunk, void* data) // to glVertexPointer ( + etc) calls u8* CVertexBuffer::Bind() { - if (!g_Renderer.m_Caps.m_VBO) - return m_SysMem; - pglBindBufferARB(m_Target, m_Handle); if (UseStreaming(m_Usage)) @@ -326,21 +306,10 @@ u8* CVertexBuffer::Bind() return nullptr; } -u8* CVertexBuffer::GetBindAddress() -{ - if (g_Renderer.m_Caps.m_VBO) - return nullptr; - else - return m_SysMem; -} - void CVertexBuffer::Unbind() { - if (g_Renderer.m_Caps.m_VBO) - { - pglBindBufferARB(GL_ARRAY_BUFFER, 0); - pglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); - } + pglBindBufferARB(GL_ARRAY_BUFFER, 0); + pglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); } size_t CVertexBuffer::GetBytesReserved() const diff --git a/source/renderer/VertexBuffer.h b/source/renderer/VertexBuffer.h index 3c23ee6ef6..cb381772ae 100644 --- a/source/renderer/VertexBuffer.h +++ b/source/renderer/VertexBuffer.h @@ -95,9 +95,6 @@ public: /// to glVertexPointer ( + etc) calls u8* Bind(); - /// Get the address that Bind() will return, without actually binding - u8* GetBindAddress(); - /// Unbind any currently-bound buffer, so glVertexPointer etc calls will not attempt to use it static void Unbind(); @@ -152,8 +149,6 @@ private: size_t m_FreeVertices; /// Handle to the actual GL vertex buffer object GLuint m_Handle; - /// Raw system memory for systems not supporting VBOs - u8* m_SysMem; /// Usage type of the buffer (GL_STATIC_DRAW etc) GLenum m_Usage; /// Buffer target (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER)