hrev43944 adds 2 changesets to branch 'master' old head: c6799d8ae170044c80d5bd9284cf43d42f7ef394 new head: 608826f5785ede6ae7e01301c0b9896561a6dc31 ---------------------------------------------------------------------------- 98c974a: swrast: Add allocated renderbuffer option * Double buffering no longer crashes, however it still doesn't function. 608826f: swrast: Remove fNewWidth/fNewHeight [ Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 2 files changed, 67 insertions(+), 18 deletions(-) src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp | 77 +++++++++++++--- src/add-ons/opengl/swrast/MesaSoftwareRenderer.h | 8 +- ############################################################################ Commit: 98c974a2c4a783063438a3d461ad6be35ac0f95d URL: http://cgit.haiku-os.org/haiku/commit/?id=98c974a Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Tue Apr 3 16:24:51 2012 UTC swrast: Add allocated renderbuffer option * Double buffering no longer crashes, however it still doesn't function. ---------------------------------------------------------------------------- diff --git a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp index 935876b..9fad2ee 100644 --- a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp +++ b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp @@ -516,12 +516,48 @@ MesaSoftwareRenderer::_RenderBufferStorage(gl_context* ctx, render->Height = height; struct swrast_renderbuffer *swRenderBuffer = swrast_renderbuffer(render); + swRenderBuffer->RowStride = width * _mesa_get_format_bytes(render->Format); return GL_TRUE; } +GLboolean +MesaSoftwareRenderer::_RenderBufferStorageMalloc(gl_context* ctx, + struct gl_renderbuffer* render, GLenum internalFormat, + GLuint width, GLuint height) +{ + CALLED(); + + render->Width = width; + render->Height = height; + + struct swrast_renderbuffer *swRenderBuffer = swrast_renderbuffer(render); + + if (swRenderBuffer != NULL) { + free(swRenderBuffer->Buffer); + swRenderBuffer->RowStride + = width * _mesa_get_format_bytes(render->Format); + + uint32 size = swRenderBuffer->RowStride * height; + TRACE("%s: Allocate %" B_PRIu32 " bytes for RenderBuffer\n", + __func__, size); + swRenderBuffer->Buffer = (GLubyte*)malloc(size); + if (!swRenderBuffer->Buffer) { + ERROR("%s: Memory allocation failure!\n", __func__); + return GL_FALSE; + } + } else { + ERROR("%s: Couldn't obtain software renderbuffer!\n", + __func__); + return GL_FALSE; + } + + return GL_TRUE; +} + + void MesaSoftwareRenderer::_Flush(gl_context* ctx) { @@ -553,7 +589,11 @@ MesaSoftwareRenderer::_NewRenderBuffer(bool front) swRenderBuffer->Base.ClassID = HAIKU_SWRAST_RENDERBUFFER_CLASS; swRenderBuffer->Base.RefCount = 1; swRenderBuffer->Base.Delete = _RenderBufferDelete; - swRenderBuffer->Base.AllocStorage = _RenderBufferStorage; + + if (!front) + swRenderBuffer->Base.AllocStorage = _RenderBufferStorageMalloc; + else + swRenderBuffer->Base.AllocStorage = _RenderBufferStorage; if (_SetupRenderBuffer(&swRenderBuffer->Base, fColorSpace) != B_OK) { free(swRenderBuffer); @@ -633,6 +673,12 @@ void MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb) { CALLED(); + if (rb != NULL) { + struct swrast_renderbuffer *swRenderBuffer + = swrast_renderbuffer(rb); + if (swRenderBuffer != NULL) + free(swRenderBuffer->Buffer); + } free(rb); } diff --git a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h index 3617ad1..3086f53 100644 --- a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h +++ b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h @@ -60,6 +60,10 @@ private: struct gl_renderbuffer* render, GLenum internalFormat, GLuint width, GLuint height); + static GLboolean _RenderBufferStorageMalloc(gl_context* ctx, + struct gl_renderbuffer* render, + GLenum internalFormat, + GLuint width, GLuint height); static void _RenderBufferMap(gl_context *ctx, struct gl_renderbuffer *rb, GLuint x, GLuint y, GLuint w, GLuint h, ############################################################################ Revision: hrev43944 Commit: 608826f5785ede6ae7e01301c0b9896561a6dc31 URL: http://cgit.haiku-os.org/haiku/commit/?id=608826f Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Tue Apr 3 17:15:38 2012 UTC swrast: Remove fNewWidth/fNewHeight ---------------------------------------------------------------------------- diff --git a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp index 9fad2ee..e15f44d 100644 --- a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp +++ b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp @@ -179,8 +179,8 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options, fVisual->haveAccumBuffer, alphaFlag, GL_FALSE); BRect bounds = view->Bounds(); - fWidth = fNewWidth = (GLint)bounds.Width(); - fHeight = fNewHeight = (GLint)bounds.Height(); + fWidth = (GLint)bounds.Width(); + fHeight = (GLint)bounds.Height(); // some stupid applications (Quake2) don't even think about calling LockGL() // before using glGetString and its glGet*() friends... @@ -221,11 +221,14 @@ MesaSoftwareRenderer::LockGL() color_space colorSpace = BScreen(GLView()->Window()).ColorSpace(); + GLuint width = fWidth; + GLuint height = fHeight; + BAutolock lock(fInfoLocker); if (fDirectModeEnabled && fInfo != NULL) { - fNewWidth = fInfo->window_bounds.right + width = fInfo->window_bounds.right - fInfo->window_bounds.left + 1; - fNewHeight = fInfo->window_bounds.bottom + height = fInfo->window_bounds.bottom - fInfo->window_bounds.top + 1; } @@ -236,7 +239,7 @@ MesaSoftwareRenderer::LockGL() _SetupRenderBuffer(&fBackRenderBuffer->Base, fColorSpace); } - _CheckResize(); + _CheckResize(width, height); } @@ -396,25 +399,23 @@ void MesaSoftwareRenderer::FrameResized(float width, float height) { BAutolock lock(fInfoLocker); - fNewWidth = (GLuint)width; - fNewHeight = (GLuint)height; - _CheckResize(); + _CheckResize((GLuint)width, (GLuint)height); } void -MesaSoftwareRenderer::_CheckResize() +MesaSoftwareRenderer::_CheckResize(GLuint newWidth, GLuint newHeight) { CALLED(); - if (fBitmap && fNewWidth == fWidth - && fNewHeight == fHeight) { + if (fBitmap && newWidth == fWidth + && newHeight == fHeight) { return; } - fHeight = fNewHeight; - fWidth = fNewWidth; - _mesa_resize_framebuffer(fContext, fFrameBuffer, fWidth, fHeight); + _mesa_resize_framebuffer(fContext, fFrameBuffer, newWidth, newHeight); + fHeight = newHeight; + fWidth = newWidth; _AllocateBitmap(); } diff --git a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h index 3086f53..efefad0 100644 --- a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h +++ b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h @@ -46,7 +46,7 @@ public: private: static void _Error(gl_context* ctx); static const GLubyte* _GetString(gl_context* ctx, GLenum name); - void _CheckResize(); + void _CheckResize(GLuint newWidth, GLuint newHeight); static void _UpdateState(gl_context* ctx, GLuint newState); static void _Flush(gl_context *ctx); @@ -88,8 +88,6 @@ private: GLuint fWidth; GLuint fHeight; - GLuint fNewWidth; - GLuint fNewHeight; color_space fColorSpace; void* fRowAddr[SWRAST_MAX_HEIGHT];