📄 gfx_osi_surface.c
字号:
case GFX_SURFACE_CURSOR2BPP_RGB: case GFX_SURFACE_CURSOR2BPP_YCBCR: pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 4; // 4 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_CURSOR_CONTROL_BLOCK_T) + 4*sizeof(STB_OSD_C_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette cursor = 1; break; case GFX_SURFACE_CURSOR2BPPP_RGB: case GFX_SURFACE_CURSOR2BPPP_YCBCR: pSurface->plane[0].uAllocWidth = uWidth/2; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 4; // 4 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_CURSOR_CONTROL_BLOCK_T) + 4*sizeof(STB_OSD_C_PALETTE_T); pSurface->pPalette = (GFX_PALETTE_T *)1; // we have palette cursor = 1; break; case GFX_SURFACE_AYCBCR_422_8888: // A pSurface->plane[2].uAllocWidth = uWidth; pSurface->plane[2].uAllocHeight = uHeight; pSurface->plane[2].uPixelSize = 8; // 8 bits pSurface->plane[2].uPixelJustify = 2; // on 2 pixel boundary pSurface->plane[2].uBytePerLine = uBytePerLine; pSurface->plane[2].a.uNumbits = 8; pSurface->plane[2].r.uNumbits = 0; pSurface->plane[2].g.uNumbits = 0; pSurface->plane[2].b.uNumbits = 0; pSurface->plane[2].a.uOffset = 0; pSurface->plane[2].r.uOffset = 0; pSurface->plane[2].g.uOffset = 0; pSurface->plane[2].b.uOffset = 0; twinheader = 1; // fall through case GFX_SURFACE_YCBCR_422_888: // Y pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 8; // 8 bits pSurface->plane[0].uPixelJustify = 2; // on 2 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 0; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 0; pSurface->plane[0].b.uNumbits = 0; pSurface->plane[0].a.uOffset = 0; pSurface->plane[0].r.uOffset = 0; pSurface->plane[0].g.uOffset = 0; pSurface->plane[0].b.uOffset = 0; // UV pSurface->plane[1].uAllocWidth = uWidth; pSurface->plane[1].uAllocHeight = uHeight; pSurface->plane[1].uPixelSize = 8; // 8 bit for U/V pSurface->plane[1].uPixelJustify = 2; // on 1 pixel boundary pSurface->plane[1].uBytePerLine = uBytePerLine; pSurface->plane[1].a.uNumbits = 0; pSurface->plane[1].r.uNumbits = 0; pSurface->plane[1].g.uNumbits = 8; pSurface->plane[1].b.uNumbits = 8; pSurface->plane[1].a.uOffset = 0; pSurface->plane[1].r.uOffset = 0; pSurface->plane[1].g.uOffset = 0; pSurface->plane[1].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_GI_CONTROL_BLOCK_T); break; case GFX_SURFACE_AYCBCR_420_8888: // A pSurface->plane[2].uAllocWidth = uWidth; pSurface->plane[2].uAllocHeight = uHeight; pSurface->plane[2].uPixelSize = 8; // 8 bits pSurface->plane[2].uPixelJustify = 2; // on 2 pixel boundary pSurface->plane[2].uBytePerLine = uBytePerLine; pSurface->plane[2].a.uNumbits = 0; pSurface->plane[2].r.uNumbits = 0; pSurface->plane[2].g.uNumbits = 0; pSurface->plane[2].b.uNumbits = 0; pSurface->plane[2].a.uOffset = 0; pSurface->plane[2].r.uOffset = 0; pSurface->plane[2].g.uOffset = 0; pSurface->plane[2].b.uOffset = 0; twinheader = 1; // fall through case GFX_SURFACE_YCBCR_420_888: // Y pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 8; // 8 bits pSurface->plane[0].uPixelJustify = 2; // on 2 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 0; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 0; pSurface->plane[0].b.uNumbits = 0; pSurface->plane[0].a.uOffset = 0; pSurface->plane[0].r.uOffset = 0; pSurface->plane[0].g.uOffset = 0; pSurface->plane[0].b.uOffset = 0; // UV pSurface->plane[1].uAllocWidth = uWidth; pSurface->plane[1].uAllocHeight = uHeight/2; pSurface->plane[1].uPixelSize = 8; // 8 bit for U/V bits pSurface->plane[1].uPixelJustify = 2; // on 1 pixel boundary pSurface->plane[1].uBytePerLine = uBytePerLine; pSurface->plane[1].a.uNumbits = 0; pSurface->plane[1].r.uNumbits = 0; pSurface->plane[1].g.uNumbits = 8; pSurface->plane[1].b.uNumbits = 8; pSurface->plane[1].a.uOffset = 0; pSurface->plane[1].r.uOffset = 0; pSurface->plane[1].g.uOffset = 0; pSurface->plane[1].b.uOffset = 0; uHeaderSize = sizeof(STB_OSD_GI_CONTROL_BLOCK_T); break; case GFX_SURFACE_ARGB_8888: pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 32; // 32 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = 0; break; case GFX_SURFACE_RAW8BPP : pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 8; // 8 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = 0; pSurface->pPalette = (GFX_PALETTE_T *)0; // we don't have palette break; case GFX_SURFACE_RAW1BPP : pSurface->plane[0].uAllocWidth = uWidth; pSurface->plane[0].uAllocHeight = uHeight; pSurface->plane[0].uPixelSize = 1; // 1 bits pSurface->plane[0].uPixelJustify = 1; // on 1 pixel boundary pSurface->plane[0].uBytePerLine = uBytePerLine; pSurface->plane[0].a.uNumbits = 8; pSurface->plane[0].r.uNumbits = 8; pSurface->plane[0].g.uNumbits = 8; pSurface->plane[0].b.uNumbits = 8; pSurface->plane[0].a.uOffset = 24; // for palette entry pSurface->plane[0].r.uOffset = 16; pSurface->plane[0].g.uOffset = 8; pSurface->plane[0].b.uOffset = 0; uHeaderSize = 0; pSurface->pPalette = (GFX_PALETTE_T *)0; // we don't have palette break; default: PDEBUG("Invalid plane config 0x%8.8x !\n", uPlaneConfig); return -1; } PDEBUG("uPlaneConfig = %08x \n", uPlaneConfig); PDEBUG("Parameter: numbuf = %d, width=%d, height=%d\n", uNumBuf, uWidth, uHeight); // __os_alloc_physical_heap_walk(); uHeaderSize = ((uHeaderSize + OSD_LINK_ALIGNMENT-1) / OSD_LINK_ALIGNMENT) * OSD_LINK_ALIGNMENT; if(twinheader) { uAllocSize = ((uHeaderSize + OSD_BUFFER_ALIGNMENT-1) / OSD_BUFFER_ALIGNMENT)*2; } else uAllocSize = (uHeaderSize + OSD_BUFFER_ALIGNMENT-1) / OSD_BUFFER_ALIGNMENT; PDEBUG("uHeaderSize = %08x, uAllocSize = %08x\n", uHeaderSize, uAllocSize); for(i=0; i<uNumBuf; i++) { UINT uBufferSize = (pSurface->plane[i].uAllocHeight*pSurface->plane[i].uBytePerLine + OSD_BUFFER_ALIGNMENT-1) / OSD_BUFFER_ALIGNMENT; pSurface->plane[i].uBMLA = uAllocSize * OSD_BUFFER_ALIGNMENT; pSurface->plane[i].uAllocSize = uBufferSize*OSD_BUFFER_ALIGNMENT; PDEBUG("Plane %d BMLA = %08x\n", i, pSurface->plane[i].uBMLA); uAllocSize += uBufferSize; } uAllocSize *= OSD_BUFFER_ALIGNMENT; //PDEBUG("Allocate size = %d bytes\n", uAllocSize); if(__STB_GRAPHICS_MEM_SIZE>0) //we are using a specific graphics memory pool { pSurface->hBuffer = pm_alloc_physical_justify(gpGraphicsPMRoot,uAllocSize, OSD_ADDRESS_ALIGNMENT); PDEBUG("gfx_osi_create_surface: allocated pSurface->hBuffer addr = 0c%8.8x (logical)= 0x%8.8x (physical)=0x%8.8x\n",pSurface->hBuffer,pSurface->hBuffer->pLogical,pSurface->hBuffer->uPhysical); } else { pSurface->hBuffer = os_alloc_physical_justify(uAllocSize, OSD_ADDRESS_ALIGNMENT); } if(NULL == pSurface->hBuffer) { PDEBUG("Failed to alloc %d buffer for new surface!\n", uAllocSize); pSurface->hBuffer = NULL; return -1; } PDEBUG("Buffer allocated = %08x \n", pSurface->hBuffer); if(pSurface->pPalette) // check if we should adjust palette { uNumPal = 1<<pSurface->plane[0].uPixelSize; pSurface->pPalette = MALLOC(uNumPal * sizeof(GFX_PALETTE_T)); if(NULL == pSurface->pPalette) { PDEBUG("Failed to alloc %d buffer for new surface!\n", uNumPal* sizeof(GFX_PALETTE_T)); if(__STB_GRAPHICS_MEM_SIZE>0) //we are using a specific graphics memory pool { pm_free_physical(gpGraphicsPMRoot,pSurface->hBuffer); } else { os_free_physical(pSurface->hBuffer); } pSurface->hBuffer = NULL; return -1; } PDEBUG("Palette allocated = %08x \n", pSurface->pPalette); } pSurface->uPlaneConfig = uPlaneConfig; pSurface->uAttr = __GFX_SURFACE_ALLOC; if(__STB_GRAPHICS_MEM_SIZE>0) //we are using a specific graphics memory pool pSurface->uBufferBase = os_get_physical_address(pSurface->hBuffer)-__STB_GRAPHICS_MEM_BASE_ADDR+guGraphicsVideoOffset; else pSurface->uBufferBase = os_get_physical_address(pSurface->hBuffer) - os_get_physical_base() + guGraphicsVideoOffset; PDEBUG("Buffer base = %08x \n", pSurface->uBufferBase); for(i=0; i<uNumBuf; i++) { pSurface->plane[i].pBuffer = pSurface->plane[i].uBMLA + (BYTE *)os_get_logical_address(pSurface->hBuffer); PDEBUGE("Plane %d buffer = %08x %08x + %08x\n", i, pSurface->plane[i].pBuffer, pSurface->plane[i].uBMLA, os_get_logical_address(pSurface->hBuffer)); } PDEBUG("Init OSD control headers\n"); pSurface->attachedDev = GFX_VDEV_NULL; // the initial clip region pSurface->clip.x1 = pSurface->clip.y1 = 0; pSurface->clip.x2 = uWidth-1; pSurface->clip.y2 = uHeight-1; // initialize bounding clip pSurface->bound = pSurface->clip; // then we will config for the initial parameters for osd control block // although this is not nessesary for normal gfx surface, but we just do it. if(cursor) { STB_OSD_CURSOR_CONTROL_BLOCK_T *pCntl; pSurface->uAttr |= __GFX_SURFACE_OSDCURSOR; pCntl = (STB_OSD_CURSOR_CONTROL_BLOCK_T *)os_get_logical_address(pSurface->hBuffer); PDEBUG("pCntl = %08x\n", pCntl); pSurface->pPal = (BYTE *)pCntl + sizeof(STB_OSD_CURSOR_CONTROL_BLOCK_T); PDEBUG("pSurface->pPal = %08x\n", pSurface->pPal); _OS_MEMSET(pCntl, 0, sizeof(STB_OSD_CURSOR_CONTROL_BLOCK_T)); gfx_osi_reset_surface_palette(pSurface); pCntl->region_hsize = pSurface->plane[0].uAllocWidth * pSurface->plane[0].uPixelSize / 32; pCntl->color_resolution = (uPlaneConfig&0x01) ? 1 : 0; pCntl->region_vsize = pSurface->plane[0].uAllocHeight/2; pCntl->pixel_resolution = (uPlaneConfig&0x04) ? 1 : 0; pCntl->extlink_addr = pSurface->plane[0].uBMLA >> 2; } else { if(uHeaderSize > 0) { STB_OSD_GI_CONTROL_BLOCK_T *pCntl; pCntl = (STB_OSD_GI_CONTROL_BLOCK_T *)os_get_logical_address(pSurface->hBuffer); PDEBUG("pCntl = %08x\n", pCntl); _OS_MEMSET(pCntl, 0, sizeof(STB_OSD_GI_CONTROL_BLOCK_T)); if(pSurface->pPalette)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -