mesa: Improve and cleanup render code.
This commit is contained in:
@@ -46,7 +46,17 @@ extern "C" {
|
|||||||
#include "vbo/vbo.h"
|
#include "vbo/vbo.h"
|
||||||
|
|
||||||
|
|
||||||
#define CALLED() //printf("CALLED %s\n",__PRETTY_FUNCTION__)
|
#define TRACE_SOFTGL
|
||||||
|
#ifdef TRACE_SOFTGL
|
||||||
|
extern "C" void _sPrintf(const char* format, ...);
|
||||||
|
# define TRACE(x...) _sPrintf("MesaSoftwareRenderer: " x)
|
||||||
|
# define CALLED() printf("MesaSoftwareRenderer: %s\n", __PRETTY_FUNCTION__)
|
||||||
|
#else
|
||||||
|
# define TRACE(x...)
|
||||||
|
# define CALLED()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ERROR(x...) _sPrintf("MesaSoftwareRenderer: " x)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -250,6 +260,7 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!fContext) {
|
if (!fContext) {
|
||||||
|
ERROR("%s: Failed to create Mesa context!\n", __func__);
|
||||||
_mesa_destroy_visual(fVisual);
|
_mesa_destroy_visual(fVisual);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -278,33 +289,23 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options,
|
|||||||
_mesa_initialize_window_framebuffer(&fFrameBuffer->base, fVisual);
|
_mesa_initialize_window_framebuffer(&fFrameBuffer->base, fVisual);
|
||||||
|
|
||||||
// Setup front render buffer
|
// Setup front render buffer
|
||||||
fFrontRenderBuffer = (struct msr_renderbuffer*)calloc(1,
|
fFrontRenderBuffer = _NewRenderBuffer(true);
|
||||||
sizeof(*fFrontRenderBuffer));
|
if (fFrontRenderBuffer == NULL) {
|
||||||
_mesa_init_renderbuffer(&fFrontRenderBuffer->base, 0);
|
|
||||||
fFrontRenderBuffer->active = true;
|
|
||||||
if (_SetupRenderBuffer(fFrontRenderBuffer, fColorSpace) != B_OK) {
|
|
||||||
free(fFrameBuffer);
|
|
||||||
_mesa_destroy_visual(fVisual);
|
_mesa_destroy_visual(fVisual);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fFrontRenderBuffer->base.AllocStorage = _FrontRenderbufferStorage;
|
|
||||||
_mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_FRONT_LEFT,
|
_mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_FRONT_LEFT,
|
||||||
&fFrontRenderBuffer->base);
|
&fFrontRenderBuffer->base);
|
||||||
|
|
||||||
// Setup back render buffer (if needed)
|
// Setup back render buffer (if needed)
|
||||||
fBackRenderBuffer = (struct msr_renderbuffer*)calloc(1,
|
if (fVisual->doubleBufferMode) {
|
||||||
sizeof(*fBackRenderBuffer));
|
fBackRenderBuffer = _NewRenderBuffer(false);
|
||||||
if (dblFlag) {
|
if (fBackRenderBuffer == NULL) {
|
||||||
_mesa_init_renderbuffer(&fBackRenderBuffer->base, 0);
|
_mesa_destroy_visual(fVisual);
|
||||||
|
return;
|
||||||
fBackRenderBuffer->active = true;
|
}
|
||||||
_SetupRenderBuffer(fBackRenderBuffer, fColorSpace);
|
|
||||||
fBackRenderBuffer->base.AllocStorage = _BackRenderbufferStorage;
|
|
||||||
fBackRenderBuffer->base.Delete = _DeleteBackBuffer;
|
|
||||||
_mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_BACK_LEFT,
|
_mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_BACK_LEFT,
|
||||||
&fBackRenderBuffer->base);
|
&fBackRenderBuffer->base);
|
||||||
} else {
|
|
||||||
fBackRenderBuffer->active = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAIKU_MESA_VER >= 709
|
#if HAIKU_MESA_VER >= 709
|
||||||
@@ -372,7 +373,7 @@ MesaSoftwareRenderer::LockGL()
|
|||||||
if (fColorSpace != colorSpace) {
|
if (fColorSpace != colorSpace) {
|
||||||
fColorSpace = colorSpace;
|
fColorSpace = colorSpace;
|
||||||
_SetupRenderBuffer(fFrontRenderBuffer, fColorSpace);
|
_SetupRenderBuffer(fFrontRenderBuffer, fColorSpace);
|
||||||
if (fBackRenderBuffer->active)
|
if (fVisual->doubleBufferMode)
|
||||||
_SetupRenderBuffer(fBackRenderBuffer, fColorSpace);
|
_SetupRenderBuffer(fBackRenderBuffer, fColorSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -554,12 +555,15 @@ MesaSoftwareRenderer::FrameResized(float width, float height)
|
|||||||
void
|
void
|
||||||
MesaSoftwareRenderer::_AllocateBitmap()
|
MesaSoftwareRenderer::_AllocateBitmap()
|
||||||
{
|
{
|
||||||
|
CALLED();
|
||||||
// allocate new size of back buffer bitmap
|
// allocate new size of back buffer bitmap
|
||||||
delete fBitmap;
|
delete fBitmap;
|
||||||
fBitmap = NULL;
|
fBitmap = NULL;
|
||||||
|
|
||||||
if (fWidth < 1 || fHeight < 1)
|
if (fWidth < 1 || fHeight < 1) {
|
||||||
|
TRACE("%s: Cannot allocate bitmap < 1x1!\n", __func__);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
BRect rect(0.0, 0.0, fWidth - 1, fHeight - 1);
|
BRect rect(0.0, 0.0, fWidth - 1, fHeight - 1);
|
||||||
fBitmap = new BBitmap(rect, fColorSpace);
|
fBitmap = new BBitmap(rect, fColorSpace);
|
||||||
for (uint i = 0; i < fHeight; i++) {
|
for (uint i = 0; i < fHeight; i++) {
|
||||||
@@ -570,7 +574,7 @@ MesaSoftwareRenderer::_AllocateBitmap()
|
|||||||
_mesa_resize_framebuffer(fContext, &fFrameBuffer->base, fWidth, fHeight);
|
_mesa_resize_framebuffer(fContext, &fFrameBuffer->base, fWidth, fHeight);
|
||||||
fFrontRenderBuffer->base.Data = fBitmap->Bits();
|
fFrontRenderBuffer->base.Data = fBitmap->Bits();
|
||||||
fFrontRenderBuffer->size = fBitmap->BitsLength();
|
fFrontRenderBuffer->size = fBitmap->BitsLength();
|
||||||
if (fBackRenderBuffer->active)
|
if (fVisual->doubleBufferMode)
|
||||||
fBackRenderBuffer->size = fBitmap->BitsLength();
|
fBackRenderBuffer->size = fBitmap->BitsLength();
|
||||||
fFrameBuffer->width = fWidth;
|
fFrameBuffer->width = fWidth;
|
||||||
fFrameBuffer->height = fHeight;
|
fFrameBuffer->height = fHeight;
|
||||||
@@ -694,6 +698,8 @@ MesaSoftwareRenderer::_FrontRenderbufferStorage(gl_context* ctx,
|
|||||||
struct gl_renderbuffer* render, GLenum internalFormat,
|
struct gl_renderbuffer* render, GLenum internalFormat,
|
||||||
GLuint width, GLuint height)
|
GLuint width, GLuint height)
|
||||||
{
|
{
|
||||||
|
CALLED();
|
||||||
|
|
||||||
render->Data = NULL;
|
render->Data = NULL;
|
||||||
render->Width = width;
|
render->Width = width;
|
||||||
render->Height = height;
|
render->Height = height;
|
||||||
@@ -732,12 +738,41 @@ MesaSoftwareRenderer::_Flush(gl_context* ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct msr_renderbuffer*
|
||||||
|
MesaSoftwareRenderer::_NewRenderBuffer(bool front)
|
||||||
|
{
|
||||||
|
CALLED();
|
||||||
|
struct msr_renderbuffer *msr
|
||||||
|
= (struct msr_renderbuffer*)calloc(1, sizeof *msr);
|
||||||
|
|
||||||
|
if (!msr) {
|
||||||
|
ERROR("%s: Failed calloc RenderBuffer\n", __func__);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
_mesa_init_renderbuffer(&msr->base, 0);
|
||||||
|
|
||||||
|
if (_SetupRenderBuffer(msr, fColorSpace) != B_OK) {
|
||||||
|
free(msr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (front)
|
||||||
|
msr->base.AllocStorage = _FrontRenderbufferStorage;
|
||||||
|
else {
|
||||||
|
msr->base.AllocStorage = _BackRenderbufferStorage;
|
||||||
|
msr->base.Delete = _DeleteBackBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
return msr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
MesaSoftwareRenderer::_SetupRenderBuffer(
|
MesaSoftwareRenderer::_SetupRenderBuffer(
|
||||||
struct msr_renderbuffer* buffer, color_space colorSpace)
|
struct msr_renderbuffer* buffer, color_space colorSpace)
|
||||||
{
|
{
|
||||||
if (!buffer->active)
|
CALLED();
|
||||||
return B_OK;
|
|
||||||
|
|
||||||
buffer->base.DataType = GL_UNSIGNED_BYTE;
|
buffer->base.DataType = GL_UNSIGNED_BYTE;
|
||||||
buffer->base.Data = NULL;
|
buffer->base.Data = NULL;
|
||||||
@@ -831,6 +866,7 @@ MesaSoftwareRenderer::_SetupRenderBuffer(
|
|||||||
void
|
void
|
||||||
MesaSoftwareRenderer::_DeleteBackBuffer(struct gl_renderbuffer* rb)
|
MesaSoftwareRenderer::_DeleteBackBuffer(struct gl_renderbuffer* rb)
|
||||||
{
|
{
|
||||||
|
CALLED();
|
||||||
free(rb->Data);
|
free(rb->Data);
|
||||||
free(rb);
|
free(rb);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ extern "C" {
|
|||||||
struct msr_renderbuffer {
|
struct msr_renderbuffer {
|
||||||
struct gl_renderbuffer base;
|
struct gl_renderbuffer base;
|
||||||
uint32 size;
|
uint32 size;
|
||||||
bool active;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -103,6 +102,8 @@ private:
|
|||||||
GLenum internalFormat,
|
GLenum internalFormat,
|
||||||
GLuint width, GLuint height);
|
GLuint width, GLuint height);
|
||||||
static void _Flush(gl_context *ctx);
|
static void _Flush(gl_context *ctx);
|
||||||
|
|
||||||
|
struct msr_renderbuffer* _NewRenderBuffer(bool front);
|
||||||
status_t _SetupRenderBuffer(struct msr_renderbuffer*
|
status_t _SetupRenderBuffer(struct msr_renderbuffer*
|
||||||
buffer, color_space colorSpace);
|
buffer, color_space colorSpace);
|
||||||
static void _DeleteBackBuffer(struct gl_renderbuffer* rb);
|
static void _DeleteBackBuffer(struct gl_renderbuffer* rb);
|
||||||
|
|||||||
Reference in New Issue
Block a user