// 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; }
// 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; }
// 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; }
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(); }