Massively cleaned up the code that calculates front/back/depth buffer

pitch and size.  Cut out a bunch of dead code.

This fixes bugzilla #1555.
This commit is contained in:
Ian Romanick 2004-10-08 01:15:52 +00:00
parent a2dc424acf
commit 3eccddb746
4 changed files with 128 additions and 344 deletions

View file

@ -136,6 +136,110 @@ static const GLubyte *viaGetString(GLcontext *ctx, GLenum name)
}
}
/**
* Calculate a width that satisfies the hardware's alignment requirements.
* On the Unichrome hardware, each scanline must be aligned to a multiple of
* 16 pixels.
*
* \param width Minimum buffer width, in pixels.
*
* \returns A pixel width that meets the alignment requirements.
*/
static __inline__ unsigned
buffer_align( unsigned width )
{
return (width + 0x0f) & ~0x0f;
}
/**
* Calculate the framebuffer parameters for all buffers (front, back, depth,
* and stencil) associated with the specified context.
*
* \warning
* This function also calls \c AllocateBuffer to actually allocate the
* buffers.
*
* \sa AllocateBuffer
*/
static GLboolean
calculate_buffer_parameters( viaContextPtr vmesa )
{
const unsigned shift = vmesa->viaScreen->bitsPerPixel / 16;
const unsigned extra = (vmesa->drawType == GLX_PBUFFER_BIT) ? 0 : 32;
unsigned w;
unsigned h;
if (vmesa->drawType == GLX_PBUFFER_BIT) {
w = vmesa->driDrawable->w;
h = vmesa->driDrawable->h;
}
else {
w = vmesa->viaScreen->width;
h = vmesa->viaScreen->height;
vmesa->front.offset = 0;
vmesa->front.map = (char *) vmesa->driScreen->pFB;
}
vmesa->front.pitch = buffer_align( w ) << shift;
vmesa->front.size = vmesa->front.pitch * h;
/* Allocate back-buffer */
vmesa->back.pitch = (buffer_align( vmesa->driDrawable->w ) << shift)
+ extra;
vmesa->back.size = vmesa->back.pitch * vmesa->driDrawable->h;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "viaMakeCurrent backbuffer: w = %d h = %d bpp = %d sizs = %d\n",
vmesa->back.pitch,
vmesa->driDrawable->h,
8 << shift,
vmesa->back.size);
#endif
/* Allocate depth-buffer */
if ( vmesa->hasStencil || vmesa->hasDepth ) {
const unsigned dShift = (vmesa->hasStencil)
? 2 : (vmesa->depthBits / 16);
vmesa->depth.pitch = (buffer_align( vmesa->driDrawable->w ) << dShift)
+ extra;
vmesa->depth.bpp = 8 << dShift;
vmesa->depth.size = vmesa->depth.pitch * vmesa->driDrawable->h;
}
else {
(void) memset( & vmesa->depth, 0, sizeof( vmesa->depth ) );
}
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "viaMakeCurrent depthbuffer: w = %d h = %d bpp = %d sizs = %d\n",
vmesa->depth.pitch,
vmesa->driDrawable->h,
vmesa->depth.bpp,
vmesa->depth.size);
#endif
/*=* John Sheng [2003.5.31] flip *=*/
if( (vmesa->viaScreen->width == vmesa->driDrawable->w)
&& (vmesa->viaScreen->height == vmesa->driDrawable->h) ) {
vmesa->doPageFlip = GL_FALSE;
vmesa->currentPage = 0;
vmesa->back.pitch = vmesa->front.pitch;
}
if (!AllocateBuffer(vmesa)) {
FREE(vmesa);
return GL_FALSE;
}
return GL_TRUE;
}
void viaReAllocateBuffers(GLframebuffer *drawbuffer)
{
GLcontext *ctx;
@ -152,95 +256,11 @@ void viaReAllocateBuffers(GLframebuffer *drawbuffer)
vmesa->driDrawable->w = ctx->DrawBuffer->Width;
vmesa->driDrawable->h = ctx->DrawBuffer->Height;
LOCK_HARDWARE(vmesa);
/* Allocate back & depth buffer */
{
int w, h, bpp;
w = vmesa->driDrawable->w;
h = vmesa->driDrawable->h;
/* back buffer */
bpp = vmesa->viaScreen->bitsPerPixel;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "driScreen->fbBPP = %d\n", bpp);
#endif
if (bpp == 32) {
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4 + 8;
vmesa->back.size = w * h * bpp / 8;
vmesa->back.pitch = w << 2;
}
else {
w = BUFFER_ALIGN_WIDTH(w * 2, BUFFER_ALIGNMENT) / 2 + 16;
vmesa->back.size = w * h * bpp / 8;
vmesa->back.pitch = w << 1;
}
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "resizebuffer backbuffer: w = %d h = %d bpp = %d sizs = %d\n",
w, h, bpp, vmesa->back.size);
#endif
/* depth buffer */
w = vmesa->driDrawable->w;
if (vmesa->hasDepth && vmesa->hasStencil) {
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4 + 8;
vmesa->depth.size = w * h * 4;
vmesa->depth.pitch = w << 2;
vmesa->depth.bpp = 32;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "depthBits = 24\n");
if (VIA_DEBUG) fprintf(stderr, "StencilBits = 8\n");
#endif
}
else if (vmesa->hasDepth) {
/*=* John Sheng [2003.6.16] patch viewperf drv-08 draw nothing */
/*if(vmesa->viaScreen->bitsPerPixel == 32)*/
/*vmesa->depthBits = 16;*/
if (vmesa->depthBits == 16) {
w = BUFFER_ALIGN_WIDTH(w * 2, BUFFER_ALIGNMENT) / 2 + 16;
vmesa->depth.size = w * h * 2;
vmesa->depth.pitch = w << 1;
vmesa->depth.bpp = 16;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "depthBits = 16\n");
#endif
}
else {
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4 + 8;
vmesa->depth.size = w * h * 4;
vmesa->depth.pitch = w << 2;
vmesa->depth.bpp = 32;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "depthBits = 32\n");
#endif
}
}
else if (vmesa->hasStencil) {
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4 + 8;
vmesa->depth.size = w * h * 4;
vmesa->depth.pitch = w << 2;
vmesa->depth.bpp = 32;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "StencilBits = 8\n");
#endif
}
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "resizebuffer depthbuffer: w = %d h = %d bpp = %d sizs = %d\n",
w, h, vmesa->depth.bpp, vmesa->depth.size);
#endif
/*=* John Sheng [2003.5.31] flip *=*/
{
if(vmesa->viaScreen->width == vmesa->driDrawable->w &&
vmesa->viaScreen->height == vmesa->driDrawable->h) {
vmesa->back.pitch = vmesa->front.pitch;
vmesa->back.size = vmesa->front.size;
}
}
if (!AllocateBuffer(vmesa)) {
FREE(vmesa);
}
}
calculate_buffer_parameters( vmesa );
UNLOCK_HARDWARE(vmesa);
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
#endif
@ -259,14 +279,14 @@ static void viaBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height)
static const char * const card_extensions[] =
{
"GL_ARB_multitexture",
"GL_ARB_point_parameters", /* John Sheng [2003.7.18] point param. */
"GL_ARB_point_parameters",
"GL_ARB_texture_env_add",
"GL_ARB_texture_env_combine", /* John Sheng [2003.7.18] tex combine */
"GL_ARB_texture_env_dot3", /* John Sheng [2003.7.18] tex dot3 */
"GL_ARB_texture_env_combine",
"GL_ARB_texture_env_dot3",
"GL_ARB_texture_mirrored_repeat",
"GL_EXT_stencil_wrap",
"GL_EXT_texture_env_combine", /* John Sheng [2003.7.18] tex combine */
"GL_EXT_texture_env_dot3", /* John Sheng [2003.7.18] tex dot3 */
"GL_EXT_texture_env_combine",
"GL_EXT_texture_env_dot3",
"GL_EXT_texture_lod_bias",
"GL_NV_blend_square",
NULL
@ -569,12 +589,12 @@ viaCreateContext(const __GLcontextModes *mesaVis,
if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
#endif
{
GLboolean saam;
int count = 0, fbSize;
#ifndef USE_XINERAMA
vmesa->saam = 0;
#else
saam = XineramaIsActive(vmesa->display);
GLboolean saam = XineramaIsActive(vmesa->display);
int count = 0, fbSize;
if (saam && vmesa->viaScreen->drixinerama) {
vmesa->xsi = XineramaQueryScreens(vmesa->display, &count);
/* Test RightOf or Down */
@ -718,8 +738,10 @@ void viaXMesaSetBackClipRects(viaContextPtr vmesa)
void viaXMesaWindowMoved(viaContextPtr vmesa)
{
GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3;
#ifdef USE_XINERAMA
GLuint side = 0;
__DRIdrawablePrivate *dPriv = vmesa->driDrawable;
#endif
switch (vmesa->glCtx->Color._DrawDestMask[0]) {
case __GL_FRONT_BUFFER_MASK:
@ -906,178 +928,22 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv,
fprintf(stderr, "driContextPriv = %08x\n", (GLuint)driReadPriv);
}
#endif
if (driContextPriv) {
viaContextPtr vmesa = (viaContextPtr)driContextPriv->driverPrivate;
current_mesa = vmesa;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "viaScreen->bitsPerPixel = %d\n", viaScreen->bitsPerPixel);
if (VIA_DEBUG) fprintf(stderr, "viaMakeCurrent: w = %d\n", vmesa->driDrawable->w);
#endif
vmesa->driDrawable = driDrawPriv;
if (vmesa->drawType == GLX_PBUFFER_BIT) {
int w, h, bpp;
w = vmesa->driDrawable->w;
h = vmesa->driDrawable->h;
bpp = vmesa->viaScreen->bitsPerPixel;
if (bpp == 32) {
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4;
vmesa->front.size = w * h * bpp / 8;
vmesa->front.pitch = w << 2;
}
else {
w = BUFFER_ALIGN_WIDTH(w * 2, BUFFER_ALIGNMENT) / 2;
vmesa->front.size = w * h * bpp / 8;
vmesa->front.pitch = w << 1;
}
if ( ! calculate_buffer_parameters( vmesa ) ) {
return GL_FALSE;
}
/*=* John Sheng [2003.6.20] fix resolution 720x480/720x576 front pitch error *=*/
else {
GLuint w;
GLuint h;
GLuint bpp;
bpp = vmesa->viaScreen->bitsPerPixel;
h = vmesa->viaScreen->height;
w = vmesa->viaScreen->width;
if (bpp == 0x20) {
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4;
vmesa->front.size = w * h * bpp / 8;
vmesa->front.pitch = w << 2;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "viaScreen->bitsPerPixel = %d\n", 32);
#endif
}
else if (bpp == 0x10) {
w = BUFFER_ALIGN_WIDTH(w * 2, BUFFER_ALIGNMENT) / 2;
vmesa->front.size = w * h * bpp / 8;
vmesa->front.pitch = w << 1;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "viaScreen->bitsPerPixel = %d\n", 16);
#endif
}
vmesa->front.offset = 0;
vmesa->front.map = (char *) vmesa->driScreen->pFB;
vmesa->front.size = w * h * vmesa->viaScreen->bitsPerPixel /8;
}
/* Allocate back & depth buffer */
{
int w, h, bpp;
w = vmesa->driDrawable->w;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "viaMakeCurrent: w = %d\n", w);
#endif
h = vmesa->driDrawable->h;
/* back buffer */
bpp = vmesa->viaScreen->bitsPerPixel;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "driScreen->fbBPP = %d\n", bpp);
#endif
if (bpp == 32) {
if (vmesa->drawType == GLX_PBUFFER_BIT)
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4;
else
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4 + 8;
vmesa->back.size = w * h * bpp / 8;
vmesa->back.pitch = w << 2;
}
else {
if (vmesa->drawType == GLX_PBUFFER_BIT)
w = BUFFER_ALIGN_WIDTH(w * 2, BUFFER_ALIGNMENT) / 2;
else
w = BUFFER_ALIGN_WIDTH(w * 2, BUFFER_ALIGNMENT) / 2 + 16;
vmesa->back.size = w * h * bpp / 8;
vmesa->back.pitch = w << 1;
}
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "viaMakeCurrent backbuffer: w = %d h = %d bpp = %d sizs = %d\n",
w, h, bpp, vmesa->back.size);
#endif
/* depth buffer */
w = vmesa->driDrawable->w;
if (vmesa->hasDepth && vmesa->hasStencil) {
if (vmesa->drawType == GLX_PBUFFER_BIT)
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4;
else
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4 + 8;
vmesa->depth.size = w * h * 4;
vmesa->depth.pitch = w << 2;
vmesa->depth.bpp = 32;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "depthBits = 24\n");
if (VIA_DEBUG) fprintf(stderr, "StencilBits = 8\n");
#endif
}
else if (vmesa->hasDepth) {
/*=* John Sheng [2003.6.16] patch viewperf drv-08 draw nothing */
/*if(vmesa->viaScreen->bitsPerPixel == 32)*/
/*vmesa->depthBits = 16;*/
if (vmesa->depthBits == 16) {
if (vmesa->drawType == GLX_PBUFFER_BIT)
w = BUFFER_ALIGN_WIDTH(w * 2, BUFFER_ALIGNMENT) / 2;
else
w = BUFFER_ALIGN_WIDTH(w * 2, BUFFER_ALIGNMENT) / 2 + 16;
vmesa->depth.size = w * h * 2;
vmesa->depth.pitch = w << 1;
vmesa->depth.bpp = 16;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "depthBits = 16\n");
#endif
}
else {
if (vmesa->drawType == GLX_PBUFFER_BIT)
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4;
else
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4 + 8;
vmesa->depth.size = w * h * 4;
vmesa->depth.pitch = w << 2;
vmesa->depth.bpp = 32;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "depthBits = 32\n");
#endif
}
}
else if (vmesa->hasStencil) {
if (vmesa->drawType == GLX_PBUFFER_BIT)
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4;
else
w = BUFFER_ALIGN_WIDTH(w * 4, BUFFER_ALIGNMENT) / 4 + 8;
vmesa->depth.size = w * h * 4;
vmesa->depth.pitch = w << 2;
vmesa->depth.bpp = 32;
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "StencilBits = 8\n");
#endif
}
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "viaMakeCurrent depthbuffer: w = %d h = %d bpp = %d sizs = %d\n",
w, h, vmesa->depth.bpp, vmesa->depth.size);
#endif
/*=* John Sheng [2003.5.31] flip *=*/
{
viaContextPtr vmesa = (viaContextPtr)driContextPriv->driverPrivate;
if(vmesa->viaScreen->width == vmesa->driDrawable->w &&
vmesa->viaScreen->height == vmesa->driDrawable->h) {
vmesa->doPageFlip = GL_FALSE;
vmesa->currentPage = 0;
vmesa->back.pitch = vmesa->front.pitch;
}
}
if (!AllocateBuffer(vmesa)) {
FREE(vmesa);
return GL_FALSE;
}
}
_mesa_make_current2(vmesa->glCtx,
(GLframebuffer *)driDrawPriv->driverPrivate,
(GLframebuffer *)driReadPriv->driverPrivate);

View file

@ -75,10 +75,7 @@ typedef struct via_texture_object_t *viaTextureObjectPtr;
#define TAG(x) via##x
#include "tnl_dd/t_dd_vertex.h"
#undef TAG
#define BUFFER_ALIGNMENT 32
#define BUFFER_ALIGN_WIDTH1(w, a) (((w) + ((a) - 1)) & ~((a) - 1))
#define BUFFER_ALIGN_WIDTH(w, a) (((w) & ((a) - 1)) ? BUFFER_ALIGN_WIDTH1(w, a) : (w))
#define BUFFER_ALIGN_ADDRESS(p, a) ((GLvoid *)(((GLint)(p)) + ((a)-1) & ~((a)-1)))
#define RightOf 1
#define LeftOf 2
#define Down 4

View file

@ -313,7 +313,6 @@ void viaCopyBuffer(const __DRIdrawablePrivate *dPriv)
#ifdef DEBUG
if (VIA_DEBUG) fprintf(stderr, "%s SwapPBuffers\n", __FUNCTION__);
#endif /*=* [DBG] for pbuffer *=*/
/*viaDoSwapBufferSoftFront(vmesa);*/
}
else {
GLuint scrn = 0;
@ -1436,83 +1435,7 @@ void viaDoSwapPBuffers(viaContextPtr vmesa)
#endif
}
void viaDoSwapBufferSoft(viaContextPtr vmesa)
{
GLuint nFrontPitch;
GLuint nBackPitch;
GLuint nFrontBase, nBackBase;
GLuint i, j;
GLubyte *by, *fy;
GLuint w;
w = vmesa->viaScreen->width;
w = BUFFER_ALIGN_WIDTH(w, BUFFER_ALIGNMENT);
if (vmesa->viaScreen->bitsPerPixel == 0x20)
nFrontPitch = w << 2;
else
nFrontPitch = w << 1;
nBackPitch = vmesa->back.pitch;
/* Caculate Base */
nFrontBase = (GLuint) vmesa->driScreen->pFB;
nBackBase = ((GLuint) vmesa->back.offset) + ((GLuint) vmesa->driScreen->pFB);
by = (GLubyte *) nBackBase;
fy = (GLubyte *) nFrontBase;
viaFlushPrimsLocked(vmesa);
for (i = 0; i < vmesa->driDrawable->h; i++) {
fy = (GLubyte *)(nFrontBase + i * nFrontPitch);
for (j = 0; j < nBackPitch; j++) {
*((GLubyte*)fy) = *((GLubyte*)by);
fy = fy + 1;
by = by + 1;
}
}
}
void viaDoSwapBufferSoftFront(viaContextPtr vmesa)
{
GLuint nFrontPitch;
GLuint nBackPitch;
GLuint nFrontBase, nBackBase;
GLuint i, j;
GLubyte *by, *fy;
GLuint w;
w = vmesa->viaScreen->width;
w = BUFFER_ALIGN_WIDTH(w, BUFFER_ALIGNMENT);
if (vmesa->viaScreen->bitsPerPixel == 0x20)
nFrontPitch = w << 2;
else
nFrontPitch = w << 1;
nBackPitch = vmesa->front.pitch;
/* Caculate Base */
nFrontBase = (GLuint) vmesa->driScreen->pFB;
nBackBase = ((GLuint) vmesa->front.offset) + ((GLuint) vmesa->driScreen->pFB);
by = (GLubyte *) nBackBase;
fy = (GLubyte *) nFrontBase;
viaFlushPrimsLocked(vmesa);
for (i = 0; i < vmesa->driDrawable->h; i++) {
fy = (GLubyte *)(nFrontBase + i * nFrontPitch);
for (j = 0; j < nBackPitch; j++) {
*((GLubyte*)fy) = *((GLubyte*)by);
fy = fy + 1;
by = by + 1;
}
}
}
int flush_agp(viaContextPtr vmesa, drm_via_flush_agp_t* agpCmd)
{
GLuint *pnAGPCurrentPhysStart;

View file

@ -47,8 +47,6 @@ void viaFillStencilBuffer(viaContextPtr vmesa, GLuint pixel);
void viaFillStencilDepthBuffer(viaContextPtr vmesa, GLuint pixel);
void viaDoSwapBuffers(viaContextPtr vmesa);
void viaDoSwapBuffersSaam(viaContextPtr vmesa);
void viaDoSwapBufferSoft(viaContextPtr vmesa);
void viaDoSwapBufferSoftFront(viaContextPtr vmesa);
void viaDoSwapPBuffers(viaContextPtr vmesa);
int flush_agp(viaContextPtr vmesa, drm_via_flush_agp_t* agpCmd);