1
0
forked from 0ad/0ad

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.
This commit is contained in:
Vladislav Belov 2021-06-03 22:06:59 +00:00
parent 45d7bee29b
commit b360b7bd2b
10 changed files with 23 additions and 72 deletions

View File

@ -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

View File

@ -981,6 +981,7 @@ void InitGraphics(const CmdLineArgs& args, int flags, const std::vector<CStr>& 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

View File

@ -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++;

View File

@ -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<CPatchRData*>& 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));
}

View File

@ -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;

View File

@ -107,7 +107,6 @@ public:
struct Caps
{
bool m_VBO;
bool m_ARBProgram;
bool m_ARBProgramShadow;
bool m_VertexShader;

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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)