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:
parent
45d7bee29b
commit
b360b7bd2b
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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++;
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -107,7 +107,6 @@ public:
|
||||
|
||||
struct Caps
|
||||
{
|
||||
bool m_VBO;
|
||||
bool m_ARBProgram;
|
||||
bool m_ARBProgramShadow;
|
||||
bool m_VertexShader;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user