From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/gfxdrivers/unichrome/uc_spic.c | 193 +++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100755 Source/DirectFB/gfxdrivers/unichrome/uc_spic.c (limited to 'Source/DirectFB/gfxdrivers/unichrome/uc_spic.c') diff --git a/Source/DirectFB/gfxdrivers/unichrome/uc_spic.c b/Source/DirectFB/gfxdrivers/unichrome/uc_spic.c new file mode 100755 index 0000000..b7665b3 --- /dev/null +++ b/Source/DirectFB/gfxdrivers/unichrome/uc_spic.c @@ -0,0 +1,193 @@ +/* + Copyright (c) 2003 Andreas Robinson, All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. +*/ + +#include + +#include "unichrome.h" +#include "vidregs.h" +#include "mmio.h" + +#include +#include + +#define UC_SPIC_OPTIONS DLOP_OPACITY + +typedef struct _UcSubpictureData { +} UcSubpictureData; + +static int uc_spic_datasize( void ) +{ + return sizeof(UcSubpictureData); +} + +static void +uc_spic_set_palette( volatile u8* hwregs, CorePalette *palette ) +{ + int i; + + if (palette) { + for (i = 0; i < 16; i++) { + /* TODO: Check r-g-b order. */ + VIDEO_OUT(hwregs, RAM_TABLE_CONTROL, + (palette->entries[i].r << 24) | + (palette->entries[i].g << 16) | + (palette->entries[i].b << 8) | + (i << 4) | RAM_TABLE_RGB_ENABLE); + } + } +} + +static void uc_spic_enable( volatile u8 *hwregs, bool enable ) +{ + VIDEO_OUT(hwregs, SUBP_CONTROL_STRIDE, + (VIDEO_IN(hwregs, SUBP_CONTROL_STRIDE) & ~SUBP_HQV_ENABLE) | + (enable ? SUBP_HQV_ENABLE : 0)); +} + +static void +uc_spic_set_buffer( volatile u8 *hwregs, CoreSurfaceBufferLock *lock ) +{ + if (lock) { + VIDEO_OUT(hwregs, SUBP_STARTADDR, + lock->offset); + VIDEO_OUT(hwregs, SUBP_CONTROL_STRIDE, + (VIDEO_IN(hwregs, SUBP_CONTROL_STRIDE) & ~SUBP_STRIDE_MASK) | + (lock->pitch & SUBP_STRIDE_MASK) | + SUBP_AI44 ); + } +} + +static DFBResult +uc_spic_init_layer( CoreLayer *layer, + void *driver_data, + void *layer_data, + DFBDisplayLayerDescription *description, + DFBDisplayLayerConfig *config, + DFBColorAdjustment *adjustment ) +{ + /* Set layer type, capabilities and name */ + + description->caps = DLCAPS_SURFACE | DLCAPS_OPACITY; + description->type = DLTF_GRAPHICS | DLTF_VIDEO | DLTF_STILL_PICTURE; + snprintf(description->name, + DFB_DISPLAY_LAYER_DESC_NAME_LENGTH, "VIA Unichrome DVD Subpicture"); + + adjustment->flags = DCAF_NONE; + + /* Fill out the default configuration */ + + config->flags = DLCONF_WIDTH | DLCONF_HEIGHT | + DLCONF_PIXELFORMAT | DLCONF_BUFFERMODE | DLCONF_OPTIONS; + + config->width = 720; + config->height = 576; + + config->pixelformat = DSPF_ALUT44; + config->buffermode = DLBM_FRONTONLY; + config->options = DLOP_NONE; + + return DFB_OK; +} + +static DFBResult +uc_spic_test_region( CoreLayer *layer, + void *driver_data, + void *layer_data, + CoreLayerRegionConfig *config, + CoreLayerRegionConfigFlags *failed) +{ + CoreLayerRegionConfigFlags fail = 0; + + /* Check layer options */ + + if (config->options & ~UC_SPIC_OPTIONS) + fail |= CLRCF_OPTIONS; + + /* Check pixelformats */ + + switch (config->format) { + case DSPF_ALUT44: + break; + //case DSPF_LUTA44: + // IA44 does not exist in DirectFB, but hw supports it. + default: + fail |= CLRCF_FORMAT; + } + + /* Check width and height */ + + if (config->width > 8195 || config->width < 1) + fail |= CLRCF_WIDTH; + + if (config->height > 4096 || config->height < 1) + fail |= CLRCF_HEIGHT; + + if (failed) *failed = fail; + if (fail) return DFB_UNSUPPORTED; + + return DFB_OK; +} + +static DFBResult +uc_spic_set_region( CoreLayer *layer, + void *driver_data, + void *layer_data, + void *region_data, + CoreLayerRegionConfig *config, + CoreLayerRegionConfigFlags updated, + CoreSurface *surface, + CorePalette *palette, + CoreSurfaceBufferLock *lock ) +{ + UcDriverData* ucdrv = (UcDriverData*) driver_data; + + uc_spic_set_palette(ucdrv->hwregs, palette); + uc_spic_set_buffer(ucdrv->hwregs, lock); + uc_spic_enable(ucdrv->hwregs, (config->opacity > 0)); + + return DFB_OK; +} + +static DFBResult +uc_spic_remove( CoreLayer *layer, + void *driver_data, + void *layer_data, + void *region_data ) +{ + UcDriverData* ucdrv = (UcDriverData*) driver_data; + + uc_spic_enable(ucdrv->hwregs, false); + return DFB_OK; +} + +static DFBResult +uc_spic_flip_region( CoreLayer *layer, + void *driver_data, + void *layer_data, + void *region_data, + CoreSurface *surface, + DFBSurfaceFlipFlags flags, + CoreSurfaceBufferLock *lock ) +{ + UcDriverData* ucdrv = (UcDriverData*) driver_data; + + dfb_surface_flip(surface, false); + uc_spic_set_buffer(ucdrv->hwregs, lock); + + return DFB_OK; +} + +DisplayLayerFuncs ucSubpictureFuncs = { + .LayerDataSize = uc_spic_datasize, + .InitLayer = uc_spic_init_layer, + .SetRegion = uc_spic_set_region, + .RemoveRegion = uc_spic_remove, + .TestRegion = uc_spic_test_region, + .FlipRegion = uc_spic_flip_region, +}; -- cgit