swrast: Add allocated renderbuffer option
* Double buffering no longer crashes, however it still doesn't function.
This commit is contained in:
@@ -516,12 +516,48 @@ MesaSoftwareRenderer::_RenderBufferStorage(gl_context* ctx,
|
|||||||
render->Height = height;
|
render->Height = height;
|
||||||
|
|
||||||
struct swrast_renderbuffer *swRenderBuffer = swrast_renderbuffer(render);
|
struct swrast_renderbuffer *swRenderBuffer = swrast_renderbuffer(render);
|
||||||
|
|
||||||
swRenderBuffer->RowStride = width * _mesa_get_format_bytes(render->Format);
|
swRenderBuffer->RowStride = width * _mesa_get_format_bytes(render->Format);
|
||||||
|
|
||||||
return GL_TRUE;
|
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
|
void
|
||||||
MesaSoftwareRenderer::_Flush(gl_context* ctx)
|
MesaSoftwareRenderer::_Flush(gl_context* ctx)
|
||||||
{
|
{
|
||||||
@@ -553,7 +589,11 @@ MesaSoftwareRenderer::_NewRenderBuffer(bool front)
|
|||||||
swRenderBuffer->Base.ClassID = HAIKU_SWRAST_RENDERBUFFER_CLASS;
|
swRenderBuffer->Base.ClassID = HAIKU_SWRAST_RENDERBUFFER_CLASS;
|
||||||
swRenderBuffer->Base.RefCount = 1;
|
swRenderBuffer->Base.RefCount = 1;
|
||||||
swRenderBuffer->Base.Delete = _RenderBufferDelete;
|
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) {
|
if (_SetupRenderBuffer(&swRenderBuffer->Base, fColorSpace) != B_OK) {
|
||||||
free(swRenderBuffer);
|
free(swRenderBuffer);
|
||||||
@@ -633,6 +673,12 @@ void
|
|||||||
MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb)
|
MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb)
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
if (rb != NULL) {
|
||||||
|
struct swrast_renderbuffer *swRenderBuffer
|
||||||
|
= swrast_renderbuffer(rb);
|
||||||
|
if (swRenderBuffer != NULL)
|
||||||
|
free(swRenderBuffer->Buffer);
|
||||||
|
}
|
||||||
free(rb);
|
free(rb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,10 @@ private:
|
|||||||
struct gl_renderbuffer* render,
|
struct gl_renderbuffer* render,
|
||||||
GLenum internalFormat,
|
GLenum internalFormat,
|
||||||
GLuint width, GLuint height);
|
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,
|
static void _RenderBufferMap(gl_context *ctx,
|
||||||
struct gl_renderbuffer *rb,
|
struct gl_renderbuffer *rb,
|
||||||
GLuint x, GLuint y, GLuint w, GLuint h,
|
GLuint x, GLuint y, GLuint w, GLuint h,
|
||||||
|
|||||||
Reference in New Issue
Block a user