graphicsresourceservices/graphicsresourceadaptation/src/sgpixelformats.cpp
author hgs
Fri, 17 Sep 2010 17:25:01 +0300
changeset 179 b50de33648a3
parent 0 5d03bc08d59c
permissions -rw-r--r--
201037_1

// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

#include <hal.h>
#include "sgdriverimpl.h"


TInt SgMinDataStride(TInt aWidth, TUidPixelFormat aPixelFormat)
	{
	switch (aPixelFormat)
		{
	case EUidPixelFormatXRGB_8888:
	case EUidPixelFormatBGRX_8888:
	case EUidPixelFormatXBGR_8888:
	case EUidPixelFormatBGRA_8888:
	case EUidPixelFormatARGB_8888:
	case EUidPixelFormatABGR_8888:
	case EUidPixelFormatARGB_8888_PRE:
	case EUidPixelFormatABGR_8888_PRE:
	case EUidPixelFormatBGRA_8888_PRE:
	case EUidPixelFormatARGB_2101010:
	case EUidPixelFormatABGR_2101010:
		return aWidth * 4;
	case EUidPixelFormatBGR_888:
	case EUidPixelFormatRGB_888:
		return aWidth * 3;
	case EUidPixelFormatRGB_565:
	case EUidPixelFormatBGR_565:
	case EUidPixelFormatARGB_1555:
	case EUidPixelFormatXRGB_1555:
	case EUidPixelFormatARGB_4444:
	case EUidPixelFormatARGB_8332:
	case EUidPixelFormatBGRX_5551:
	case EUidPixelFormatBGRA_5551:
	case EUidPixelFormatBGRA_4444:
	case EUidPixelFormatBGRX_4444:
	case EUidPixelFormatAP_88:
	case EUidPixelFormatXRGB_4444:
	case EUidPixelFormatXBGR_4444:
		return aWidth * 2;
	case EUidPixelFormatRGB_332:
	case EUidPixelFormatA_8:
	case EUidPixelFormatBGR_332:
	case EUidPixelFormatP_8:
		return aWidth;
	case EUidPixelFormatP_4:
		return (aWidth + 1) / 2;
	case EUidPixelFormatP_2:
		return (aWidth + 3) / 4;
	case EUidPixelFormatP_1:
		return (aWidth + 7) / 8;
	default:
		return KErrNotSupported;
		}
	}


const TUint32 KSgSupportedConstantSources = ESgUsageDirectGdiSource
	| ESgUsageOpenGlesTexture2D | ESgUsageOpenVgImage | ESgUsageOpenGles2Texture2D | ESgUsageWindowGcSource;
const TUint32 KSgSupportedCpuSources = ESgUsageDirectGdiSource | ESgUsageCompositionSource
	| ESgUsageOpenGlesTexture2D | ESgUsageOpenVgImage | ESgUsageOpenGles2Texture2D | ESgUsageWindowGcSource;
const TUint32 KSgSupportedOffScreenSources = ESgUsageDirectGdiSource | ESgUsageCompositionSource | ESgUsageScreenSource
	| ESgUsageOpenGlesTexture2D | ESgUsageOpenVgImage | ESgUsageOpenGles2Texture2D | ESgUsageWindowGcSource;

const TUidPixelFormat KSgSupportedOpaqueTargetFormat = EUidPixelFormatXRGB_8888;
const TUidPixelFormat KSgSupportedAlphaTargetFormat = EUidPixelFormatARGB_8888_PRE;

#ifdef SYMBIAN_GRAPHICS_USE_NUMA
const TSgCpuAccess KSgSupportedOffScreenCpuAccess = ESgCpuAccessNone;
#else
const TSgCpuAccess KSgSupportedOffScreenCpuAccess = ESgCpuAccessReadWrite;
#endif

const TSgPixelFormatTableEntry KSgAnyScreenPixelFormatTableEntries[] =
	{
	// Support for constant images
	{EUidPixelFormatRGB_565,       KSgSupportedConstantSources, ESgCpuAccessNone, KSgScreenIdAny},
	{EUidPixelFormatXRGB_8888,     KSgSupportedConstantSources, ESgCpuAccessNone, KSgScreenIdAny},
	{EUidPixelFormatARGB_8888,     KSgSupportedConstantSources, ESgCpuAccessNone, KSgScreenIdAny},
	{EUidPixelFormatARGB_8888_PRE, KSgSupportedConstantSources, ESgCpuAccessNone, KSgScreenIdAny},
	};

const TSgPixelFormatTableEntry KSgPerScreenPixelFormatTableEntries[] =
	{
	// Support for CPU rendering
	{EUidPixelFormatRGB_565,       KSgSupportedCpuSources, ESgCpuAccessReadWrite, KSgScreenIdMain},
	{EUidPixelFormatXRGB_8888,     KSgSupportedCpuSources, ESgCpuAccessReadWrite, KSgScreenIdMain},
	{EUidPixelFormatARGB_8888,     KSgSupportedCpuSources, ESgCpuAccessReadWrite, KSgScreenIdMain},
	{EUidPixelFormatARGB_8888_PRE, KSgSupportedCpuSources, ESgCpuAccessReadWrite, KSgScreenIdMain},

	// Support for off-screen rendering
	{KSgSupportedOpaqueTargetFormat, KSgSupportedOffScreenSources|ESgUsageDirectGdiTarget|ESgUsageOpenGlesTarget|ESgUsageOpenGles2Target|ESgUsageOpenVgTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},
	{KSgSupportedAlphaTargetFormat,  KSgSupportedOffScreenSources|ESgUsageDirectGdiTarget|ESgUsageOpenGlesTarget|ESgUsageOpenGles2Target|ESgUsageOpenVgTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},
	{EUidPixelFormatRGB_565,         KSgSupportedOffScreenSources|ESgUsageDirectGdiTarget|ESgUsageOpenGlesTarget|ESgUsageOpenGles2Target|ESgUsageOpenVgTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},

	{KSgSupportedOpaqueTargetFormat, KSgSupportedOffScreenSources|ESgUsageCompositionTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},
	{KSgSupportedAlphaTargetFormat,  KSgSupportedOffScreenSources|ESgUsageCompositionTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},
	{EUidPixelFormatRGB_565,         KSgSupportedOffScreenSources|ESgUsageCompositionTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},

	{KSgSupportedOpaqueTargetFormat, KSgSupportedOffScreenSources|ESgUsageEglCopyBuffersTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},
	{KSgSupportedAlphaTargetFormat,  KSgSupportedOffScreenSources|ESgUsageEglCopyBuffersTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},
	{EUidPixelFormatRGB_565,         KSgSupportedOffScreenSources|ESgUsageEglCopyBuffersTarget, KSgSupportedOffScreenCpuAccess, KSgScreenIdMain},
	};


TInt XSgDriverImpl::ConstructPixelFormatTable()
	{
	TInt numberOfScreens;
	TInt err = HAL::Get(HAL::EDisplayNumberOfScreens, numberOfScreens);
	if (err != KErrNone)
		{
		return err;
		}
	for (TInt i = 0; i < sizeof(KSgAnyScreenPixelFormatTableEntries) / sizeof(TSgPixelFormatTableEntry); ++i)
		{
		RHeap* prevHeap = User::SwitchHeap(iHeap);
		err = iPixelFormatTable.Append(KSgAnyScreenPixelFormatTableEntries[i]);
		User::SwitchHeap(prevHeap);
		if (err != KErrNone)
			{
			return err;
			}
		}
	for (TInt screenId = 0; screenId < numberOfScreens; ++screenId)
		{
		for (TInt i = 0; i < sizeof(KSgPerScreenPixelFormatTableEntries) / sizeof(TSgPixelFormatTableEntry); ++i)
			{
			TSgPixelFormatTableEntry entry = KSgPerScreenPixelFormatTableEntries[i];
			entry.iScreenId = screenId;
			RHeap* prevHeap = User::SwitchHeap(iHeap);
			err = iPixelFormatTable.Append(entry);
			User::SwitchHeap(prevHeap);
			if (err != KErrNone)
				{
				return err;
				}
			}
		}
	return KErrNone;
	}