summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/swrast
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/swrast')
-rw-r--r--src/mesa/drivers/dri/swrast/swrast.c39
-rw-r--r--src/mesa/drivers/dri/swrast/swrast_priv.h30
-rw-r--r--src/mesa/drivers/dri/swrast/swrast_spantemp.h8
3 files changed, 59 insertions, 18 deletions
diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
index 8273439fef..4450e470c6 100644
--- a/src/mesa/drivers/dri/swrast/swrast.c
+++ b/src/mesa/drivers/dri/swrast/swrast.c
@@ -308,14 +308,24 @@ dri_create_buffer(__DRIscreen * sPriv,
__DRIdrawable * dPriv,
const __GLcontextModes * visual, GLboolean isPixmap)
{
+ struct dri_drawable *drawable = NULL;
GLframebuffer *fb;
struct swrast_renderbuffer *frontrb, *backrb;
TRACE;
- fb = &dPriv->Base;
+ drawable = CALLOC_STRUCT(dri_drawable);
+ if (drawable == NULL)
+ goto drawable_fail;
- dPriv->row = malloc(MAX_WIDTH * 4);
+ dPriv->driverPrivate = drawable;
+ drawable->dPriv = dPriv;
+
+ drawable->row = malloc(MAX_WIDTH * 4);
+ if (drawable->row == NULL)
+ goto drawable_fail;
+
+ fb = &drawable->Base;
/* basic framebuffer setup */
_mesa_initialize_window_framebuffer(fb, visual);
@@ -340,6 +350,15 @@ dri_create_buffer(__DRIscreen * sPriv,
GL_FALSE /* aux bufs */);
return GL_TRUE;
+
+drawable_fail:
+
+ if (drawable)
+ free(drawable->row);
+
+ FREE(drawable);
+
+ return GL_FALSE;
}
static void
@@ -348,11 +367,12 @@ dri_destroy_buffer(__DRIdrawable * dPriv)
TRACE;
if (dPriv) {
+ struct dri_drawable *drawable = dri_drawable(dPriv);
GLframebuffer *fb;
- free(dPriv->row);
+ free(drawable->row);
- fb = &dPriv->Base;
+ fb = &drawable->Base;
fb->DeletePending = GL_TRUE;
_mesa_reference_framebuffer(&fb, NULL);
@@ -366,12 +386,13 @@ dri_swap_buffers(__DRIdrawable * dPriv)
GET_CURRENT_CONTEXT(ctx);
+ struct dri_drawable *drawable = dri_drawable(dPriv);
GLframebuffer *fb;
struct swrast_renderbuffer *frontrb, *backrb;
TRACE;
- fb = &dPriv->Base;
+ fb = &drawable->Base;
frontrb = swrast_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
backrb = swrast_renderbuffer(fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer);
@@ -402,7 +423,7 @@ dri_swap_buffers(__DRIdrawable * dPriv)
static void
get_window_size( GLframebuffer *fb, GLsizei *w, GLsizei *h )
{
- __DRIdrawable *dPriv = swrast_drawable(fb);
+ __DRIdrawable *dPriv = swrast_drawable(fb)->dPriv;
__DRIscreen *sPriv = dPriv->driScreenPriv;
int x, y;
@@ -572,13 +593,15 @@ dri_make_current(__DRIcontext * cPriv,
if (cPriv) {
struct dri_context *ctx = dri_context(cPriv);
+ struct dri_drawable *draw = dri_drawable(driDrawPriv);
+ struct dri_drawable *read = dri_drawable(driReadPriv);
if (!driDrawPriv || !driReadPriv)
return GL_FALSE;
mesaCtx = &ctx->Base;
- mesaDraw = &driDrawPriv->Base;
- mesaRead = &driReadPriv->Base;
+ mesaDraw = &draw->Base;
+ mesaRead = &read->Base;
/* check for same context and buffer */
if (mesaCtx == _mesa_get_current_context()
diff --git a/src/mesa/drivers/dri/swrast/swrast_priv.h b/src/mesa/drivers/dri/swrast/swrast_priv.h
index 130598bbd8..8e87f644c3 100644
--- a/src/mesa/drivers/dri/swrast/swrast_priv.h
+++ b/src/mesa/drivers/dri/swrast/swrast_priv.h
@@ -80,6 +80,30 @@ swrast_context(GLcontext *ctx)
return (struct dri_context *) ctx;
}
+struct dri_drawable
+{
+ /* mesa */
+ GLframebuffer Base;
+
+ /* dri */
+ __DRIdrawable *dPriv;
+
+ /* scratch row for optimized front-buffer rendering */
+ char *row;
+};
+
+static INLINE struct dri_drawable *
+dri_drawable(__DRIdrawable * driDrawPriv)
+{
+ return (struct dri_drawable *)driDrawPriv->driverPrivate;
+}
+
+static INLINE struct dri_drawable *
+swrast_drawable(GLframebuffer *fb)
+{
+ return (struct dri_drawable *) fb;
+}
+
struct swrast_renderbuffer {
struct gl_renderbuffer Base;
@@ -89,12 +113,6 @@ struct swrast_renderbuffer {
GLuint bpp;
};
-static INLINE __DRIdrawable *
-swrast_drawable(GLframebuffer *fb)
-{
- return (__DRIdrawable *) fb;
-}
-
static INLINE struct swrast_renderbuffer *
swrast_renderbuffer(struct gl_renderbuffer *rb)
{
diff --git a/src/mesa/drivers/dri/swrast/swrast_spantemp.h b/src/mesa/drivers/dri/swrast/swrast_spantemp.h
index c73b785683..079726ae4a 100644
--- a/src/mesa/drivers/dri/swrast/swrast_spantemp.h
+++ b/src/mesa/drivers/dri/swrast/swrast_spantemp.h
@@ -40,7 +40,7 @@ static INLINE void
PUT_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p )
{
__DRIcontext *ctx = swrast_context(glCtx)->cPriv;
- __DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer);
+ __DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer)->dPriv;
__DRIscreen *screen = ctx->driScreenPriv;
@@ -54,7 +54,7 @@ static INLINE void
GET_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p )
{
__DRIcontext *ctx = swrast_context(glCtx)->cPriv;
- __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer);
+ __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer)->dPriv;
__DRIscreen *screen = ctx->driScreenPriv;
@@ -66,7 +66,7 @@ static INLINE void
PUT_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row )
{
__DRIcontext *ctx = swrast_context(glCtx)->cPriv;
- __DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer);
+ __DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer)->dPriv;
__DRIscreen *screen = ctx->driScreenPriv;
@@ -79,7 +79,7 @@ static INLINE void
GET_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row )
{
__DRIcontext *ctx = swrast_context(glCtx)->cPriv;
- __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer);
+ __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer)->dPriv;
__DRIscreen *screen = ctx->driScreenPriv;