#include "drirenderbuffer.h"
#include "buffers.h"
-#include "extensions.h"
-#include "framebuffer.h"
-#include "renderbuffer.h"
-#include "array_cache/acache.h"
+#include "main/extensions.h"
+#include "main/framebuffer.h"
+#include "main/renderbuffer.h"
+#include "vbo/vbo.h"
#include "swrast/swrast.h"
#include "swrast_setup/swrast_setup.h"
#include "tnl/tnl.h"
-#include "tnl/t_context.h"
+#include "tnl/tcontext.h"
#include "tnl/t_pipeline.h"
#include "drivers/common/driverfuncs.h"
+void fbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis);
typedef struct {
GLcontext *glCtx; /* Mesa context */
} fbContext, *fbContextPtr;
-typedef struct {
- GLframebuffer *mesa_framebuffer;
- void *currentBuffer;
- void *frontBuffer;
- void *backBuffer;
- int currentPitch;
-} fbDrawable, *fbDrawablePtr;
-
-typedef struct {
- unsigned long hFrameBuffer;
- int fbOrigin;
- int fbSize;
- int fbStride;
- int fbWidth;
- int fbHeight;
- int bpp;
- int drmFD;
- drmAddress fbMap;
-} fbDRI, *fbDRIPtr;
-
#define FB_CONTEXT(ctx) ((fbContextPtr)(ctx->DriverCtx))
-#ifdef USE_NEW_INTERFACE
-static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
-#endif /* USE_NEW_INTERFACE */
static const GLubyte *
get_string(GLcontext *ctx, GLenum pname)
/* not much to do here - pass it on */
_swrast_InvalidateState( ctx, new_state );
_swsetup_InvalidateState( ctx, new_state );
- _ac_InvalidateState( ctx, new_state );
+ _vbo_InvalidateState( ctx, new_state );
_tnl_InvalidateState( ctx, new_state );
}
static void
-viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+updateFramebufferSize(GLcontext *ctx)
{
- _mesa_ResizeBuffersMESA();
+ fbContextPtr fbmesa = FB_CONTEXT(ctx);
+ struct gl_framebuffer *fb = ctx->WinSysDrawBuffer;
+ if (fbmesa->dri.drawable->w != fb->Width ||
+ fbmesa->dri.drawable->h != fb->Height) {
+ driUpdateFramebufferSize(ctx, fbmesa->dri.drawable);
+ }
}
-
-/* specifies the buffer for swrast span rendering/reading */
static void
-set_buffer( GLcontext *ctx, GLframebuffer *buffer, GLuint bufferBit )
+viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
{
- fbContextPtr fbdevctx = FB_CONTEXT(ctx);
- __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable;
- fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
-
- /* What a twisted mess of private structs
- */
- assert(buffer == fbdrawable->mesa_framebuffer);
-
-
- switch (bufferBit) {
- case BUFFER_BIT_FRONT_LEFT:
- fbdrawable->currentBuffer = fbdrawable->frontBuffer;
- break;
- case BUFFER_BIT_BACK_LEFT:
- fbdrawable->currentBuffer = fbdrawable->backBuffer;
- break;
- default:
- /* This happens a lot if the client renders to the frontbuffer */
- if (0) _mesa_problem(ctx, "bad bufferBit in set_buffer()");
- }
+ /* XXX this should be called after we acquire the DRI lock, not here */
+ updateFramebufferSize(ctx);
}
{
functions->GetString = get_string;
functions->UpdateState = update_state;
- functions->ResizeBuffers = _mesa_resize_framebuffer;
functions->GetBufferSize = get_buffer_size;
functions->Viewport = viewport;
#define NAME(PREFIX) PREFIX##_B8G8R8
#define FORMAT GL_RGBA8
#define SPAN_VARS \
- const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
- __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
- const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
+ driRenderbuffer *drb = (driRenderbuffer *) rb;
#define INIT_PIXEL_PTR(P, X, Y) \
- GLubyte *P = (GLubyte *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X) * 3
+ GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 3;
#define INC_PIXEL_PTR(P) P += 3
#define STORE_PIXEL(DST, X, Y, VALUE) \
DST[0] = VALUE[BCOMP]; \
#define NAME(PREFIX) PREFIX##_B8G8R8A8
#define FORMAT GL_RGBA8
#define SPAN_VARS \
- const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
- __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
- const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
+ driRenderbuffer *drb = (driRenderbuffer *) rb;
#define INIT_PIXEL_PTR(P, X, Y) \
- GLubyte *P = (GLubyte *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X) * 4;
+ GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 4;
#define INC_PIXEL_PTR(P) P += 4
#define STORE_PIXEL(DST, X, Y, VALUE) \
DST[0] = VALUE[BCOMP]; \
#define NAME(PREFIX) PREFIX##_B5G6R5
#define FORMAT GL_RGBA8
#define SPAN_VARS \
- const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
- __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
- const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
+ driRenderbuffer *drb = (driRenderbuffer *) rb;
#define INIT_PIXEL_PTR(P, X, Y) \
- GLushort *P = (GLushort *) ((char *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X) * 2)
+ GLushort *P = (GLushort *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 2;
#define INC_PIXEL_PTR(P) P += 1
#define STORE_PIXEL(DST, X, Y, VALUE) \
DST[0] = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) )
#define NAME(PREFIX) PREFIX##_B5G5R5
#define FORMAT GL_RGBA8
#define SPAN_VARS \
- const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
- __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
- const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
+ driRenderbuffer *drb = (driRenderbuffer *) rb;
#define INIT_PIXEL_PTR(P, X, Y) \
- GLushort *P = (GLushort *) ((char *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X) * 2)
+ GLushort *P = (GLushort *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 2;
#define INC_PIXEL_PTR(P) P += 1
#define STORE_PIXEL(DST, X, Y, VALUE) \
DST[0] = ( (((VALUE[RCOMP]) & 0xf8) << 7) | (((VALUE[GCOMP]) & 0xf8) << 2) | ((VALUE[BCOMP]) >> 3) )
#define NAME(PREFIX) PREFIX##_CI8
#define FORMAT GL_COLOR_INDEX8_EXT
#define SPAN_VARS \
- const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
- __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
- const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
+ driRenderbuffer *drb = (driRenderbuffer *) rb;
#define INIT_PIXEL_PTR(P, X, Y) \
- GLubyte *P = (GLubyte *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X)
+ GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X);
#define INC_PIXEL_PTR(P) P += 1
#define STORE_PIXEL(DST, X, Y, VALUE) \
*DST = VALUE[0]
-static void
+void
fbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis)
{
ASSERT(drb->Base.InternalFormat == GL_RGBA);
static GLboolean
fbInitDriver( __DRIscreenPrivate *sPriv )
{
- fbDRIPtr dri_priv = (fbDRIPtr)sPriv->pDevPriv;
- fbDRIPtr priv;
- int drmFD;
-
- drmFD = drmOpen("radeon", NULL );
- if (drmFD < 0) {
- fprintf(stderr, "[drm] drmOpen failed\n");
- return GL_FALSE;
- }
-
- priv = _mesa_malloc(sizeof(*priv));
- if (!priv)
- return GL_FALSE;
-
- *priv = *dri_priv;
-
- priv->drmFD = drmFD;
- if (drmMap(drmFD, priv->hFrameBuffer, priv->fbSize, &priv->fbMap) < 0) {
- fprintf(stderr, "[drm] drmMap framebuffer failed\n");
- free(priv);
- return GL_FALSE;
- }
-
- sPriv->private = priv;
+ sPriv->private = NULL;
return GL_TRUE;
}
static void
fbDestroyScreen( __DRIscreenPrivate *sPriv )
{
- fbDRIPtr priv = (fbDRIPtr)sPriv->private;
-
- drmUnmap(priv->fbMap, priv->fbSize);
- drmClose(priv->drmFD);
- _mesa_free(priv);
}
+
/* Create the device specific context.
*/
static GLboolean
/* Create module contexts */
_swrast_CreateContext( ctx );
- _ac_CreateContext( ctx );
+ _vbo_CreateContext( ctx );
_tnl_CreateContext( ctx );
_swsetup_CreateContext( ctx );
_swsetup_Wakeup( ctx );
- /* swrast init -- need to verify these tests - I just plucked the
- * numbers out of the air. (KW)
- */
- {
- struct swrast_device_driver *swdd;
- swdd = _swrast_GetDeviceDriverReference( ctx );
- swdd->SetBuffer = set_buffer;
- }
-
/* use default TCL pipeline */
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
if ( fbmesa ) {
_swsetup_DestroyContext( fbmesa->glCtx );
_tnl_DestroyContext( fbmesa->glCtx );
- _ac_DestroyContext( fbmesa->glCtx );
+ _vbo_DestroyContext( fbmesa->glCtx );
_swrast_DestroyContext( fbmesa->glCtx );
/* free the Mesa context */
const __GLcontextModes *mesaVis,
GLboolean isPixmap )
{
- fbDRIPtr spriv = (fbDRIPtr)driScrnPriv->private;
- fbDrawablePtr fbdrawable;
+ struct gl_framebuffer *mesa_framebuffer;
if (isPixmap) {
return GL_FALSE; /* not implemented */
const GLboolean swAccum = mesaVis->accumRedBits > 0;
const GLboolean swStencil = mesaVis->stencilBits > 0;
- fbdrawable = _mesa_calloc(sizeof(*fbdrawable));
- if (!fbdrawable)
+ mesa_framebuffer = _mesa_create_framebuffer(mesaVis);
+ if (!mesa_framebuffer)
return 0;
-
-#if 0
- fbdrawable->mesa_framebuffer = (void *)
- _mesa_create_framebuffer( mesaVis,
- swDepth,
- swStencil,
- swAccum,
- swAlpha );
-
- if (!fbdrawable->mesa_framebuffer) {
- _mesa_free(fbdrawable);
- return 0;
- }
-#else
- fbdrawable->mesa_framebuffer = _mesa_create_framebuffer(mesaVis);
- if (!fbdrawable->mesa_framebuffer) {
- _mesa_free(fbdrawable);
- return 0;
- }
/* XXX double-check these parameters (bpp vs cpp, etc) */
{
- driRenderbuffer *drb = driNewRenderbuffer(GL_RGBA, spriv->bpp,
- spriv->fbOrigin,
- spriv->fbStride);
+ driRenderbuffer *drb = driNewRenderbuffer(MESA_FORMAT_ARGB8888,
+ driScrnPriv->pFB,
+ driScrnPriv->fbBPP / 8,
+ driScrnPriv->fbOrigin,
+ driScrnPriv->fbStride,
+ driDrawPriv);
fbSetSpanFunctions(drb, mesaVis);
- _mesa_add_renderbuffer(fbdrawable->mesa_framebuffer,
+ _mesa_add_renderbuffer(mesa_framebuffer,
BUFFER_FRONT_LEFT, &drb->Base);
}
if (mesaVis->doubleBufferMode) {
/* XXX what are the correct origin/stride values? */
- driRenderbuffer *drb = driNewRenderbuffer(GL_RGBA, spriv->bpp,
- spriv->fbOrigin,
- spriv->fbStride);
+ GLvoid *backBuf = _mesa_malloc(driScrnPriv->fbStride
+ * driScrnPriv->fbHeight);
+ driRenderbuffer *drb = driNewRenderbuffer(MESA_FORMAT_ARGB8888,
+ backBuf,
+ driScrnPriv->fbBPP /8,
+ driScrnPriv->fbOrigin,
+ driScrnPriv->fbStride,
+ driDrawPriv);
fbSetSpanFunctions(drb, mesaVis);
- _mesa_add_renderbuffer(fbdrawable->mesa_framebuffer,
+ _mesa_add_renderbuffer(mesa_framebuffer,
BUFFER_BACK_LEFT, &drb->Base);
}
- _mesa_add_soft_renderbuffers(fbdrawable->mesa_framebuffer,
+ _mesa_add_soft_renderbuffers(mesa_framebuffer,
GL_FALSE, /* color */
swDepth,
swStencil,
swAccum,
- swAlpha,
+ swAlpha, /* or always zero? */
GL_FALSE /* aux */);
-
-#endif
-
- driDrawPriv->driverPrivate = fbdrawable;
-
- fbdrawable->frontBuffer = fbdrawable->currentBuffer = spriv->fbMap;
- fbdrawable->currentPitch = spriv->fbWidth;
- /* Replace the framebuffer back buffer with a malloc'ed one --
- * big speedup.
- */
- fbdrawable->backBuffer = _mesa_malloc(fbdrawable->currentPitch * driDrawPriv->h);
+ driDrawPriv->driverPrivate = mesa_framebuffer;
return 1;
}
static void
fbDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
{
- fbDrawablePtr fbdrawable = (fbDrawablePtr)driDrawPriv->driverPrivate;
-
- _mesa_destroy_framebuffer(fbdrawable->mesa_framebuffer);
- _mesa_free(fbdrawable->backBuffer);
- _mesa_free(fbdrawable);
- driDrawPriv->driverPrivate = NULL;
+ _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL);
}
static void
fbSwapBuffers( __DRIdrawablePrivate *dPriv )
{
- fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
+ struct gl_framebuffer *mesa_framebuffer = (struct gl_framebuffer *)dPriv->driverPrivate;
+ struct gl_renderbuffer * front_renderbuffer = mesa_framebuffer->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
+ void *frontBuffer = front_renderbuffer->Data;
+ int currentPitch = ((driRenderbuffer *)front_renderbuffer)->pitch;
+ void *backBuffer = mesa_framebuffer->Attachment[BUFFER_BACK_LEFT].Renderbuffer->Data;
if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
- fbContextPtr fbmesa;
- GLcontext *ctx;
- fbmesa = (fbContextPtr) dPriv->driContextPriv->driverPrivate;
- ctx = fbmesa->glCtx;
+ fbContextPtr fbmesa = (fbContextPtr) dPriv->driContextPriv->driverPrivate;
+ GLcontext *ctx = fbmesa->glCtx;
+
if (ctx->Visual.doubleBufferMode) {
int i;
int offset = 0;
- char *tmp = _mesa_malloc(fbdrawable->currentPitch);
+ char *tmp = _mesa_malloc(currentPitch);
_mesa_notifySwapBuffers( ctx ); /* flush pending rendering comands */
- ASSERT(fbdrawable->frontBuffer);
- ASSERT(fbdrawable->backBuffer);
+ ASSERT(frontBuffer);
+ ASSERT(backBuffer);
for (i = 0; i < dPriv->h; i++) {
- _mesa_memcpy(tmp, (char *) fbdrawable->backBuffer + offset,
- fbdrawable->currentPitch);
- _mesa_memcpy((char *) fbdrawable->frontBuffer + offset, tmp,
- fbdrawable->currentPitch);
- offset += fbdrawable->currentPitch;
+ _mesa_memcpy(tmp, (char *) backBuffer + offset,
+ currentPitch);
+ _mesa_memcpy((char *) frontBuffer + offset, tmp,
+ currentPitch);
+ offset += currentPitch;
}
_mesa_free(tmp);
{
if ( driContextPriv ) {
fbContextPtr newFbCtx =
- (fbContextPtr) driContextPriv->driverPrivate;
+ (fbContextPtr) driContextPriv->driverPrivate;
newFbCtx->dri.drawable = driDrawPriv;
- _mesa_make_current( newFbCtx->glCtx,
- ((fbDrawablePtr)driDrawPriv->driverPrivate)->mesa_framebuffer,
- ((fbDrawablePtr)driReadPriv->driverPrivate)->mesa_framebuffer);
+ _mesa_make_current( newFbCtx->glCtx,
+ driDrawPriv->driverPrivate,
+ driReadPriv->driverPrivate);
} else {
_mesa_make_current( NULL, NULL, NULL );
}
static int
__driInitFBDev( struct DRIDriverContextRec *ctx )
{
- fbDRIPtr pfbDRI;
-
/* Note that drmOpen will try to load the kernel module, if needed. */
/* we need a fbdev drm driver - it will only track maps */
ctx->drmFD = drmOpen("radeon", NULL );
return 0;
}
fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n",
- ctx->shared.SAREASize, ctx->shared.hSAREA);
+ ctx->shared.SAREASize,
+ (unsigned long) ctx->shared.hSAREA);
if (drmMap( ctx->drmFD,
ctx->shared.hSAREA,
}
memset(ctx->pSAREA, 0, ctx->shared.SAREASize);
fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n",
- ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize);
+ (unsigned long) ctx->shared.hSAREA, ctx->pSAREA,
+ ctx->shared.SAREASize);
/* Need to AddMap the framebuffer and mmio regions here:
*/
}
fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n",
- ctx->shared.hFrameBuffer);
-
- pfbDRI = (fbDRIPtr)malloc(sizeof(*pfbDRI));
- pfbDRI->hFrameBuffer = ctx->shared.hFrameBuffer;
- pfbDRI->fbOrigin = ctx->shared.fbOrigin;
- pfbDRI->fbSize = ctx->shared.fbSize;
- pfbDRI->fbStride = ctx->shared.fbStride;
- pfbDRI->fbWidth = ctx->shared.virtualWidth;
- pfbDRI->fbHeight = ctx->shared.virtualHeight;
- pfbDRI->bpp = ctx->bpp;
-
- ctx->driverClientMsg = pfbDRI;
- ctx->driverClientMsgSize = sizeof(*pfbDRI);
-
+ (unsigned long) ctx->shared.hFrameBuffer);
+
return 1;
}
__driHaltFBDev
};
-#ifdef USE_NEW_INTERFACE
static __GLcontextModes *
-fbFillInModes( unsigned pixel_bits, unsigned depth_bits,
- unsigned stencil_bits, GLboolean have_back_buffer )
+fbFillInModes( __DRIscreenPrivate *psp,
+ unsigned pixel_bits, unsigned depth_bits,
+ unsigned stencil_bits, GLboolean have_back_buffer )
{
__GLcontextModes * modes;
__GLcontextModes * m;
GLX_NONE, GLX_SWAP_UNDEFINED_OML /*, GLX_SWAP_COPY_OML */
};
- u_int8_t depth_bits_array[2];
- u_int8_t stencil_bits_array[2];
+ uint8_t depth_bits_array[2];
+ uint8_t stencil_bits_array[2];
depth_bits_array[0] = depth_bits;
fb_type = GL_UNSIGNED_SHORT_5_6_5;
}
else {
- fb_format = GL_BGR;
+ fb_format = GL_RGBA;
fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
}
- modes = (*create_context_modes)( num_modes, sizeof( __GLcontextModes ) );
+ modes = (*psp->contextModes->createContextModes)( num_modes, sizeof( __GLcontextModes ) );
m = modes;
if ( ! driFillInModes( & m, fb_format, fb_type,
depth_bits_array, stencil_bits_array, depth_buffer_factor,
frame_buffer, pSAREA, fd,
internal_api_version, &fbAPI);
if ( psp != NULL ) {
- create_context_modes = (PFNGLXCREATECONTEXTMODES)
- glXGetProcAddress( (const GLubyte *) "__glXCreateContextModes" );
- if ( create_context_modes != NULL ) {
-#if 0
- fbDRIPtr dri_priv = (fbDRIPtr) psp->pDevPriv;
- *driver_modes = fbFillInModes( dri_priv->bpp,
- (dri_priv->bpp == 16) ? 16 : 24,
- (dri_priv->bpp == 16) ? 0 : 8,
- (dri_priv->backOffset != dri_priv->depthOffset) );
-#endif
- *driver_modes = fbFillInModes( 24, 24, 8, 0);
- }
+ *driver_modes = fbFillInModes( psp, psp->fbBPP,
+ (psp->fbBPP == 16) ? 16 : 24,
+ (psp->fbBPP == 16) ? 0 : 8,
+ 1);
}
return (void *) psp;
}
-#endif /* USE_NEW_INTERFACE */