From 4ea4bbfcb03091cb987dc151d41980ec16f3d18d Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 8 Apr 2019 22:31:12 +0800 Subject: *misc --- source/modules/asura-core/graphics/gpu_buffer.cpp | 38 ++++++++++++++--------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'source/modules/asura-core/graphics/gpu_buffer.cpp') diff --git a/source/modules/asura-core/graphics/gpu_buffer.cpp b/source/modules/asura-core/graphics/gpu_buffer.cpp index c796bb0..6e6aead 100644 --- a/source/modules/asura-core/graphics/gpu_buffer.cpp +++ b/source/modules/asura-core/graphics/gpu_buffer.cpp @@ -34,19 +34,6 @@ namespace AsuraEngine mUsage = GL_STATIC_DRAW; break; } - gl.WipeError(); - glGenBuffers(1, &mBuffer); - if (mBuffer == 0) - throw Exception("OpenGL glGenBuffers failed."); - glBindBuffer(mTarget, mBuffer); - glBufferData(mTarget, size, NULL, mUsage); // 初始化大小为size的缓冲 - if (gl.HasError()) - throw Exception("OpenGL glBufferData failed. Errorcode=%d.", gl.GetError()); - glBindBuffer(mTarget, 0); -#if ASURA_DEBUG - mData = (byte*)malloc(size); - memset(mData, 0, size); -#endif mSize = size; } @@ -63,10 +50,33 @@ namespace AsuraEngine { if (data == nullptr) return false; - glBindBuffer(mTarget, mBuffer); + if (mBuffer == 0) + { + // 初始化 + gl.WipeError(); + glGenBuffers(1, &mBuffer); + if (mBuffer == 0) + throw Exception("OpenGL glGenBuffers failed."); + glBindBuffer(mTarget, mBuffer); + glBufferData(mTarget, mSize, NULL, mUsage); // 初始化大小为size的缓冲 + if (gl.HasError()) + { + glBindBuffer(mTarget, 0); + throw Exception("OpenGL glBufferData failed. Errorcode=%d.", gl.GetError()); + } +#if ASURA_DEBUG + mData = (byte*)malloc(size); + memset(mData, 0, size); +#endif + } + else + glBindBuffer(mTarget, mBuffer); glBufferSubData(mTarget, offset, size, data); if (gl.HasError()) + { + glBindBuffer(mTarget, 0); throw Exception("OpenGL glBufferSubData failed. Errorcode=%d.", gl.GetError()); + } glBindBuffer(mTarget, 0); #if ASURA_DEBUG // 拷贝一份,调试用 -- cgit v1.1-26-g67d0