From 1b9facda490f87d104511d291e19fed568a68775 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Thu, 7 Jun 2012 14:14:56 +0000 Subject: [PATCH] gpu: silently ignore empty vertex and index buffers instead of crashing and letting the user guess what happened. This doesn't prevent us from displaying an additional friendly warning later. --- src/gpu/indexbuffer.cpp | 30 ++++++++++++++++++++++++------ src/gpu/vertexbuffer.cpp | 31 +++++++++++++++++++++++++------ 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/gpu/indexbuffer.cpp b/src/gpu/indexbuffer.cpp index e445bd78..b950128d 100644 --- a/src/gpu/indexbuffer.cpp +++ b/src/gpu/indexbuffer.cpp @@ -41,6 +41,8 @@ class IndexBufferData { friend class IndexBuffer; + size_t m_size; + #if defined USE_D3D9 IDirect3DIndexBuffer9 *m_ibo; #elif defined _XBOX @@ -48,7 +50,6 @@ class IndexBufferData #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ GLuint m_ibo; uint8_t *m_memory; - size_t m_size; #endif }; @@ -60,6 +61,9 @@ class IndexBufferData IndexBuffer::IndexBuffer(size_t size) : m_data(new IndexBufferData) { + m_data->m_size = size; + if (!size) + return; #if defined USE_D3D9 || defined _XBOX if (FAILED(g_d3ddevice->CreateIndexBuffer(size, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, @@ -68,24 +72,29 @@ IndexBuffer::IndexBuffer(size_t size) #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ glGenBuffers(1, &m_data->m_ibo); m_data->m_memory = new uint8_t[size]; - m_data->m_size = size; #endif } IndexBuffer::~IndexBuffer() { + if (m_data->m_size) + { #if defined USE_D3D9 || defined _XBOX - if (FAILED(m_data->m_ibo->Release())) - Abort(); + if (FAILED(m_data->m_ibo->Release())) + Abort(); #elif !defined __CELLOS_LV2__ && !defined __ANDROID__ - glDeleteBuffers(1, &m_data->m_ibo); - delete[] m_data->m_memory; + glDeleteBuffers(1, &m_data->m_ibo); + delete[] m_data->m_memory; #endif + } delete m_data; } void *IndexBuffer::Lock(size_t offset, size_t size) { + if (!m_data->m_size) + return NULL; + #if defined USE_D3D9 || defined _XBOX void *ret; if (FAILED(m_data->m_ibo->Lock(offset, size, (void **)&ret, 0))) @@ -98,6 +107,9 @@ void *IndexBuffer::Lock(size_t offset, size_t size) void IndexBuffer::Unlock() { + if (!m_data->m_size) + return; + #if defined USE_D3D9 || defined _XBOX if (FAILED(m_data->m_ibo->Unlock())) Abort(); @@ -110,6 +122,9 @@ void IndexBuffer::Unlock() void IndexBuffer::Bind() { + if (!m_data->m_size) + return; + #if defined USE_D3D9 || defined _XBOX if (FAILED(g_d3ddevice->SetIndices(m_data->m_ibo))) Abort(); @@ -123,6 +138,9 @@ void IndexBuffer::Bind() void IndexBuffer::Unbind() { + if (!m_data->m_size) + return; + #if defined USE_D3D9 || defined _XBOX if (FAILED(g_d3ddevice->SetIndices(NULL))) Abort(); diff --git a/src/gpu/vertexbuffer.cpp b/src/gpu/vertexbuffer.cpp index eed2672b..734193c6 100644 --- a/src/gpu/vertexbuffer.cpp +++ b/src/gpu/vertexbuffer.cpp @@ -42,6 +42,8 @@ class VertexBufferData friend class VertexBuffer; friend class VertexDeclaration; + size_t m_size; + #if defined USE_D3D9 IDirect3DVertexBuffer9 *m_vbo; #elif defined _XBOX @@ -49,7 +51,6 @@ class VertexBufferData #else GLuint m_vbo; uint8_t *m_memory; - size_t m_size; #endif }; @@ -122,6 +123,9 @@ void VertexDeclaration::Bind() void VertexDeclaration::DrawElements(MeshPrimitive type, int skip, int count) { + if (count <= 0) + return; + #if defined _XBOX || defined USE_D3D9 g_d3ddevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 1); g_d3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); @@ -158,6 +162,9 @@ void VertexDeclaration::DrawIndexedElements(MeshPrimitive type, int vbase, int vskip, int vcount, int skip, int count) { + if (count <= 0) + return; + #if defined _XBOX || defined USE_D3D9 g_d3ddevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 1); g_d3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); @@ -226,6 +233,9 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1, ShaderAttrib attr11, ShaderAttrib attr12) { + if (!vb->m_data->m_size) + return; + #if defined _XBOX || defined USE_D3D9 /* Only the first item is required to know which stream this * is about; the rest of the information is stored in the @@ -469,6 +479,9 @@ void VertexDeclaration::AddStream(VertexStreamBase const &s) VertexBuffer::VertexBuffer(size_t size) : m_data(new VertexBufferData) { + m_data->m_size = size; + if (!size) + return; #if defined USE_D3D9 || defined _XBOX if (FAILED(g_d3ddevice->CreateVertexBuffer(size, D3DUSAGE_WRITEONLY, NULL, D3DPOOL_MANAGED, &m_data->m_vbo, NULL))) @@ -476,24 +489,28 @@ VertexBuffer::VertexBuffer(size_t size) #elif !defined __CELLOS_LV2__ glGenBuffers(1, &m_data->m_vbo); m_data->m_memory = new uint8_t[size]; - m_data->m_size = size; #endif } VertexBuffer::~VertexBuffer() { + if (m_data->m_size) + { #if defined USE_D3D9 || defined _XBOX - if (FAILED(m_data->m_vbo->Release())) - Abort(); + if (FAILED(m_data->m_vbo->Release())) + Abort(); #elif !defined __CELLOS_LV2__ - glDeleteBuffers(1, &m_data->m_vbo); - delete[] m_data->m_memory; + glDeleteBuffers(1, &m_data->m_vbo); + delete[] m_data->m_memory; #endif + } delete m_data; } void *VertexBuffer::Lock(size_t offset, size_t size) { + if (!m_data->m_size) + return NULL; #if defined USE_D3D9 || defined _XBOX void *ret; if (FAILED(m_data->m_vbo->Lock(offset, size, (void **)&ret, 0))) @@ -506,6 +523,8 @@ void *VertexBuffer::Lock(size_t offset, size_t size) void VertexBuffer::Unlock() { + if (!m_data->m_size) + return; #if defined USE_D3D9 || defined _XBOX if (FAILED(m_data->m_vbo->Unlock())) Abort();