X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Funichrome%2Fvia_context.c;h=bc5a414df60c2984021b0c02725a949011ba38e4;hb=6a3fdc3a1ea6c306d9543791bf172dd1052d7382;hp=15b57b95b710082ca218286b129dea8aa60ef387;hpb=50694eeff993043df45b6343eb853d92589946a5;p=mesa.git diff --git a/src/mesa/drivers/dri/unichrome/via_context.c b/src/mesa/drivers/dri/unichrome/via_context.c index 15b57b95b71..bc5a414df60 100644 --- a/src/mesa/drivers/dri/unichrome/via_context.c +++ b/src/mesa/drivers/dri/unichrome/via_context.c @@ -33,13 +33,16 @@ #include "glheader.h" #include "context.h" #include "matrix.h" +#include "state.h" #include "simple_list.h" #include "extensions.h" +#include "framebuffer.h" +#include "renderbuffer.h" #include "swrast/swrast.h" #include "swrast_setup/swrast_setup.h" #include "tnl/tnl.h" -#include "array_cache/acache.h" +#include "vbo/vbo.h" #include "tnl/t_pipeline.h" @@ -52,63 +55,25 @@ #include "via_tex.h" #include "via_span.h" #include "via_tris.h" -#include "via_vb.h" #include "via_ioctl.h" #include "via_fb.h" -#include "via_regs.h" #include #include "macros.h" +#include "drirenderbuffer.h" -#define DRIVER_DATE "20041215" +#define need_GL_ARB_multisample +#define need_GL_ARB_point_parameters +#define need_GL_EXT_fog_coord +#define need_GL_EXT_secondary_color +#include "extension_helper.h" + +#define DRIVER_DATE "20060710" #include "vblank.h" #include "utils.h" -viaContextPtr current_mesa; -#ifdef DEBUG GLuint VIA_DEBUG = 0; -#endif -GLuint DRAW_FRONT = 0; -#define DMA_SIZE 2 -GLuint VIA_PERFORMANCE = 0; -#ifdef PERFORMANCE_MEASURE -GLuint busy = 0; -GLuint idle = 0; -hash_element hash_table[HASH_TABLE_SIZE][HASH_TABLE_DEPTH]; -#endif -/*=* John Sheng [2003.5.31] agp tex *=*/ -extern GLuint agpFullCount; - -static GLboolean -AllocateBuffer(viaContextPtr vmesa) -{ - vmesa->front_base = vmesa->driScreen->pFB; - if (vmesa->drawType == GLX_PBUFFER_BIT) { - if (vmesa->front.map) - via_free_front_buffer(vmesa); - if (!via_alloc_front_buffer(vmesa)) - return GL_FALSE; - } - - if (vmesa->hasBack) { - if (vmesa->back.map) - via_free_back_buffer(vmesa); - if (!via_alloc_back_buffer(vmesa)) - return GL_FALSE; - } - - if (vmesa->hasDepth || vmesa->hasStencil) { - if (vmesa->depth.map) - via_free_depth_buffer(vmesa); - if (!via_alloc_depth_buffer(vmesa)) { - via_free_depth_buffer(vmesa); - return GL_FALSE; - } - } - - return GL_TRUE; -} /** * Return various strings for \c glGetString. @@ -133,8 +98,8 @@ static const GLubyte *viaGetString(GLcontext *ctx, GLenum name) "UniChrome (K8M800)", "UniChrome (PM8x0/CN400)", }; - const viaContext * const via = VIA_CONTEXT(ctx); - const unsigned id = via->viaScreen->deviceID; + struct via_context *vmesa = VIA_CONTEXT(ctx); + unsigned id = vmesa->viaScreen->deviceID; offset = driGetRendererString( buffer, chipset_names[(id > VIA_PM800) ? 0 : id], @@ -164,6 +129,67 @@ buffer_align( unsigned width ) } +static void +viaDeleteRenderbuffer(struct gl_renderbuffer *rb) +{ + /* Don't free() since we're contained in via_context struct. */ +} + +static GLboolean +viaRenderbufferStorage(GLcontext *ctx, struct gl_renderbuffer *rb, + GLenum internalFormat, GLuint width, GLuint height) +{ + rb->Width = width; + rb->Height = height; + rb->InternalFormat = internalFormat; + return GL_TRUE; +} + + +static void +viaInitRenderbuffer(struct via_renderbuffer *vrb, GLenum format, + __DRIdrawablePrivate *dPriv) +{ + const GLuint name = 0; + struct gl_renderbuffer *rb = & vrb->Base; + + vrb->dPriv = dPriv; + _mesa_init_renderbuffer(rb, name); + + /* Make sure we're using a null-valued GetPointer routine */ + assert(rb->GetPointer(NULL, rb, 0, 0) == NULL); + + rb->InternalFormat = format; + + if (format == GL_RGBA) { + /* Color */ + rb->_BaseFormat = GL_RGBA; + rb->DataType = GL_UNSIGNED_BYTE; + } + else if (format == GL_DEPTH_COMPONENT16) { + /* Depth */ + rb->_BaseFormat = GL_DEPTH_COMPONENT; + /* we always Get/Put 32-bit Z values */ + rb->DataType = GL_UNSIGNED_INT; + } + else if (format == GL_DEPTH_COMPONENT24) { + /* Depth */ + rb->_BaseFormat = GL_DEPTH_COMPONENT; + /* we always Get/Put 32-bit Z values */ + rb->DataType = GL_UNSIGNED_INT; + } + else { + /* Stencil */ + ASSERT(format == GL_STENCIL_INDEX8_EXT); + rb->_BaseFormat = GL_STENCIL_INDEX; + rb->DataType = GL_UNSIGNED_BYTE; + } + + rb->Delete = viaDeleteRenderbuffer; + rb->AllocStorage = viaRenderbufferStorage; +} + + /** * Calculate the framebuffer parameters for all buffers (front, back, depth, * and stencil) associated with the specified context. @@ -175,129 +201,185 @@ buffer_align( unsigned width ) * \sa AllocateBuffer */ static GLboolean -calculate_buffer_parameters( viaContextPtr vmesa ) +calculate_buffer_parameters(struct via_context *vmesa, + struct gl_framebuffer *fb, + __DRIdrawablePrivate *dPriv) { - 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; + const unsigned shift = vmesa->viaScreen->bitsPerPixel / 16; + const unsigned extra = 32; + unsigned w; + unsigned h; + + /* Normally, the renderbuffer would be added to the framebuffer just once + * when the framebuffer was created. The VIA driver is a bit funny + * though in that the front/back/depth renderbuffers are in the per-context + * state! + * That should be fixed someday. + */ + + if (!vmesa->front.Base.InternalFormat) { + /* do one-time init for the renderbuffers */ + viaInitRenderbuffer(&vmesa->front, GL_RGBA, dPriv); + viaSetSpanFunctions(&vmesa->front, &fb->Visual); + _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &vmesa->front.Base); + + if (fb->Visual.doubleBufferMode) { + viaInitRenderbuffer(&vmesa->back, GL_RGBA, dPriv); + viaSetSpanFunctions(&vmesa->back, &fb->Visual); + _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &vmesa->back.Base); + } + + if (vmesa->glCtx->Visual.depthBits > 0) { + viaInitRenderbuffer(&vmesa->depth, + (vmesa->glCtx->Visual.depthBits == 16 + ? GL_DEPTH_COMPONENT16 : GL_DEPTH_COMPONENT24), + dPriv); + viaSetSpanFunctions(&vmesa->depth, &fb->Visual); + _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &vmesa->depth.Base); + } + + if (vmesa->glCtx->Visual.stencilBits > 0) { + viaInitRenderbuffer(&vmesa->stencil, GL_STENCIL_INDEX8_EXT, + dPriv); + viaSetSpanFunctions(&vmesa->stencil, &fb->Visual); + _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &vmesa->stencil.Base); + } + } - vmesa->front.offset = 0; - vmesa->front.map = (char *) vmesa->driScreen->pFB; - } + assert(vmesa->front.Base.InternalFormat); + assert(vmesa->front.Base.AllocStorage); + if (fb->Visual.doubleBufferMode) { + assert(vmesa->back.Base.AllocStorage); + } + if (fb->Visual.depthBits) { + assert(vmesa->depth.Base.AllocStorage); + } - vmesa->front.pitch = buffer_align( w ) << shift; - vmesa->front.size = vmesa->front.pitch * h; + /* Allocate front-buffer */ + if (vmesa->drawType == GLX_PBUFFER_BIT) { + w = vmesa->driDrawable->w; + h = vmesa->driDrawable->h; + + vmesa->front.bpp = vmesa->viaScreen->bitsPerPixel; + vmesa->front.pitch = buffer_align( w ) << shift; /* bytes, not pixels */ + vmesa->front.size = vmesa->front.pitch * h; + + if (vmesa->front.map) + via_free_draw_buffer(vmesa, &vmesa->front); + if (!via_alloc_draw_buffer(vmesa, &vmesa->front)) + return GL_FALSE; + + } else { + w = vmesa->viaScreen->width; + h = vmesa->viaScreen->height; + + vmesa->front.bpp = vmesa->viaScreen->bitsPerPixel; + vmesa->front.pitch = buffer_align( w ) << shift; /* bytes, not pixels */ + vmesa->front.size = vmesa->front.pitch * h; + if (getenv("ALTERNATE_SCREEN")) + vmesa->front.offset = vmesa->front.size; + else + vmesa->front.offset = 0; + vmesa->front.map = (char *) vmesa->driScreen->pFB; + } - /* Allocate back-buffer */ - vmesa->back.pitch = (buffer_align( vmesa->driDrawable->w ) << shift) - + extra; - vmesa->back.size = vmesa->back.pitch * vmesa->driDrawable->h; + /* Allocate back-buffer */ + if (vmesa->hasBack) { + vmesa->back.bpp = vmesa->viaScreen->bitsPerPixel; + vmesa->back.pitch = (buffer_align( vmesa->driDrawable->w ) << shift); + vmesa->back.pitch += extra; + vmesa->back.pitch = MIN2(vmesa->back.pitch, vmesa->front.pitch); + vmesa->back.size = vmesa->back.pitch * vmesa->driDrawable->h; + if (vmesa->back.map) + via_free_draw_buffer(vmesa, &vmesa->back); + if (!via_alloc_draw_buffer(vmesa, &vmesa->back)) + return GL_FALSE; + } + else { + if (vmesa->back.map) + via_free_draw_buffer(vmesa, &vmesa->back); + (void) memset( &vmesa->back, 0, sizeof( vmesa->back ) ); + } - 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); - /* Allocate depth-buffer */ - if ( vmesa->hasStencil || vmesa->hasDepth ) { - const unsigned dShift = (vmesa->hasStencil) - ? 2 : (vmesa->depthBits / 16); + /* Allocate depth-buffer */ + if ( vmesa->hasStencil || vmesa->hasDepth ) { + vmesa->depth.bpp = vmesa->depthBits; + if (vmesa->depth.bpp == 24) + vmesa->depth.bpp = 32; - 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 ) ); - } + vmesa->depth.pitch = (buffer_align( vmesa->driDrawable->w ) * + (vmesa->depth.bpp/8)) + extra; + vmesa->depth.size = vmesa->depth.pitch * vmesa->driDrawable->h; - 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); - - /*=* John Sheng [2003.5.31] flip *=*/ - if( vmesa->viaScreen->width == vmesa->driDrawable->w && - vmesa->viaScreen->height == vmesa->driDrawable->h ) { -#define ALLOW_EXPERIMENTAL_PAGEFLIP 1 -#if ALLOW_EXPERIMENTAL_PAGEFLIP - vmesa->doPageFlip = GL_TRUE; -#else - vmesa->doPageFlip = GL_FALSE; -#endif - vmesa->currentPage = 0; - vmesa->back.pitch = vmesa->front.pitch; - } + if (vmesa->depth.map) + via_free_draw_buffer(vmesa, &vmesa->depth); + if (!via_alloc_draw_buffer(vmesa, &vmesa->depth)) { + return GL_FALSE; + } + } + else { + if (vmesa->depth.map) + via_free_draw_buffer(vmesa, &vmesa->depth); + (void) memset( & vmesa->depth, 0, sizeof( vmesa->depth ) ); + } - if (!AllocateBuffer(vmesa)) { - FREE(vmesa); - return GL_FALSE; - } - - return GL_TRUE; + /* stencil buffer is same as depth buffer */ + vmesa->stencil.handle = vmesa->depth.handle; + vmesa->stencil.size = vmesa->depth.size; + vmesa->stencil.offset = vmesa->depth.offset; + vmesa->stencil.index = vmesa->depth.index; + vmesa->stencil.pitch = vmesa->depth.pitch; + vmesa->stencil.bpp = vmesa->depth.bpp; + vmesa->stencil.map = vmesa->depth.map; + vmesa->stencil.orig = vmesa->depth.orig; + vmesa->stencil.origMap = vmesa->depth.origMap; + + if( vmesa->viaScreen->width == vmesa->driDrawable->w && + vmesa->viaScreen->height == vmesa->driDrawable->h ) { + vmesa->doPageFlip = vmesa->allowPageFlip; + if (vmesa->hasBack) { + assert(vmesa->back.pitch == vmesa->front.pitch); + } + } + else + vmesa->doPageFlip = GL_FALSE; + + return GL_TRUE; } -void viaReAllocateBuffers(GLframebuffer *drawbuffer) +void viaReAllocateBuffers(GLcontext *ctx, GLframebuffer *drawbuffer, + GLuint width, GLuint height) { - GLcontext *ctx; - viaContextPtr vmesa = current_mesa; + struct via_context *vmesa = VIA_CONTEXT(ctx); - ctx = vmesa->glCtx; - ctx->DrawBuffer->Width = drawbuffer->Width; - ctx->DrawBuffer->Height = drawbuffer->Height; - - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - ctx->DrawBuffer->Accum = 0; - - vmesa->driDrawable->w = ctx->DrawBuffer->Width; - vmesa->driDrawable->h = ctx->DrawBuffer->Height; - - LOCK_HARDWARE(vmesa); - calculate_buffer_parameters( vmesa ); - UNLOCK_HARDWARE(vmesa); + calculate_buffer_parameters(vmesa, drawbuffer, vmesa->driDrawable); - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); -} -static void viaBufferSize(GLframebuffer *buffer, GLuint *width, GLuint *height) - -{ - /* MESA5.0 */ - viaContextPtr vmesa = current_mesa; - *width = vmesa->driDrawable->w; - *height = vmesa->driDrawable->h; + _mesa_resize_framebuffer(ctx, drawbuffer, width, height); } /* Extension strings exported by the Unichrome driver. */ -static const char * const card_extensions[] = +const struct dri_extension card_extensions[] = { - "GL_ARB_multitexture", - "GL_ARB_point_parameters", - "GL_ARB_texture_env_add", - "GL_ARB_texture_env_combine", - "GL_ARB_texture_env_dot3", - "GL_ARB_texture_mirrored_repeat", - "GL_EXT_stencil_wrap", - "GL_EXT_texture_env_combine", - "GL_EXT_texture_env_dot3", - "GL_EXT_texture_lod_bias", - "GL_NV_blend_square", - NULL + { "GL_ARB_multisample", GL_ARB_multisample_functions }, + { "GL_ARB_multitexture", NULL }, + { "GL_ARB_point_parameters", GL_ARB_point_parameters_functions }, + { "GL_ARB_texture_env_add", NULL }, + { "GL_ARB_texture_env_combine", NULL }, +/* { "GL_ARB_texture_env_dot3", NULL }, */ + { "GL_ARB_texture_mirrored_repeat", NULL }, + { "GL_EXT_fog_coord", GL_EXT_fog_coord_functions }, + { "GL_EXT_secondary_color", GL_EXT_secondary_color_functions }, + { "GL_EXT_stencil_wrap", NULL }, + { "GL_EXT_texture_env_combine", NULL }, +/* { "GL_EXT_texture_env_dot3", NULL }, */ + { "GL_EXT_texture_lod_bias", NULL }, + { "GL_NV_blend_square", NULL }, + { NULL, NULL } }; extern const struct tnl_pipeline_stage _via_fastrender_stage; @@ -313,81 +395,73 @@ static const struct tnl_pipeline_stage *via_pipeline[] = { /* REMOVE: point attenuation stage */ #if 1 &_via_fastrender_stage, /* ADD: unclipped rastersetup-to-dma */ - &_via_render_stage, /* ADD: modification from _tnl_render_stage */ #endif &_tnl_render_stage, 0, }; +static const struct dri_debug_control debug_control[] = +{ + { "fall", DEBUG_FALLBACKS }, + { "tex", DEBUG_TEXTURE }, + { "ioctl", DEBUG_IOCTL }, + { "prim", DEBUG_PRIMS }, + { "vert", DEBUG_VERTS }, + { "state", DEBUG_STATE }, + { "verb", DEBUG_VERBOSE }, + { "dri", DEBUG_DRI }, + { "dma", DEBUG_DMA }, + { "san", DEBUG_SANITY }, + { "sync", DEBUG_SYNC }, + { "sleep", DEBUG_SLEEP }, + { "pix", DEBUG_PIXEL }, + { "2d", DEBUG_2D }, + { NULL, 0 } +}; + + static GLboolean -AllocateDmaBuffer(const GLvisual *visual, viaContextPtr vmesa) +AllocateDmaBuffer(struct via_context *vmesa) { - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); if (vmesa->dma) via_free_dma_buffer(vmesa); - if (!via_alloc_dma_buffer(vmesa)) { - if (vmesa->front.map) - via_free_front_buffer(vmesa); - if (vmesa->back.map) - via_free_back_buffer(vmesa); - if (vmesa->depth.map) - via_free_depth_buffer(vmesa); - + if (!via_alloc_dma_buffer(vmesa)) return GL_FALSE; - } - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); - return GL_TRUE; -} -static void -InitVertexBuffer(viaContextPtr vmesa) -{ - GLuint *addr; - - addr = (GLuint *)vmesa->dma; - *addr = 0xF210F110; - *addr = (HC_ParaType_NotTex << 16); - *addr = 0xcccccccc; - *addr = 0xdddddddd; - - vmesa->dmaLow = DMA_OFFSET; - vmesa->dmaHigh = VIA_DMA_BUFSIZ; - vmesa->dmaAddr = (unsigned char *)vmesa->dma; - vmesa->dmaLastPrim = vmesa->dmaLow; + vmesa->dmaLow = 0; + vmesa->dmaCliprectAddr = ~0; + return GL_TRUE; } static void -FreeBuffer(viaContextPtr vmesa) +FreeBuffer(struct via_context *vmesa) { - if (vmesa->front.map) - via_free_front_buffer(vmesa); + if (vmesa->front.map && vmesa->drawType == GLX_PBUFFER_BIT) + via_free_draw_buffer(vmesa, &vmesa->front); if (vmesa->back.map) - via_free_back_buffer(vmesa); + via_free_draw_buffer(vmesa, &vmesa->back); if (vmesa->depth.map) - via_free_depth_buffer(vmesa); + via_free_draw_buffer(vmesa, &vmesa->depth); + + if (vmesa->breadcrumb.map) + via_free_draw_buffer(vmesa, &vmesa->breadcrumb); if (vmesa->dma) via_free_dma_buffer(vmesa); } -static int -get_ust_nop( int64_t * ust ) -{ - *ust = 1; - return 0; -} GLboolean -viaCreateContext(const __GLcontextModes *mesaVis, +viaCreateContext(const __GLcontextModes *visual, __DRIcontextPrivate *driContextPriv, void *sharedContextPrivate) { GLcontext *ctx, *shareCtx; - viaContextPtr vmesa; + struct via_context *vmesa; __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; viaScreenPrivate *viaScreen = (viaScreenPrivate *)sPriv->private; drm_via_sarea_t *saPriv = (drm_via_sarea_t *) @@ -395,54 +469,80 @@ viaCreateContext(const __GLcontextModes *mesaVis, struct dd_function_table functions; /* Allocate via context */ - vmesa = (viaContextPtr) CALLOC_STRUCT(via_context_t); + vmesa = (struct via_context *) CALLOC_STRUCT(via_context); if (!vmesa) { return GL_FALSE; } - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); /* Parse configuration files. */ driParseConfigFiles (&vmesa->optionCache, &viaScreen->optionCache, - sPriv->myNum, "via"); + sPriv->myNum, "unichrome"); - current_mesa = vmesa; /* pick back buffer */ - if (mesaVis->doubleBufferMode) { - vmesa->hasBack = GL_TRUE; - } - else { - vmesa->hasBack = GL_FALSE; - } - /* pick z buffer */ - if (mesaVis->haveDepthBuffer) { - vmesa->hasDepth = GL_TRUE; - vmesa->depthBits = mesaVis->depthBits; - } - else { - vmesa->hasDepth = GL_FALSE; - vmesa->depthBits = 0; - } - /* pick stencil buffer */ - if (mesaVis->haveStencilBuffer) { - vmesa->hasStencil = GL_TRUE; - vmesa->stencilBits = mesaVis->stencilBits; - } - else { - vmesa->hasStencil = GL_FALSE; - vmesa->stencilBits = 0; + vmesa->hasBack = visual->doubleBufferMode; + + switch(visual->depthBits) { + case 0: + vmesa->hasDepth = GL_FALSE; + vmesa->depthBits = 0; + vmesa->depth_max = 1.0; + break; + case 16: + vmesa->hasDepth = GL_TRUE; + vmesa->depthBits = visual->depthBits; + vmesa->have_hw_stencil = GL_FALSE; + vmesa->depth_max = (GLfloat)0xffff; + vmesa->depth_clear_mask = 0xf << 28; + vmesa->ClearDepth = 0xffff; + vmesa->polygon_offset_scale = 1.0 / vmesa->depth_max; + break; + case 24: + vmesa->hasDepth = GL_TRUE; + vmesa->depthBits = visual->depthBits; + vmesa->depth_max = (GLfloat) 0xffffff; + vmesa->depth_clear_mask = 0xe << 28; + vmesa->ClearDepth = 0xffffff00; + + assert(visual->haveStencilBuffer); + assert(visual->stencilBits == 8); + + vmesa->have_hw_stencil = GL_TRUE; + vmesa->stencilBits = visual->stencilBits; + vmesa->stencil_clear_mask = 0x1 << 28; + vmesa->polygon_offset_scale = 2.0 / vmesa->depth_max; + break; + case 32: + vmesa->hasDepth = GL_TRUE; + vmesa->depthBits = visual->depthBits; + assert(!visual->haveStencilBuffer); + vmesa->have_hw_stencil = GL_FALSE; + vmesa->depth_max = (GLfloat)0xffffffff; + vmesa->depth_clear_mask = 0xf << 28; + vmesa->ClearDepth = 0xffffffff; + vmesa->polygon_offset_scale = 2.0 / vmesa->depth_max; + break; + default: + assert(0); + break; } + make_empty_list(&vmesa->freed_tex_buffers); + make_empty_list(&vmesa->tex_image_list[VIA_MEM_VIDEO]); + make_empty_list(&vmesa->tex_image_list[VIA_MEM_AGP]); + make_empty_list(&vmesa->tex_image_list[VIA_MEM_SYSTEM]); + _mesa_init_driver_functions(&functions); viaInitTextureFuncs(&functions); /* Allocate the Mesa context */ if (sharedContextPrivate) - shareCtx = ((viaContextPtr) sharedContextPrivate)->glCtx; + shareCtx = ((struct via_context *) sharedContextPrivate)->glCtx; else shareCtx = NULL; - vmesa->glCtx = _mesa_create_context(mesaVis, shareCtx, &functions, (void*) vmesa); + vmesa->glCtx = _mesa_create_context(visual, shareCtx, &functions, + (void*) vmesa); vmesa->shareCtx = shareCtx; @@ -453,38 +553,28 @@ viaCreateContext(const __GLcontextModes *mesaVis, driContextPriv->driverPrivate = vmesa; ctx = vmesa->glCtx; - - /* check */ - /*=* John Sheng [2003.7.2] for visual config number can't excess 8 *=*/ - /*if (viaScreen->textureSize < 2 * 1024 * 1024) { - ctx->Const.MaxTextureLevels = 9; - } - else if (viaScreen->textureSize < 8 * 1024 * 1024) { - ctx->Const.MaxTextureLevels = 10; - } - else { + + if (driQueryOptionb(&vmesa->optionCache, "excess_mipmap")) ctx->Const.MaxTextureLevels = 11; - }*/ - ctx->Const.MaxTextureLevels = 11; - + else + ctx->Const.MaxTextureLevels = 10; + ctx->Const.MaxTextureUnits = 2; ctx->Const.MaxTextureImageUnits = ctx->Const.MaxTextureUnits; ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureUnits; ctx->Const.MinLineWidth = 1.0; ctx->Const.MinLineWidthAA = 1.0; - ctx->Const.MaxLineWidth = 3.0; - ctx->Const.MaxLineWidthAA = 3.0; + ctx->Const.MaxLineWidth = 1.0; + ctx->Const.MaxLineWidthAA = 1.0; ctx->Const.LineWidthGranularity = 1.0; ctx->Const.MinPointSize = 1.0; ctx->Const.MinPointSizeAA = 1.0; - ctx->Const.MaxPointSize = 3.0; - ctx->Const.MaxPointSizeAA = 3.0; + ctx->Const.MaxPointSize = 1.0; + ctx->Const.MaxPointSizeAA = 1.0; ctx->Const.PointSizeGranularity = 1.0; - ctx->Driver.GetBufferSize = viaBufferSize; -/* ctx->Driver.ResizeBuffers = _swrast_alloc_buffers; *//* FIXME ?? */ ctx->Driver.GetString = viaGetString; ctx->DriverCtx = (void *)vmesa; @@ -493,7 +583,7 @@ viaCreateContext(const __GLcontextModes *mesaVis, /* Initialize the software rasterizer and helper modules. */ _swrast_CreateContext(ctx); - _ac_CreateContext(ctx); + _vbo_CreateContext(ctx); _tnl_CreateContext(ctx); _swsetup_CreateContext(ctx); @@ -519,395 +609,204 @@ viaCreateContext(const __GLcontextModes *mesaVis, vmesa->viaScreen = viaScreen; vmesa->driScreen = sPriv; vmesa->sarea = saPriv; - vmesa->glBuffer = NULL; - vmesa->texHeap = mmInit(0, viaScreen->textureSize); - vmesa->stippleInHw = 1; vmesa->renderIndex = ~0; - vmesa->dirty = VIA_UPLOAD_ALL; - vmesa->uploadCliprects = GL_TRUE; - vmesa->needUploadAllState = 1; + vmesa->setupIndex = ~0; + vmesa->hwPrimitive = GL_POLYGON+1; + + /* KW: Hardwire this. Was previously set bogusly in + * viaCreateBuffer. Needs work before PBUFFER can be used: + */ + vmesa->drawType = GLX_WINDOW_BIT; - make_empty_list(&vmesa->TexObjList); - make_empty_list(&vmesa->SwappedOut); - vmesa->CurrentTexObj[0] = 0; - vmesa->CurrentTexObj[1] = 0; - _math_matrix_ctr(&vmesa->ViewportMatrix); - driInitExtensions( ctx, card_extensions, GL_TRUE ); + /* Do this early, before VIA_FLUSH_DMA can be called: + */ + if (!AllocateDmaBuffer(vmesa)) { + fprintf(stderr ,"AllocateDmaBuffer fail\n"); + FreeBuffer(vmesa); + FREE(vmesa); + return GL_FALSE; + } + + /* Allocate a small piece of fb memory for synchronization: + */ + vmesa->breadcrumb.bpp = 32; + vmesa->breadcrumb.pitch = buffer_align( 64 ) << 2; + vmesa->breadcrumb.size = vmesa->breadcrumb.pitch; + + if (!via_alloc_draw_buffer(vmesa, &vmesa->breadcrumb)) { + fprintf(stderr ,"AllocateDmaBuffer fail\n"); + FreeBuffer(vmesa); + FREE(vmesa); + return GL_FALSE; + } + + driInitExtensions( ctx, card_extensions, GL_TRUE ); viaInitStateFuncs(ctx); - viaInitTextures(ctx); viaInitTriFuncs(ctx); viaInitSpanFuncs(ctx); viaInitIoctlFuncs(ctx); - viaInitVB(ctx); viaInitState(ctx); -#ifdef DEBUG if (getenv("VIA_DEBUG")) - VIA_DEBUG = 1; - else - VIA_DEBUG = 0; -#endif + VIA_DEBUG = driParseDebugString( getenv( "VIA_DEBUG" ), + debug_control ); - if (getenv("DRAW_FRONT")) - DRAW_FRONT = 1; - else - DRAW_FRONT = 0; - -#ifdef PERFORMANCE_MEASURE - if (getenv("VIA_PERFORMANCE")) - VIA_PERFORMANCE = 1; - else - VIA_PERFORMANCE = 0; - - { - int i, j; - for (i = 0; i < HASH_TABLE_SIZE; i++) { - for (j = 0; j < HASH_TABLE_DEPTH; j ++) { - hash_table[i][j].count = 0; - sprintf(hash_table[i][j].func, "%s", "NULL"); - } - } - } -#endif + if (getenv("VIA_NO_RAST") || + driQueryOptionb(&vmesa->optionCache, "no_rast")) + FALLBACK(vmesa, VIA_FALLBACK_USER_DISABLE, 1); - /* I don't understand why this isn't working: - */ vmesa->vblank_flags = vmesa->viaScreen->irqEnabled ? driGetDefaultVBlankFlags(&vmesa->optionCache) : VBLANK_FLAG_NO_IRQ; - /* Hack this up in its place: - */ - vmesa->vblank_flags = getenv("VIA_VSYNC") ? VBLANK_FLAG_SYNC : VBLANK_FLAG_NO_IRQ; + if (getenv("VIA_PAGEFLIP")) + vmesa->allowPageFlip = 1; - - vmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( (const GLubyte *) "__glXGetUST" ); - if ( vmesa->get_ust == NULL ) { - vmesa->get_ust = get_ust_nop; - } - (*vmesa->get_ust)( & vmesa->swap_ust ); + (*dri_interface->getUST)( &vmesa->swap_ust ); - if (!AllocateDmaBuffer(mesaVis, vmesa)) { - fprintf(stderr ,"AllocateDmaBuffer fail\n"); - FREE(vmesa); - return GL_FALSE; - } - - InitVertexBuffer(vmesa); - - vmesa->regMMIOBase = (GLuint *)((GLuint)viaScreen->reg); - vmesa->pnGEMode = (GLuint *)((GLuint)viaScreen->reg + 0x4); - vmesa->regEngineStatus = (GLuint *)((GLuint)viaScreen->reg + 0x400); - vmesa->regTranSet = (GLuint *)((GLuint)viaScreen->reg + 0x43C); - vmesa->regTranSpace = (GLuint *)((GLuint)viaScreen->reg + 0x440); + vmesa->regMMIOBase = (GLuint *)((unsigned long)viaScreen->reg); + vmesa->pnGEMode = (GLuint *)((unsigned long)viaScreen->reg + 0x4); + vmesa->regEngineStatus = (GLuint *)((unsigned long)viaScreen->reg + 0x400); + vmesa->regTranSet = (GLuint *)((unsigned long)viaScreen->reg + 0x43C); + vmesa->regTranSpace = (GLuint *)((unsigned long)viaScreen->reg + 0x440); vmesa->agpBase = viaScreen->agpBase; - if (VIA_DEBUG) { - fprintf(stderr, "regEngineStatus = %x\n", *vmesa->regEngineStatus); - } - - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); - { -#ifndef USE_XINERAMA - vmesa->saam = 0; -#else - GLboolean saam = XineramaIsActive(vmesa->display); - int count = 0, fbSize; - - if (saam && vmesa->viaScreen->drixinerama) { - vmesa->xsi = XineramaQueryScreens(vmesa->display, &count); - /* Test RightOf or Down */ - if (vmesa->xsi[0].x_org == 0 && vmesa->xsi[0].y_org == 0) { - if (vmesa->xsi[1].x_org == vmesa->xsi[1].width) { - vmesa->saam = RightOf; - } - else { - vmesa->saam = Down; - } - } - /* Test LeftOf or Up */ - else if (vmesa->xsi[0].x_org == vmesa->xsi[0].width) { - vmesa->saam = LeftOf; - } - else if (vmesa->xsi[0].y_org == vmesa->xsi[0].height) { - vmesa->saam = Up; - } - else - vmesa->saam = 0; - - - fbSize = vmesa->viaScreen->fbSize; - } - else - vmesa->saam = 0; -#endif - } - - vmesa->pSaamRects = (drm_clip_rect_t *) malloc(sizeof(drm_clip_rect_t)); + + return GL_TRUE; } void viaDestroyContext(__DRIcontextPrivate *driContextPriv) { - viaContextPtr vmesa = (viaContextPtr)driContextPriv->driverPrivate; - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); + GET_CURRENT_CONTEXT(ctx); + struct via_context *vmesa = + (struct via_context *)driContextPriv->driverPrivate; + struct via_context *current = ctx ? VIA_CONTEXT(ctx) : NULL; assert(vmesa); /* should never be null */ - viaFlushPrimsLocked(vmesa); - WAIT_IDLE + + /* check if we're deleting the currently bound context */ + if (vmesa == current) { + VIA_FLUSH_DMA(vmesa); + _mesa_make_current(NULL, NULL, NULL); + } if (vmesa) { - /*=* John Sheng [2003.5.31] agp tex *=*/ - if(VIA_DEBUG) fprintf(stderr, "agpFullCount = %d\n", agpFullCount); + viaWaitIdle(vmesa, GL_FALSE); + if (vmesa->doPageFlip) { + LOCK_HARDWARE(vmesa); + if (vmesa->pfCurrentOffset != 0) { + fprintf(stderr, "%s - reset pf\n", __FUNCTION__); + viaResetPageFlippingLocked(vmesa); + } + UNLOCK_HARDWARE(vmesa); + } _swsetup_DestroyContext(vmesa->glCtx); _tnl_DestroyContext(vmesa->glCtx); - _ac_DestroyContext(vmesa->glCtx); + _vbo_DestroyContext(vmesa->glCtx); _swrast_DestroyContext(vmesa->glCtx); - viaFreeVB(vmesa->glCtx); - FreeBuffer(vmesa); /* free the Mesa context */ _mesa_destroy_context(vmesa->glCtx); - vmesa->glCtx->DriverCtx = NULL; - FREE(vmesa); - } - - P_M_R; + /* release our data */ + FreeBuffer(vmesa); + + assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_AGP])); + assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_VIDEO])); + assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_SYSTEM])); + assert (is_empty_list(&vmesa->freed_tex_buffers)); + + driDestroyOptionCache(&vmesa->optionCache); -#ifdef PERFORMANCE_MEASURE - if (VIA_PERFORMANCE) fprintf(stderr, "idle = %d\n", idle); - if (VIA_PERFORMANCE) fprintf(stderr, "busy = %d\n", busy); -#endif - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); + FREE(vmesa); + } } -void viaXMesaSetFrontClipRects(viaContextPtr vmesa) + +void viaXMesaWindowMoved(struct via_context *vmesa) { - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; + __DRIdrawablePrivate *const drawable = vmesa->driDrawable; + __DRIdrawablePrivate *const readable = vmesa->driReadable; + struct via_renderbuffer *const draw_buffer = + (struct via_renderbuffer *) drawable->driverPrivate; + struct via_renderbuffer *const read_buffer = + (struct via_renderbuffer *) readable->driverPrivate; + GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3; + + if (!drawable) + return; + + switch (vmesa->glCtx->DrawBuffer->_ColorDrawBufferMask[0]) { + case BUFFER_BIT_BACK_LEFT: + if (drawable->numBackClipRects == 0) { + vmesa->numClipRects = drawable->numClipRects; + vmesa->pClipRects = drawable->pClipRects; + } + else { + vmesa->numClipRects = drawable->numBackClipRects; + vmesa->pClipRects = drawable->pBackClipRects; + } + break; + case BUFFER_BIT_FRONT_LEFT: + vmesa->numClipRects = drawable->numClipRects; + vmesa->pClipRects = drawable->pClipRects; + break; + default: + vmesa->numClipRects = 0; + break; + } - vmesa->numClipRects = dPriv->numClipRects; - vmesa->pClipRects = dPriv->pClipRects; - vmesa->drawX = dPriv->x; - vmesa->drawY = dPriv->y; - vmesa->drawW = dPriv->w; - vmesa->drawH = dPriv->h; + if ((draw_buffer->drawW != drawable->w) + || (draw_buffer->drawH != drawable->h)) { + calculate_buffer_parameters(vmesa, vmesa->glCtx->DrawBuffer, + drawable); + } - viaEmitDrawingRectangle(vmesa); - vmesa->uploadCliprects = GL_TRUE; -} + draw_buffer->drawXoff = (GLuint)(((drawable->x * bytePerPixel) & 0x1f) / + bytePerPixel); + draw_buffer->drawX = drawable->x - draw_buffer->drawXoff; + draw_buffer->drawY = drawable->y; + draw_buffer->drawW = drawable->w; + draw_buffer->drawH = drawable->h; + + if (drawable != readable) { + if ((read_buffer->drawW != readable->w) + || (read_buffer->drawH != readable->h)) { + calculate_buffer_parameters(vmesa, vmesa->glCtx->ReadBuffer, + readable); + } + + read_buffer->drawXoff = (GLuint)(((readable->x * bytePerPixel) & 0x1f) / + bytePerPixel); + read_buffer->drawX = readable->x - read_buffer->drawXoff; + read_buffer->drawY = readable->y; + read_buffer->drawW = readable->w; + read_buffer->drawH = readable->h; + } -void viaXMesaSetBackClipRects(viaContextPtr vmesa) -{ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; - /*=* John Sheng [2003.6.9] fix glxgears dirty screen */ - /*if (vmesa->saam) {*/ - vmesa->numClipRects = dPriv->numClipRects; - vmesa->pClipRects = dPriv->pClipRects; - vmesa->drawX = dPriv->x; - vmesa->drawY = dPriv->y; - vmesa->drawW = dPriv->w; - vmesa->drawH = dPriv->h; - /*} - else { - if (dPriv->numBackClipRects == 0) { - vmesa->numClipRects = dPriv->numClipRects; - vmesa->pClipRects = dPriv->pClipRects; - vmesa->drawX = dPriv->x; - vmesa->drawY = dPriv->y; - vmesa->drawW = dPriv->w; - vmesa->drawH = dPriv->h; - } - else { - vmesa->numClipRects = dPriv->numBackClipRects; - vmesa->pClipRects = dPriv->pBackClipRects; - vmesa->drawX = dPriv->backX; - vmesa->drawY = dPriv->backY; - vmesa->drawW = dPriv->w; - vmesa->drawH = dPriv->h; - } - }*/ - viaEmitDrawingRectangle(vmesa); - vmesa->uploadCliprects = GL_TRUE; -} + vmesa->front.orig = (vmesa->front.offset + + draw_buffer->drawY * vmesa->front.pitch + + draw_buffer->drawX * bytePerPixel); -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: - viaXMesaSetFrontClipRects(vmesa); - break; - case __GL_BACK_BUFFER_MASK: - viaXMesaSetBackClipRects(vmesa); - break; - default: - break; - } + vmesa->front.origMap = (vmesa->front.map + + draw_buffer->drawY * vmesa->front.pitch + + draw_buffer->drawX * bytePerPixel); -#ifndef USE_XINERAMA - vmesa->viaScreen->fbOffset = 0; - vmesa->saam &= ~S1; - vmesa->saam |= S0; -#else - side = vmesa->saam & P_MASK; - - switch (side) { - case RightOf: - /* full in screen 1 */ - if (vmesa->drawX >= vmesa->xsi[0].width) { - vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize; - vmesa->drawX = vmesa->drawX - vmesa->xsi[1].width; - vmesa->numClipRects = dPriv->numBackClipRects; - vmesa->pClipRects = dPriv->pBackClipRects; - vmesa->drawX = dPriv->backX; - vmesa->drawY = dPriv->backY; - vmesa->saam &= ~S0; - vmesa->saam |= S1; - } - /* full in screen 0 */ - else if ((vmesa->drawX + vmesa->drawW) <= vmesa->xsi[0].width) { - vmesa->viaScreen->fbOffset = 0; - vmesa->saam &= ~S1; - vmesa->saam |= S0; - } - /* between screen 0 && screen 1 */ - else { - vmesa->numSaamRects = dPriv->numBackClipRects; - vmesa->pSaamRects = dPriv->pBackClipRects; - vmesa->drawXSaam = dPriv->backX; - vmesa->drawYSaam = dPriv->backY; - vmesa->viaScreen->fbOffset = 0; - vmesa->saam |= S0; - vmesa->saam |= S1; - } - break; - case LeftOf: - /* full in screen 1 */ - if (vmesa->drawX + vmesa->drawW <= 0) { - vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize; - vmesa->drawX = vmesa->drawX + vmesa->xsi[1].width; - vmesa->numClipRects = dPriv->numBackClipRects; - vmesa->pClipRects = dPriv->pBackClipRects; - vmesa->drawX = dPriv->backX; - vmesa->drawY = dPriv->backY; - vmesa->saam &= ~S0; - vmesa->saam |= S1; - } - /* full in screen 0 */ - else if (vmesa->drawX >= 0) { - vmesa->viaScreen->fbOffset = 0; - vmesa->saam &= ~S1; - vmesa->saam |= S0; - } - /* between screen 0 && screen 1 */ - else { - vmesa->numSaamRects = dPriv->numBackClipRects; - vmesa->pSaamRects = dPriv->pBackClipRects; - vmesa->drawXSaam = dPriv->backX; - vmesa->drawYSaam = dPriv->backY; - vmesa->viaScreen->fbOffset = 0; - vmesa->saam |= S0; - vmesa->saam |= S1; - } - break; - case Down : - /* full in screen 1 */ - if (vmesa->drawY >= vmesa->xsi[0].height) { - vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize; - vmesa->drawY = vmesa->drawY - vmesa->xsi[1].height; - vmesa->numClipRects = dPriv->numBackClipRects; - vmesa->pClipRects = dPriv->pBackClipRects; - vmesa->drawX = dPriv->backX; - vmesa->drawY = dPriv->backY; - vmesa->saam &= ~S0; - vmesa->saam |= S1; - } - /* full in screen 0 */ - else if ((vmesa->drawY + vmesa->drawH) <= vmesa->xsi[0].height) { - vmesa->viaScreen->fbOffset = 0; - vmesa->saam &= ~S1; - vmesa->saam |= S0; - } - /* between screen 0 && screen 1 */ - else { - vmesa->numSaamRects = dPriv->numBackClipRects; - vmesa->pSaamRects = dPriv->pBackClipRects; - vmesa->drawXSaam = dPriv->backX; - vmesa->drawYSaam = dPriv->backY; - vmesa->viaScreen->fbOffset = 0; - vmesa->saam |= S0; - vmesa->saam |= S1; - } - break; - case Up : - /* full in screen 1 */ - if ((vmesa->drawY + vmesa->drawH) <= 0) { - vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize; - vmesa->drawY = vmesa->drawY + vmesa->xsi[1].height; - vmesa->numClipRects = dPriv->numBackClipRects; - vmesa->pClipRects = dPriv->pBackClipRects; - vmesa->drawX = dPriv->backX; - vmesa->drawY = dPriv->backY; - vmesa->saam &= ~S0; - vmesa->saam |= S1; - } - /* full in screen 0 */ - else if (vmesa->drawY >= 0) { - vmesa->viaScreen->fbOffset = 0; - vmesa->saam &= ~S1; - vmesa->saam |= S0; - } - /* between screen 0 && screen 1 */ - else { - vmesa->numSaamRects = dPriv->numBackClipRects; - vmesa->pSaamRects = dPriv->pBackClipRects; - vmesa->drawXSaam = dPriv->backX; - vmesa->drawYSaam = dPriv->backY; - vmesa->viaScreen->fbOffset = 0; - vmesa->saam |= S0; - vmesa->saam |= S1; - } - break; - default: - vmesa->viaScreen->fbOffset = 0; - } -#endif - - { - GLuint pitch, offset; - pitch = vmesa->front.pitch; - offset = vmesa->viaScreen->fbOffset + (vmesa->drawY * pitch + vmesa->drawX * bytePerPixel); - vmesa->drawXoff = (GLuint)((offset & 0x1f) / bytePerPixel); - if (vmesa->saam) { - if (vmesa->pSaamRects) { - offset = vmesa->viaScreen->fbOffset + (vmesa->pSaamRects[0].y1 * pitch + - vmesa->pSaamRects[0].x1 * bytePerPixel); - vmesa->drawXoffSaam = (GLuint)((offset & 0x1f) / bytePerPixel); - } - else - vmesa->drawXoffSaam = 0; - } - else - vmesa->drawXoffSaam = 0; - } - - viaCalcViewport(vmesa->glCtx); + vmesa->back.orig = vmesa->back.offset; + vmesa->depth.orig = vmesa->depth.offset; + vmesa->back.origMap = vmesa->back.map; + vmesa->depth.origMap = vmesa->depth.map; + + viaCalcViewport(vmesa->glCtx); } GLboolean viaUnbindContext(__DRIcontextPrivate *driContextPriv) { - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); return GL_TRUE; } @@ -916,133 +815,121 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv, __DRIdrawablePrivate *driDrawPriv, __DRIdrawablePrivate *driReadPriv) { - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - - if (VIA_DEBUG) { - fprintf(stderr, "driContextPriv = %08x\n", (GLuint)driContextPriv); - fprintf(stderr, "driContextPriv = %08x\n", (GLuint)driDrawPriv); - fprintf(stderr, "driContextPriv = %08x\n", (GLuint)driReadPriv); + if (VIA_DEBUG & DEBUG_DRI) { + fprintf(stderr, "driContextPriv = %016lx\n", (unsigned long)driContextPriv); + fprintf(stderr, "driDrawPriv = %016lx\n", (unsigned long)driDrawPriv); + fprintf(stderr, "driReadPriv = %016lx\n", (unsigned long)driReadPriv); } if (driContextPriv) { - viaContextPtr vmesa = (viaContextPtr)driContextPriv->driverPrivate; - - current_mesa = vmesa; + struct via_context *vmesa = + (struct via_context *)driContextPriv->driverPrivate; + GLcontext *ctx = vmesa->glCtx; + struct gl_framebuffer *drawBuffer, *readBuffer; - if (VIA_DEBUG) fprintf(stderr, "viaMakeCurrent: w = %d\n", vmesa->driDrawable->w); + drawBuffer = (GLframebuffer *)driDrawPriv->driverPrivate; + readBuffer = (GLframebuffer *)driReadPriv->driverPrivate; - if ( vmesa->driDrawable != driDrawPriv ) { - driDrawableInitVBlank( driDrawPriv, vmesa->vblank_flags ); - vmesa->driDrawable = driDrawPriv; - if ( ! calculate_buffer_parameters( vmesa ) ) { - return GL_FALSE; - } + if (vmesa->driDrawable != driDrawPriv) { + driDrawableInitVBlank(driDrawPriv, vmesa->vblank_flags, + &vmesa->vbl_seq); } - _mesa_make_current2(vmesa->glCtx, - (GLframebuffer *)driDrawPriv->driverPrivate, - (GLframebuffer *)driReadPriv->driverPrivate); - if (VIA_DEBUG) fprintf(stderr, "Context %d MakeCurrent\n", vmesa->hHWContext); + if ((vmesa->driDrawable != driDrawPriv) + || (vmesa->driReadable != driReadPriv)) { + vmesa->driDrawable = driDrawPriv; + vmesa->driReadable = driReadPriv; + + if ((drawBuffer->Width != driDrawPriv->w) + || (drawBuffer->Height != driDrawPriv->h)) { + _mesa_resize_framebuffer(ctx, drawBuffer, + driDrawPriv->w, driDrawPriv->h); + drawBuffer->Initialized = GL_TRUE; + } + + if (!calculate_buffer_parameters(vmesa, drawBuffer, driDrawPriv)) { + return GL_FALSE; + } + + if (driDrawPriv != driReadPriv) { + if ((readBuffer->Width != driReadPriv->w) + || (readBuffer->Height != driReadPriv->h)) { + _mesa_resize_framebuffer(ctx, readBuffer, + driReadPriv->w, driReadPriv->h); + readBuffer->Initialized = GL_TRUE; + } + + if (!calculate_buffer_parameters(vmesa, readBuffer, driReadPriv)) { + return GL_FALSE; + } + } + } + + _mesa_make_current(vmesa->glCtx, drawBuffer, readBuffer); + + ctx->Driver.DrawBuffer( ctx, ctx->Color.DrawBuffer[0] ); + viaXMesaWindowMoved(vmesa); + ctx->Driver.Scissor(vmesa->glCtx, + vmesa->glCtx->Scissor.X, + vmesa->glCtx->Scissor.Y, + vmesa->glCtx->Scissor.Width, + vmesa->glCtx->Scissor.Height); } else { - _mesa_make_current(0,0); + _mesa_make_current(NULL, NULL, NULL); } - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); return GL_TRUE; } -void viaGetLock(viaContextPtr vmesa, GLuint flags) +void viaGetLock(struct via_context *vmesa, GLuint flags) { __DRIdrawablePrivate *dPriv = vmesa->driDrawable; __DRIscreenPrivate *sPriv = vmesa->driScreen; - drm_via_sarea_t *sarea = vmesa->sarea; - int me = vmesa->hHWContext; - __DRIdrawablePrivate *pdp; - __DRIscreenPrivate *psp; - pdp = dPriv; - psp = sPriv; - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - if (VIA_DEBUG) fprintf(stderr, "drmGetLock - in\n"); - drmGetLock(vmesa->driFd, vmesa->hHWContext, flags); - DRI_VALIDATE_DRAWABLE_INFO( sPriv, dPriv ); + drmGetLock(vmesa->driFd, vmesa->hHWContext, flags); - if (sarea->ctxOwner != me) { - vmesa->uploadCliprects = GL_TRUE; - sarea->ctxOwner = me; - vmesa->dirty |= (VIA_UPLOAD_CTX | - VIA_UPLOAD_BUFFERS | - VIA_UPLOAD_TEX0 | - VIA_UPLOAD_TEX1 | - VIA_UPLOAD_CLIPRECTS); + DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv); + if (dPriv != vmesa->driReadable) { + DRI_VALIDATE_DRAWABLE_INFO(sPriv, vmesa->driReadable); } - viaXMesaWindowMoved(vmesa); - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); -} - -#if 0 -void viaLock(viaContextPtr vmesa, GLuint flags) -{ - __DRIdrawablePrivate *dPriv = vmesa->driDrawable; - __DRIscreenPrivate *sPriv = vmesa->driScreen; - - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - - /*=* John Sheng [2003.6.16] for xf43 */ - if(dPriv->pStamp == NULL) - dPriv->pStamp = &dPriv->lastStamp; - - if (*(dPriv->pStamp) != dPriv->lastStamp || vmesa->saam) { - GLuint scrn; - scrn = vmesa->saam & S_MASK; - - DRM_SPINLOCK(&sPriv->pSAREA->drawable_lock, sPriv->drawLockID); - - if (scrn == S1) - __driUtilUpdateDrawableInfo(dPriv); - else - DRI_VALIDATE_DRAWABLE_INFO_ONCE(dPriv); - - viaXMesaWindowMoved(vmesa); - DRM_SPINUNLOCK(&sPriv->pSAREA->drawable_lock, sPriv->drawLockID); + if (vmesa->sarea->ctxOwner != vmesa->hHWContext) { + vmesa->sarea->ctxOwner = vmesa->hHWContext; + vmesa->newEmitState = ~0; } - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); - - return; -} -#endif + if (vmesa->lastStamp != dPriv->lastStamp) { + viaXMesaWindowMoved(vmesa); + driUpdateFramebufferSize(vmesa->glCtx, dPriv); + vmesa->newEmitState = ~0; + vmesa->lastStamp = dPriv->lastStamp; + } -void viaUnLock(viaContextPtr vmesa, GLuint flags) -{ - drm_via_sarea_t *sarea = vmesa->sarea; - int me = vmesa->hHWContext; - - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - if (VIA_DEBUG) fprintf(stderr, "sarea->ctxOwner = %d\n", sarea->ctxOwner); - if (VIA_DEBUG) fprintf(stderr, "me = %d\n", me); - if (sarea->ctxOwner == me) { - sarea->ctxOwner = 0; + if (vmesa->doPageFlip && + vmesa->pfCurrentOffset != vmesa->sarea->pfCurrentOffset) { + fprintf(stderr, "%s - reset pf\n", __FUNCTION__); + viaResetPageFlippingLocked(vmesa); } - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); } + void viaSwapBuffers(__DRIdrawablePrivate *drawablePrivate) { __DRIdrawablePrivate *dPriv = (__DRIdrawablePrivate *)drawablePrivate; - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) { - viaContextPtr vmesa; - GLcontext *ctx; - - vmesa = (viaContextPtr)dPriv->driContextPriv->driverPrivate; - ctx = vmesa->glCtx; + + if (dPriv && + dPriv->driContextPriv && + dPriv->driContextPriv->driverPrivate) { + struct via_context *vmesa = + (struct via_context *)dPriv->driContextPriv->driverPrivate; + GLcontext *ctx = vmesa->glCtx; + + _mesa_notifySwapBuffers(ctx); + if (ctx->Visual.doubleBufferMode) { - _mesa_notifySwapBuffers(ctx); if (vmesa->doPageFlip) { viaPageFlip(dPriv); } @@ -1051,10 +938,9 @@ viaSwapBuffers(__DRIdrawablePrivate *drawablePrivate) } } else - VIA_FIREVERTICES(vmesa); + VIA_FLUSH_DMA(vmesa); } else { _mesa_problem(NULL, "viaSwapBuffers: drawable has no context!\n"); } - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); }