Example #1
0
static void
sisAllocTexImage( sisContextPtr smesa, sisTexObjPtr t, int level,
		  const struct gl_texture_image *image )
{
   char *addr;
   int size, texel_size;

   if (t->format == 0) {
      t->format = image->Format;
      switch (t->format)
      {
      case GL_RGBA:
         t->hwformat = TEXEL_ARGB_8888_32;
         break;
      case GL_INTENSITY:
         t->hwformat = TEXEL_I8;
         break;
      case GL_ALPHA:
         t->hwformat = TEXEL_A8;
         break;
      case GL_LUMINANCE:
         t->hwformat = TEXEL_L8;
         break;
      case GL_LUMINANCE_ALPHA:
         t->hwformat = TEXEL_AL88;
         break;
      case GL_RGB:
         t->hwformat = TEXEL_ARGB_0888_32;
         break;
      default:
         sis_fatal_error("Bad texture format.\n");
      }
   }
   assert(t->format == image->Format);

   texel_size = image->TexFormat->TexelBytes;
   size = image->Width * image->Height * texel_size + TEXTURE_HW_PLUS;

   addr = sisAllocFB( smesa, size, &t->image[level].handle );
   if (addr == NULL) {
      addr = sisAllocAGP( smesa, size, &t->image[level].handle );
      if (addr == NULL)
         sis_fatal_error("Failure to allocate texture memory.\n");
      t->image[level].memType = AGP_TYPE;
   }
   else
      t->image[level].memType = VIDEO_TYPE;
   
   t->image[level].Data = ALIGN(addr, TEXTURE_HW_ALIGNMENT);
   t->image[level].pitch = image->Width * texel_size;
   t->image[level].size = image->Width * image->Height * texel_size;
   t->numImages++;
}
Example #2
0
void
sisAllocZStencilBuffer( sisContextPtr smesa )
{
   GLuint z_depth;
   GLuint totalBytes;
   int width2;

   GLubyte *addr;

   z_depth = ( smesa->glCtx->Visual.depthBits +
               smesa->glCtx->Visual.stencilBits ) / 8;

   width2 = ALIGNMENT( smesa->width * z_depth, 4 );

   totalBytes = smesa->height * width2 + Z_BUFFER_HW_PLUS;

   addr = sisAllocFB( smesa, totalBytes, &smesa->zbFree );
   if (addr == NULL)
      sis_fatal_error("Failure to allocate Z buffer.\n");

   if (SIS_VERBOSE & VERBOSE_SIS_BUFFER) {
      fprintf(stderr, "sis_alloc_z_stencil_buffer: addr=%p\n", addr);
   }

   addr = (GLubyte *)ALIGNMENT( (unsigned long)addr, Z_BUFFER_HW_ALIGNMENT );

   smesa->depthbuffer = (void *) addr;
   smesa->depthPitch = width2;
   smesa->depthOffset = (unsigned long)addr - (unsigned long)smesa->FbBase;

   /* set pZClearPacket */
   memset( &smesa->zClearPacket, 0, sizeof(ENGPACKET) );

   smesa->zClearPacket.dwSrcPitch = (z_depth == 2) ? 0x80000000 : 0xf0000000;
   smesa->zClearPacket.dwDestBaseAddr = (unsigned long)(addr -
      (unsigned long)smesa->FbBase);
   smesa->zClearPacket.wDestPitch = width2;
   smesa->zClearPacket.stdwDestPos.wY = 0;
   smesa->zClearPacket.stdwDestPos.wX = 0;

   smesa->zClearPacket.wDestHeight = smesa->virtualY;
   smesa->zClearPacket.stdwDim.wWidth = (GLshort)width2 / z_depth;
   smesa->zClearPacket.stdwDim.wHeight = (GLshort)smesa->height;
   smesa->zClearPacket.stdwCmd.cRop = 0xf0;

   if (smesa->blockWrite)
      smesa->zClearPacket.stdwCmd.cCmd0 = CMD0_PAT_FG_COLOR;
   else
      smesa->zClearPacket.stdwCmd.cCmd0 = 0;
   smesa->zClearPacket.stdwCmd.cCmd1 = CMD1_DIR_X_INC | CMD1_DIR_Y_INC;
}
Example #3
0
void
sisAllocBackbuffer( sisContextPtr smesa )
{
   GLuint depth = smesa->bytesPerPixel;
   GLuint size, width2;

   char *addr;

   width2 = (depth == 2) ? ALIGNMENT (smesa->width, 2) : smesa->width;
   size = width2 * smesa->height * depth + DRAW_BUFFER_HW_PLUS;

   /* Fixme: unique context alloc/free back-buffer? */
   addr = sisAllocFB( smesa, size, &smesa->bbFree );
   if (addr == NULL)
      sis_fatal_error("Failure to allocate back buffer.\n");

   addr = (char *)ALIGNMENT( (unsigned long)addr, DRAW_BUFFER_HW_ALIGNMENT );

   smesa->backbuffer = addr;
   smesa->backOffset = (unsigned long)(addr - (unsigned long)smesa->FbBase);
   smesa->backPitch = width2 * depth;

   memset ( &smesa->cbClearPacket, 0, sizeof(ENGPACKET) );

   smesa->cbClearPacket.dwSrcPitch = (depth == 2) ? 0x80000000 : 0xf0000000;
   smesa->cbClearPacket.dwDestBaseAddr = smesa->backOffset;
   smesa->cbClearPacket.wDestPitch = smesa->backPitch;
   smesa->cbClearPacket.stdwDestPos.wY = 0;
   smesa->cbClearPacket.stdwDestPos.wX = 0;

   smesa->cbClearPacket.wDestHeight = smesa->virtualY;
   smesa->cbClearPacket.stdwDim.wWidth = (GLshort) width2;
   smesa->cbClearPacket.stdwDim.wHeight = (GLshort) smesa->height;
   smesa->cbClearPacket.stdwCmd.cRop = 0xf0;

   if (smesa->blockWrite)
      smesa->cbClearPacket.stdwCmd.cCmd0 = (GLbyte)(CMD0_PAT_FG_COLOR);
   else
      smesa->cbClearPacket.stdwCmd.cCmd0 = 0;
   smesa->cbClearPacket.stdwCmd.cCmd1 = CMD1_DIR_X_INC | CMD1_DIR_Y_INC;
}
/* Handle texenv stuff, called from validate_texture (renderstart) */
static void
sis_set_texture_env0( struct gl_context *ctx, struct gl_texture_object *texObj,
   int unit )
{
   sisContextPtr smesa = SIS_CONTEXT(ctx);
   GLubyte c[4];

   __GLSiSHardware *prev = &smesa->prev;
   __GLSiSHardware *current = &smesa->current;

   struct gl_texture_unit *texture_unit = &ctx->Texture.Unit[unit];

   sisTexObjPtr t = texObj->DriverData;

   switch (texture_unit->EnvMode)
   {
   case GL_REPLACE:
      switch (t->format)
      {
      case GL_ALPHA:
         current->hwTexBlendColor0 = STAGE0_C_CF;
         current->hwTexBlendAlpha0 = STAGE0_A_AS;
         break;
      case GL_LUMINANCE:
      case GL_RGB:
      case GL_YCBCR_MESA:
         current->hwTexBlendColor0 = STAGE0_C_CS;
         current->hwTexBlendAlpha0 = STAGE0_A_AF;
         break;
      case GL_INTENSITY:
      case GL_LUMINANCE_ALPHA:
      case GL_RGBA:
         current->hwTexBlendColor0 = STAGE0_C_CS;
         current->hwTexBlendAlpha0 = STAGE0_A_AS;
         break;
      default:
	 sis_fatal_error("unknown base format 0x%x\n", t->format);
      }
      break;

   case GL_MODULATE:
      switch (t->format)
      {
      case GL_ALPHA:
         current->hwTexBlendColor0 = STAGE0_C_CF;
         current->hwTexBlendAlpha0 = STAGE0_A_AFAS;
         break;
      case GL_LUMINANCE:
      case GL_RGB:
      case GL_YCBCR_MESA:
         current->hwTexBlendColor0 = STAGE0_C_CFCS;
         current->hwTexBlendAlpha0 = STAGE0_A_AF;
         break;
      case GL_INTENSITY:
      case GL_LUMINANCE_ALPHA:
      case GL_RGBA:
         current->hwTexBlendColor0 = STAGE0_C_CFCS;
         current->hwTexBlendAlpha0 = STAGE0_A_AFAS;
         break;
      default:
	 sis_fatal_error("unknown base format 0x%x\n", t->format);
      }
      break;

   case GL_DECAL:
      switch (t->format)
      {
      case GL_RGB:
      case GL_YCBCR_MESA:
         current->hwTexBlendColor0 = STAGE0_C_CS;
         current->hwTexBlendAlpha0 = STAGE0_A_AF;
         break;
      case GL_RGBA:
         current->hwTexBlendColor0 = STAGE0_C_CFOMAS_CSAS;
         current->hwTexBlendAlpha0 = STAGE0_A_AF;
         break;
      case GL_ALPHA:
      case GL_LUMINANCE:
      case GL_INTENSITY:
      case GL_LUMINANCE_ALPHA:
         current->hwTexBlendColor0 = STAGE0_C_CF;
         current->hwTexBlendAlpha0 = STAGE0_A_AF;
         break;
      default:
	 sis_fatal_error("unknown base format 0x%x\n", t->format);
      }
      break;

   case GL_BLEND:
      UNCLAMPED_FLOAT_TO_RGBA_CHAN(c, texture_unit->EnvColor);
      current->hwTexEnvColor = ((GLint) (c[3])) << 24 |
			       ((GLint) (c[0])) << 16 |
			       ((GLint) (c[1])) << 8 |
			       ((GLint) (c[2]));
      switch (t->format)
      {
      case GL_ALPHA:
         current->hwTexBlendColor0 = STAGE0_C_CF;
         current->hwTexBlendAlpha0 = STAGE0_A_AFAS;
         break;
      case GL_LUMINANCE:
      case GL_RGB:
      case GL_YCBCR_MESA:
         current->hwTexBlendColor0 = STAGE0_C_CFOMCS_CCCS;
         current->hwTexBlendAlpha0 = STAGE0_A_AF;
         break;
      case GL_INTENSITY:
         current->hwTexBlendColor0 = STAGE0_C_CFOMCS_CCCS;
         current->hwTexBlendAlpha0 = STAGE0_A_AFOMAS_ACAS;
         break;
      case GL_LUMINANCE_ALPHA:
      case GL_RGBA:
         current->hwTexBlendColor0 = STAGE0_C_CFOMCS_CCCS;
         current->hwTexBlendAlpha0 = STAGE0_A_AFAS;
         break;
      default:
	 sis_fatal_error("unknown base format 0x%x\n", t->format);
      }
      break;

   default:
      sis_fatal_error("unknown env mode 0x%x\n", texture_unit->EnvMode);
   }

   if ((current->hwTexBlendColor0 != prev->hwTexBlendColor0) ||
       (current->hwTexBlendAlpha0 != prev->hwTexBlendAlpha0) ||
       (current->hwTexEnvColor != prev->hwTexEnvColor))
   {
      prev->hwTexEnvColor = current->hwTexEnvColor;
      prev->hwTexBlendColor0 = current->hwTexBlendColor0;
      prev->hwTexBlendAlpha0 = current->hwTexBlendAlpha0;
      smesa->GlobalFlag |= GFLAG_TEXTUREENV;
   }
}
Example #5
0
static void
sisAllocTexImage( sisContextPtr smesa, sisTexObjPtr t, int level,
                  const struct gl_texture_image *image )
{
    char *addr;
    int size, texel_size;

    if (t->format == 0) {
        t->format = image->_BaseFormat;
        switch (image->TexFormat)
        {
        case MESA_FORMAT_ARGB8888:
            t->hwformat = TEXEL_ARGB_8888_32;
            break;
        case MESA_FORMAT_ARGB4444:
            t->hwformat = TEXEL_ARGB_4444_16;
            break;
        case MESA_FORMAT_ARGB1555:
            t->hwformat = TEXEL_ARGB_1555_16;
            break;
        case MESA_FORMAT_RGB565:
            t->hwformat = TEXEL_RGB_565_16;
            break;
        case MESA_FORMAT_RGB332:
            t->hwformat = TEXEL_RGB_332_8;
            break;
        case MESA_FORMAT_I8:
            t->hwformat = TEXEL_I8;
            break;
        case MESA_FORMAT_A8:
            t->hwformat = TEXEL_A8;
            break;
        case MESA_FORMAT_L8:
            t->hwformat = TEXEL_L8;
            break;
        case MESA_FORMAT_AL88:
            t->hwformat = TEXEL_AL88;
            break;
        case MESA_FORMAT_YCBCR:
            t->hwformat = TEXEL_YUV422;
            break;
        case MESA_FORMAT_YCBCR_REV:
            t->hwformat = TEXEL_VUY422;
            break;
        default:
            sis_fatal_error("Bad texture format 0x%x.\n", image->TexFormat);
        }
    }
    assert(t->format == image->_BaseFormat);

    texel_size = _mesa_get_format_bytes(image->TexFormat);
    size = image->Width * image->Height * texel_size + TEXTURE_HW_PLUS;

    addr = sisAllocFB( smesa, size, &t->image[level].handle );
    if (addr == NULL) {
        addr = sisAllocAGP( smesa, size, &t->image[level].handle );
        if (addr == NULL)
            sis_fatal_error("Failure to allocate texture memory.\n");
        t->image[level].memType = AGP_TYPE;
    }
    else
        t->image[level].memType = VIDEO_TYPE;

    t->image[level].Data = ALIGN(addr, TEXTURE_HW_ALIGNMENT);
    t->image[level].pitch = image->Width * texel_size;
    t->image[level].size = image->Width * image->Height * texel_size;
    t->numImages++;
}
GLboolean
sisCreateContext( const __GLcontextModes *glVisual,
		  __DRIcontextPrivate *driContextPriv,
                  void *sharedContextPrivate )
{
   GLcontext *ctx, *shareCtx;
   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
   sisContextPtr smesa;
   sisScreenPtr sisScreen;
   int i;
   struct dd_function_table functions;

   smesa = (sisContextPtr)CALLOC( sizeof(*smesa) );
   if (smesa == NULL)
      return GL_FALSE;

   /* Init default driver functions then plug in our SIS-specific functions
    * (the texture functions are especially important)
    */
   _mesa_init_driver_functions(&functions);
   sisInitDriverFuncs(&functions);
   sisInitTextureFuncs(&functions);

   /* Allocate the Mesa context */
   if (sharedContextPrivate)
      shareCtx = ((sisContextPtr)sharedContextPrivate)->glCtx;
   else 
      shareCtx = NULL;
   smesa->glCtx = _mesa_create_context( glVisual, shareCtx,
                                        &functions, (void *) smesa);
   if (!smesa->glCtx) {
      FREE(smesa);
      return GL_FALSE;
   }
   driContextPriv->driverPrivate = smesa;
   ctx = smesa->glCtx;

   sisScreen = smesa->sisScreen = (sisScreenPtr)(sPriv->private);

   smesa->driContext = driContextPriv;
   smesa->driScreen = sPriv;
   smesa->driDrawable = NULL;
   smesa->hHWContext = driContextPriv->hHWContext;
   smesa->driHwLock = &sPriv->pSAREA->lock;
   smesa->driFd = sPriv->fd;
  
   smesa->virtualX = sisScreen->screenX;
   smesa->virtualY = sisScreen->screenY;
   smesa->bytesPerPixel = sisScreen->cpp;
   smesa->IOBase = sisScreen->mmio.map;
   smesa->Chipset = sisScreen->deviceID;
   smesa->irqEnabled = sisScreen->irqEnabled;

   smesa->FbBase = sPriv->pFB;
   smesa->displayWidth = sPriv->fbWidth;
   smesa->frontPitch = sPriv->fbStride;

   smesa->sarea = (SISSAREAPriv *)((char *)sPriv->pSAREA +
				   sisScreen->sarea_priv_offset);

#if defined(SIS_DUMP)
   IOBase4Debug = GET_IOBase (smesa);
#endif

   /* support ARGB8888 and RGB565 */
   switch (smesa->bytesPerPixel)
   {
   case 4:
      smesa->redMask = 0x00ff0000;
      smesa->greenMask = 0x0000ff00;
      smesa->blueMask = 0x000000ff;
      smesa->alphaMask = 0xff000000;
      smesa->colorFormat = DST_FORMAT_ARGB_8888;
      break;
   case 2:
      smesa->redMask = 0xf800;
      smesa->greenMask = 0x07e0;
      smesa->blueMask = 0x001f;
      smesa->alphaMask = 0;
      smesa->colorFormat = DST_FORMAT_RGB_565;
      break;
   default:
      sis_fatal_error("Bad bytesPerPixel.\n");
   }

   /* Parse configuration files */
   driParseConfigFiles (&smesa->optionCache, &sisScreen->optionCache,
			sisScreen->driScreen->myNum, "sis");

   /* TODO: index mode */

   smesa->CurrentQueueLenPtr = &(smesa->sarea->QueueLength);
   smesa->FrameCountPtr = &(smesa->sarea->FrameCount);

   /* set AGP */
   smesa->AGPSize = sisScreen->agp.size;
   smesa->AGPBase = sisScreen->agp.map;
   smesa->AGPAddr = sisScreen->agp.handle;

   /* Create AGP command buffer */
   if (smesa->AGPSize != 0 && 
      !driQueryOptionb(&smesa->optionCache, "agp_disable"))
   {
      smesa->vb = sisAllocAGP(smesa, 64 * 1024, &smesa->vb_agp_handle);
      if (smesa->vb != NULL) {
	 smesa->using_agp = GL_TRUE;
	 smesa->vb_cur = smesa->vb;
	 smesa->vb_last = smesa->vb;
	 smesa->vb_end = smesa->vb + 64 * 1024;
	 smesa->vb_agp_offset = ((long)smesa->vb - (long)smesa->AGPBase +
	    (long)smesa->AGPAddr);
      }
   }
   if (!smesa->using_agp) {
      smesa->vb = malloc(64 * 1024);
      if (smesa->vb == NULL) {
	 FREE(smesa);
	 return GL_FALSE;
      }
      smesa->vb_cur = smesa->vb;
      smesa->vb_last = smesa->vb;
      smesa->vb_end = smesa->vb + 64 * 1024;
   }

   smesa->GlobalFlag = 0L;

   smesa->Fallback = 0;

   /* Initialize the software rasterizer and helper modules.
    */
   _swrast_CreateContext( ctx );
   _ac_CreateContext( ctx );
   _tnl_CreateContext( ctx );
   _swsetup_CreateContext( ctx );

   _swrast_allow_pixel_fog( ctx, GL_TRUE );
   _swrast_allow_vertex_fog( ctx, GL_FALSE );
   _tnl_allow_pixel_fog( ctx, GL_TRUE );
   _tnl_allow_vertex_fog( ctx, GL_FALSE );

   /* XXX these should really go right after _mesa_init_driver_functions() */
   sisDDInitStateFuncs( ctx );
   sisDDInitState( smesa );	/* Initializes smesa->zFormat, important */
   sisInitTriFuncs( ctx );
   sisDDInitSpanFuncs( ctx );
   sisDDInitStencilFuncs( ctx );

   driInitExtensions( ctx, card_extensions, GL_FALSE );

   /* TODO */
   /* smesa->blockWrite = SGRAMbw = IsBlockWrite (); */
   smesa->blockWrite = GL_FALSE;

   for (i = 0; i < SIS_MAX_TEXTURES; i++) {
      smesa->TexStates[i] = 0;
      smesa->PrevTexFormat[i] = 0;
   }

   return GL_TRUE;
}