示例#1
0
文件: disp.cpp 项目: Plombo/dega
// Create the buffer surface
static int MakeBufferSurface()
{
  int Ret=0;
  int UseSys=0;
  DDSURFACEDESC ddsd;
  UseSys=AutodetectUseSys(pDD);
  DispBuff=NULL;
  memset(&ddsd,0,sizeof(ddsd));
  ddsd.dwSize=sizeof(ddsd);
  ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
  ddsd.dwWidth=ScrnWidth;
  ddsd.dwHeight=ScrnHeight;
TryAgain:
  ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
  if (UseSys) ddsd.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY;
  else         ddsd.ddsCaps.dwCaps|=DDSCAPS_VIDEOMEMORY;
  Ret=pDD->CreateSurface(&ddsd,&DispBuff,NULL);
  if (Ret<0 && UseSys!=1) { UseSys=1; goto TryAgain; } // Try again in system memory
  if (Ret<0) return 1; if (DispBuff==NULL) return 1; 

  // Find out the color depth
  GetSurfaceFormat(DispBuff,&DispFormat,&DispBpp);

  // Clear it
  SurfaceClear(DispBuff,0);
  return 0;
}
示例#2
0
文件: disp.cpp 项目: Plombo/dega
// Create the primary surface
static int MakePrimarySurface()
{
  int Ret=0; unsigned int PrimFormat=0; int PrimBpp=0;
  DDSURFACEDESC ddsd;
  DispPrim=NULL;
  memset(&ddsd,0,sizeof(ddsd));
  ddsd.dwSize=sizeof(ddsd);
  ddsd.dwFlags=DDSD_CAPS;
  ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
  Ret=pDD->CreateSurface(&ddsd,&DispPrim,NULL);
  if (Ret<0) return 1; if (DispPrim==NULL) return 1; 

  // Find out the color to use to paint the overlay
  GetSurfaceFormat(DispPrim,&PrimFormat,&PrimBpp);
  switch (PrimFormat)
  {
    default: OverlayColor=0; break;
    case 15: OverlayColor=0x0401; break;
    case 16: OverlayColor=0x0801; break;
    case 24: case 32: OverlayColor=0x080008; break;
  }

  // Create a clipper
  Ret=DirectDrawCreateClipper(0,&pClipper,NULL);
  if (Ret==DD_OK)
  {
    Ret=pClipper->SetHWnd(0,hFrameWnd);
    if (Ret==DD_OK) DispPrim->SetClipper(pClipper);
  }

  return 0;
}
示例#3
0
文件: disp.cpp 项目: Plombo/dega
// Create an Overlay surface
static int MakeOverlaySurface()
{
  static DDPIXELFORMAT PixelFormat[4]=
  {
    {sizeof(DDPIXELFORMAT),DDPF_RGB,0,16,0x7c00,0x03e0,0x001f,0},
    {sizeof(DDPIXELFORMAT),DDPF_RGB,0,16,0xf800,0x07e0,0x001f,0},
    {sizeof(DDPIXELFORMAT),DDPF_FOURCC,MAKEFOURCC('U','Y','V','Y'),0,0,0,0,0},
    {sizeof(DDPIXELFORMAT),DDPF_FOURCC,MAKEFOURCC('Y','U','Y','2'),0,0,0,0,0}
  };
  int Ret=0,Type=0;
  DDSURFACEDESC ddsd;

  memset(&ddsd,0,sizeof(ddsd));
  ddsd.dwSize=sizeof(ddsd);
  ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_BACKBUFFERCOUNT;
  ddsd.ddsCaps.dwCaps=DDSCAPS_OVERLAY|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
  ddsd.dwWidth=ScrnWidth;
  ddsd.dwHeight=ScrnHeight;
  ddsd.dwBackBufferCount=2;

  // Try several pixelformats
  DispOver=NULL;
  Type=2; // Try YUV overlays
  if (TryOverlay==2) Type=0; // Try RGB overlays too
  for (;Type<4;Type++)
  {
    ddsd.ddpfPixelFormat=PixelFormat[Type];
    Ret=pDD->CreateSurface(&ddsd,&DispOver,NULL);
    if (Ret<0) DispOver=NULL;
    if (DispOver!=NULL) break;
  }
 
  if (DispOver==NULL) return 1;

  // Get the back buffer
  memset(&ddsd.ddsCaps,0,sizeof(ddsd.ddsCaps));
  ddsd.ddsCaps.dwCaps=DDSCAPS_BACKBUFFER; 
  DispBack=NULL; DispOver->GetAttachedSurface(&ddsd.ddsCaps,&DispBack);

  // Find out the color depth
  GetSurfaceFormat(DispOver,&DispFormat,&DispBpp);

  // Clear it
  SurfaceClear(DispOver,0);

  // Show and size it
  memset(&LastOver,0,sizeof(LastOver));
  OverlayPut();
  return 0;
}
示例#4
0
static void r700SetupVTXConstants(GLcontext  * ctx,
				  void *       pAos,
				  StreamDesc * pStreamDesc)
{
    context_t *context = R700_CONTEXT(ctx);
    struct radeon_aos * paos = (struct radeon_aos *)pAos;
    unsigned int nVBsize;
    BATCH_LOCALS(&context->radeon);

    unsigned int uSQ_VTX_CONSTANT_WORD0_0;
    unsigned int uSQ_VTX_CONSTANT_WORD1_0;
    unsigned int uSQ_VTX_CONSTANT_WORD2_0 = 0;
    unsigned int uSQ_VTX_CONSTANT_WORD3_0 = 0;
    unsigned int uSQ_VTX_CONSTANT_WORD6_0 = 0;

    if (!paos->bo)
	    return;

    if ((context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV610) ||
	(context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV620) ||
	(context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RS780) ||
	(context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RS880) ||
	(context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV710))
	    r700SyncSurf(context, paos->bo, RADEON_GEM_DOMAIN_GTT, 0, TC_ACTION_ENA_bit);
    else
	    r700SyncSurf(context, paos->bo, RADEON_GEM_DOMAIN_GTT, 0, VC_ACTION_ENA_bit);

    if(0 == pStreamDesc->stride)
    {
        nVBsize = paos->count * pStreamDesc->size * getTypeSize(pStreamDesc->type);
    }
    else
    {
        nVBsize = (paos->count - 1) * pStreamDesc->stride
                  + pStreamDesc->size * getTypeSize(pStreamDesc->type);
    }

    uSQ_VTX_CONSTANT_WORD0_0 = paos->offset;
    uSQ_VTX_CONSTANT_WORD1_0 = nVBsize - 1;

    SETfield(uSQ_VTX_CONSTANT_WORD2_0, 0, BASE_ADDRESS_HI_shift, BASE_ADDRESS_HI_mask); /* TODO */
    SETfield(uSQ_VTX_CONSTANT_WORD2_0, pStreamDesc->stride, SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift,
	     SQ_VTX_CONSTANT_WORD2_0__STRIDE_mask);
    SETfield(uSQ_VTX_CONSTANT_WORD2_0, GetSurfaceFormat(pStreamDesc->type, pStreamDesc->size, NULL),
	     SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift,
	     SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_mask); /* TODO : trace back api for initial data type, not only GL_FLOAT */
    
    if(GL_TRUE == pStreamDesc->normalize)
    {
        SETfield(uSQ_VTX_CONSTANT_WORD2_0, SQ_NUM_FORMAT_NORM,
	             SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift, SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_mask);
    }
    else
    {
        SETfield(uSQ_VTX_CONSTANT_WORD2_0, SQ_NUM_FORMAT_SCALED,
	             SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift, SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_mask);
    }

    if(1 == pStreamDesc->_signed)
    {
        SETbit(uSQ_VTX_CONSTANT_WORD2_0, SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit);
    }

    SETfield(uSQ_VTX_CONSTANT_WORD3_0, 1, MEM_REQUEST_SIZE_shift, MEM_REQUEST_SIZE_mask);
    SETfield(uSQ_VTX_CONSTANT_WORD6_0, SQ_TEX_VTX_VALID_BUFFER,
	     SQ_TEX_RESOURCE_WORD6_0__TYPE_shift, SQ_TEX_RESOURCE_WORD6_0__TYPE_mask);

    BEGIN_BATCH_NO_AUTOSTATE(9 + 2);

    R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
    R600_OUT_BATCH((pStreamDesc->element + SQ_FETCH_RESOURCE_VS_OFFSET) * FETCH_RESOURCE_STRIDE);
    R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD0_0);
    R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD1_0);
    R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD2_0);
    R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD3_0);
    R600_OUT_BATCH(0);
    R600_OUT_BATCH(0);
    R600_OUT_BATCH(uSQ_VTX_CONSTANT_WORD6_0);
    R600_OUT_BATCH_RELOC(uSQ_VTX_CONSTANT_WORD0_0,
                         paos->bo,
                         uSQ_VTX_CONSTANT_WORD0_0,
                         RADEON_GEM_DOMAIN_GTT, 0, 0);
    END_BATCH();
    COMMIT_BATCH();

}