graphicsresourceservices/graphicsresource/src/sgimage.cpp
changeset 0 5d03bc08d59c
equal deleted inserted replaced
-1:000000000000 0:5d03bc08d59c
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "sgdriver.h"
       
    17 #include "sgimageadapter.h"
       
    18 
       
    19 
       
    20 /**
       
    21 @publishedPartner
       
    22 @prototype
       
    23 @deprecated
       
    24 
       
    25 Default constructor.
       
    26 
       
    27 @pre None.
       
    28 @post All the data members of this instance of TSgImageInfo are zero, false or null.
       
    29 */
       
    30 EXPORT_C TSgImageInfo::TSgImageInfo()
       
    31 	{
       
    32 	Mem::FillZ(this, sizeof(TSgImageInfo));
       
    33 	}
       
    34 
       
    35 
       
    36 /**
       
    37 @publishedPartner
       
    38 @prototype
       
    39 @deprecated
       
    40 
       
    41 Default constructor.
       
    42 
       
    43 @pre None.
       
    44 @post This RSgImage handle is null.
       
    45 */
       
    46 EXPORT_C RSgImage::RSgImage()
       
    47 	{
       
    48 	iHandleType = KSgImageTypeUid;
       
    49 	}
       
    50 
       
    51 
       
    52 /**
       
    53 @publishedPartner
       
    54 @prototype
       
    55 @deprecated
       
    56 
       
    57 Creates an image with the specified attributes and, optionally, the specified
       
    58 initial contents.
       
    59 
       
    60 @param aInfo The attributes of the image to be created.
       
    61 @param aDataAddress The base address of the pixel data used to populate the new image.
       
    62        If this value is null, the initial contents of the image are undefined.
       
    63        If aInfo specifies that the new image is constant, this value must not be null.
       
    64 @param aDataStride The number of bytes between rows of the pixel data used to populate
       
    65        the new image.
       
    66 @pre The Graphics Resource driver is initialised for use in the context of the
       
    67      calling process.
       
    68 @pre This RSgImage handle is null.
       
    69 @pre aInfo is supported.
       
    70 @post This RSgImage handle references a newly created image with the specified
       
    71       attributes and initial contents. The initial reference count for the image
       
    72       is one.
       
    73 @return KErrNone if successful.
       
    74 @return KErrInUse if this RSgImage handle was not null.
       
    75 @return KErrArgument if aInfo is invalid.
       
    76 @return KErrNoInitializationData if aInfo requests a constant image and aDataAddress
       
    77         is null.
       
    78 @return KErrTooBig if the size specified in aInfo is too large.
       
    79 @return KErrNotSupported if aInfo is not supported.
       
    80 @return KErrNoMemory if there is not enough system memory.
       
    81 @return KErrNoSpecializedMemory if there is not enough specialised graphics memory.
       
    82 @panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       
    83        for use in the context of the calling process.
       
    84 */
       
    85 EXPORT_C TInt RSgImage::Create(const TSgImageInfo& aInfo, const TAny* aDataAddress, TInt aDataStride)
       
    86 	{
       
    87 #ifdef _DEBUG
       
    88 	gPls.iMutex.Wait();
       
    89 	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
       
    90 #endif
       
    91 	TInt err = gPls.iDriver->CreateImage(aInfo, aDataAddress, aDataStride, iImpl);
       
    92 #ifdef _DEBUG
       
    93 	gPls.iMutex.Signal();
       
    94 #endif
       
    95 	return err;
       
    96 	}
       
    97 
       
    98 
       
    99 /**
       
   100 @publishedPartner
       
   101 @prototype
       
   102 @deprecated
       
   103 
       
   104 Creates an image with the specified attributes and initial contents copied from an
       
   105 existing image. The size and the pixel format of the image to be created must be the
       
   106 same as the size and the pixel format of the existing image.
       
   107 
       
   108 @param aInfo The attributes of the image to be created.
       
   109 @param aImage A handle to the existing image to be copied.
       
   110 @pre The Graphics Resource driver is initialised for use in the context of the
       
   111      calling process.
       
   112 @pre This RSgImage handle is null.
       
   113 @pre aInfo is supported.
       
   114 @pre aImage is a valid and not null handle.
       
   115 @pre The size and the pixel format specified in aInfo must be the same as the size
       
   116      and the pixel format of aImage.
       
   117 @post This RSgImage handle references a newly created image with the specified
       
   118       attributes and initial contents. The initial reference count for the image
       
   119       is one.
       
   120 @return KErrNone if successful.
       
   121 @return KErrInUse if this RSgImage handle was not null.
       
   122 @return KErrArgument if aInfo is invalid or if aImage is a null handle.
       
   123 @return KErrNotSupported if aInfo is not supported or if the size and the pixel format
       
   124         specified in aInfo are not the same as the size and the pixel format of aImage.
       
   125 @return KErrNoMemory if there is not enough system memory.
       
   126 @return KErrNoSpecializedMemory if there is not enough specialised graphics memory.
       
   127 @panic SGRES 3 in debug builds if aImage is an invalid handle.
       
   128 @panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       
   129        for use in the context of the calling process.
       
   130 */
       
   131 EXPORT_C TInt RSgImage::Create(const TSgImageInfo& aInfo, const RSgImage& aImage)
       
   132 	{
       
   133 #ifdef _DEBUG
       
   134 	gPls.iMutex.Wait();
       
   135 	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
       
   136 #endif
       
   137 	TInt err = gPls.iDriver->CreateImage(aInfo, static_cast<MSgImageAdapter*>(aImage.iImpl), iImpl);
       
   138 #ifdef _DEBUG
       
   139 	gPls.iMutex.Signal();
       
   140 #endif
       
   141 	return err;
       
   142 	}
       
   143 
       
   144 
       
   145 /**
       
   146 @publishedPartner
       
   147 @prototype
       
   148 @deprecated
       
   149 
       
   150 Retrieves the values of the attributes of an image. This function can also retrieve
       
   151 the values of selected user-defined attributes attached to an image by passing in
       
   152 the globally unique identifiers of the user-defined attributes to be retrieved.
       
   153 
       
   154 @param aInfo On input, the globally unique identifiers of the user-defined attributes
       
   155        to be retrieved from the image, if any. On return, the values of the attributes
       
   156        of the image and the values of the selected user-defined attributes.
       
   157 @pre The Graphics Resource driver is initialised for use in the context of the
       
   158      calling process.
       
   159 @pre This RSgImage handle is valid and not null.
       
   160 @pre If aInfo.iUserAttributes is not null then it points to an array of
       
   161      aInfo.iUserAttributeCount elements with globally unique identifiers
       
   162      corresponding to user-defined attributes attached to the image.
       
   163 @post None.
       
   164 @return KErrNone if successful.
       
   165 @return KErrBadHandle if this RSgImage handle is null.
       
   166 @return KErrNotFound if any of the user-defined attributes to be retrieved from the
       
   167         image cannot be found.
       
   168 @panic SGRES 3 in debug builds if this RSgImage handle is invalid.
       
   169 @panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       
   170        for use in the context of the calling process.
       
   171 @see TSgImageInfo
       
   172 */
       
   173 EXPORT_C TInt RSgImage::GetInfo(TSgImageInfo& aInfo) const
       
   174 	{
       
   175 	if (!iImpl)
       
   176 		{
       
   177 		return KErrBadHandle;
       
   178 		}
       
   179 #ifdef _DEBUG
       
   180 	gPls.iMutex.Wait();
       
   181 	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
       
   182 	__ASSERT_DEBUG(gPls.iDriver->CheckImage(*iImpl), Panic(ESgPanicBadImageHandle));
       
   183 #endif
       
   184 	TInt err = static_cast<MSgImageAdapter*>(iImpl)->GetInfo(aInfo);
       
   185 #ifdef _DEBUG
       
   186 	gPls.iMutex.Signal();
       
   187 #endif
       
   188 	return err;
       
   189 	}
       
   190 
       
   191 
       
   192 /**
       
   193 @publishedPartner
       
   194 @prototype
       
   195 @deprecated
       
   196 
       
   197 Temporarily makes the pixel data of an image accessible for reading by the CPU.
       
   198 Undefined behaviour occurs if the CPU tries to modify the pixel data.
       
   199 
       
   200 When finished with the pixel data, the caller must end the mapping by calling Unmap()
       
   201 on this RSgImage handle.
       
   202 
       
   203 If an image is shared across processes, only the creator process is allowed to map
       
   204 the image for access to its pixel data.
       
   205 
       
   206 Depending upon the hardware architecture, whilst an image is mapped the GPU may be
       
   207 denied access to the pixel data, so this function may cause GPU operations that use
       
   208 this image to fail if proper synchronisation is not provided by means of the
       
   209 mechanisms available from the different rendering pipelines or from specialised
       
   210 synchronisation objects. Likewise, if the GPU is using the image at the time this
       
   211 function is called, the mapping may fail with KErrInUse. Note that even if operations
       
   212 do not fail, the results are not guaranteed to be correct unless proper synchronisation
       
   213 is provided.
       
   214 
       
   215 @param aDataAddress On return, the base address of the pixel data in the address
       
   216        space of the calling process.
       
   217 @param aDataStride On return, the number of bytes between rows of the pixel data.
       
   218 @pre The Graphics Resource driver is initialised for use in the context of the
       
   219      calling process.
       
   220 @pre This RSgImage handle is valid and not null.
       
   221 @pre The image is not mapped yet.
       
   222 @pre The image was created with CPU access ESgCpuAccessReadOnly or ESgCpuAccessReadWrite.
       
   223 @pre The image was created by the calling process.
       
   224 @post The pixel data of the image is directly accessible in the address space of the
       
   225       calling process for reading only, until Unmap() is called.
       
   226 @return KErrNone if successful.
       
   227 @return KErrBadHandle if this RSgImage handle is null.
       
   228 @return KErrInUse if the image is already mapped or in exclusive use by the GPU.
       
   229 @return KErrAccessDenied if the image was not created with CPU access ESgCpuAccessReadOnly
       
   230         or ESgCpuAccessReadWrite.
       
   231 @return KErrPermissionDenied if the image was created by another process.
       
   232 @return KErrNoMemory if there is not enough system memory.
       
   233 @panic SGRES 3 in debug builds if this RSgImage handle is invalid.
       
   234 @panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       
   235        for use in the context of the calling process.
       
   236 */
       
   237 EXPORT_C TInt RSgImage::MapReadOnly(const TAny*& aDataAddress, TInt& aDataStride) const
       
   238 	{
       
   239 	if (!iImpl)
       
   240 		{
       
   241 		return KErrBadHandle;
       
   242 		}
       
   243 #ifdef _DEBUG
       
   244 	gPls.iMutex.Wait();
       
   245 	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
       
   246 	__ASSERT_DEBUG(gPls.iDriver->CheckImage(*iImpl), Panic(ESgPanicBadImageHandle));
       
   247 #endif
       
   248 	TInt err = static_cast<MSgImageAdapter*>(iImpl)->MapReadOnly(aDataAddress, aDataStride);
       
   249 #ifdef _DEBUG
       
   250 	gPls.iMutex.Signal();
       
   251 #endif
       
   252 	return err;
       
   253 	}
       
   254 
       
   255 
       
   256 /**
       
   257 @publishedPartner
       
   258 @prototype
       
   259 @deprecated
       
   260 
       
   261 Temporarily makes the pixel data of an image accessible for writing by the CPU.
       
   262 Any pre-existing content is discarded, meaning that the mapped memory initially
       
   263 contains undefined pixel data.
       
   264 
       
   265 When finished with the pixel data, the caller must end the mapping by calling Unmap()
       
   266 on this RSgImage handle. The caller is required to write to every pixel of the image
       
   267 before unmapping.
       
   268 
       
   269 If an image is shared across processes, only the creator process is allowed to map
       
   270 the image for access to its pixel data.
       
   271 
       
   272 Depending upon the hardware architecture, whilst an image is mapped the GPU may be
       
   273 denied access to the pixel data, so this function may cause GPU operations that use
       
   274 this image to fail if proper synchronisation is not provided by means of the
       
   275 mechanisms available from the different rendering pipelines or from specialised
       
   276 synchronisation objects. Likewise, if the GPU is using the image at the time this
       
   277 function is called, the mapping may fail with KErrInUse. Note that even if operations
       
   278 do not fail, the results are not guaranteed to be correct unless proper synchronisation
       
   279 is provided.
       
   280 
       
   281 @param aDataAddress On return, the base address of the pixel data in the address
       
   282        space of the calling process.
       
   283 @param aDataStride On return, the number of bytes between rows of the pixel data.
       
   284 @pre The Graphics Resource driver is initialised for use in the context of the
       
   285      calling process.
       
   286 @pre This RSgImage handle is valid and not null.
       
   287 @pre The image is not mapped yet.
       
   288 @pre The image was created with CPU access ESgCpuAccessWriteOnly or ESgCpuAccessReadWrite.
       
   289 @pre The image was created by the calling process.
       
   290 @post The pixel data of the image is directly accessible in the address space of the
       
   291       calling process for writing only, until Unmap() is called.
       
   292 @return KErrNone if successful.
       
   293 @return KErrBadHandle if this RSgImage handle is null.
       
   294 @return KErrInUse if the image is already mapped or in exclusive use by the GPU.
       
   295 @return KErrAccessDenied if the image was not created with CPU access ESgCpuAccessWriteOnly
       
   296         or ESgCpuAccessReadWrite.
       
   297 @return KErrPermissionDenied if the image was created by another process.
       
   298 @return KErrNoMemory if there is not enough system memory.
       
   299 @panic SGRES 3 in debug builds if this RSgImage handle is invalid.
       
   300 @panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       
   301        for use in the context of the calling process.
       
   302 */
       
   303 EXPORT_C TInt RSgImage::MapWriteOnly(TAny*& aDataAddress, TInt& aDataStride)
       
   304 	{
       
   305 	if (!iImpl)
       
   306 		{
       
   307 		return KErrBadHandle;
       
   308 		}
       
   309 #ifdef _DEBUG
       
   310 	gPls.iMutex.Wait();
       
   311 	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
       
   312 	__ASSERT_DEBUG(gPls.iDriver->CheckImage(*iImpl), Panic(ESgPanicBadImageHandle));
       
   313 #endif
       
   314 	TInt err = static_cast<MSgImageAdapter*>(iImpl)->MapWriteOnly(aDataAddress, aDataStride);
       
   315 #ifdef _DEBUG
       
   316 	gPls.iMutex.Signal();
       
   317 #endif
       
   318 	return err;
       
   319 	}
       
   320 
       
   321 
       
   322 /**
       
   323 @publishedPartner
       
   324 @prototype
       
   325 @deprecated
       
   326 
       
   327 Temporarily makes the pixel data of an image accessible for reading and writing
       
   328 by the CPU.
       
   329 
       
   330 When finished with the pixel data, the caller must end the mapping by calling Unmap()
       
   331 on this RSgImage handle. Any modification performed by the CPU will be retained upon
       
   332 unmapping.
       
   333 
       
   334 If an image is shared across processes, only the creator process is allowed to map
       
   335 the image for access to its pixel data.
       
   336 
       
   337 Depending upon the hardware architecture, whilst an image is mapped the GPU may be
       
   338 denied access to the pixel data, so this function may cause GPU operations that use
       
   339 this image to fail if proper synchronisation is not provided by means of the
       
   340 mechanisms available from the different rendering pipelines or from specialised
       
   341 synchronisation objects. Likewise, if the GPU is using the image at the time this
       
   342 function is called, the mapping may fail with KErrInUse. Note that even if operations
       
   343 do not fail, the results are not guaranteed to be correct unless proper synchronisation
       
   344 is provided.
       
   345 
       
   346 @param aDataAddress On return, the base address of the pixel data in the address
       
   347        space of the calling process.
       
   348 @param aDataStride On return, the number of bytes between rows of the pixel data.
       
   349 @pre The Graphics Resource driver is initialised for use in the context of the
       
   350      calling process.
       
   351 @pre This RSgImage handle is valid and not null.
       
   352 @pre The image is not mapped yet.
       
   353 @pre The image was created with CPU access ESgCpuAccessReadWrite.
       
   354 @pre The image was created by the calling process.
       
   355 @post The pixel data of the image is directly accessible in the address space of the
       
   356       calling process for reading and writing, until Unmap() is called.
       
   357 @return KErrNone if successful.
       
   358 @return KErrBadHandle if this RSgImage handle is null.
       
   359 @return KErrInUse if the image is already mapped or in exclusive use by the GPU.
       
   360 @return KErrAccessDenied if the image was not created with CPU access
       
   361         ESgCpuAccessReadWrite.
       
   362 @return KErrPermissionDenied if the image was created by another process.
       
   363 @return KErrNoMemory if there is not enough system memory.
       
   364 @panic SGRES 3 in debug builds if this RSgImage handle is invalid.
       
   365 @panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       
   366        for use in the context of the calling process.
       
   367 */
       
   368 EXPORT_C TInt RSgImage::MapReadWrite(TAny*& aDataAddress, TInt& aDataStride)
       
   369 	{
       
   370 	if (!iImpl)
       
   371 		{
       
   372 		return KErrBadHandle;
       
   373 		}
       
   374 #ifdef _DEBUG
       
   375 	gPls.iMutex.Wait();
       
   376 	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
       
   377 	__ASSERT_DEBUG(gPls.iDriver->CheckImage(*iImpl), Panic(ESgPanicBadImageHandle));
       
   378 #endif
       
   379 	TInt err = static_cast<MSgImageAdapter*>(iImpl)->MapReadWrite(aDataAddress, aDataStride);
       
   380 #ifdef _DEBUG
       
   381 	gPls.iMutex.Signal();
       
   382 #endif
       
   383 	return err;
       
   384 	}
       
   385 
       
   386 
       
   387 /**
       
   388 @publishedPartner
       
   389 @prototype
       
   390 @deprecated
       
   391 
       
   392 Makes the pixel data of an image no longer accessible by the CPU. If the image was
       
   393 mapped for writing by the CPU, any written data is retained and any subsequent usage
       
   394 of the image by the GPU will reflect its new state.
       
   395 
       
   396 If the last handle to an image in a process is closed while the image is still mapped
       
   397 by the process then the image will be automatically unmapped.
       
   398 
       
   399 @pre The Graphics Resource driver is initialised for use in the context of the
       
   400      calling process.
       
   401 @pre This RSgImage handle is valid and not null.
       
   402 @pre The image is mapped for CPU access by a previous call to MapReadOnly(),
       
   403      MapWriteOnly() or MapReadWrite().
       
   404 @post The GPU is guaranteed to be able to get access to the image.
       
   405 @post The address range in the calling process used for the mapping is no longer
       
   406       valid. Attempts by the calling process to access any address in this range
       
   407       will result in undefined behaviour.
       
   408 @return KErrNone if successful.
       
   409 @return KErrBadHandle if this RSgImage handle is null.
       
   410 @return KErrGeneral if the image was not mapped for CPU access.
       
   411 @panic SGRES 3 in debug builds if this RSgImage handle is invalid.
       
   412 @panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       
   413        for use in the context of the calling process.
       
   414 */
       
   415 EXPORT_C TInt RSgImage::Unmap() const
       
   416 	{
       
   417 	if (!iImpl)
       
   418 		{
       
   419 		return KErrBadHandle;
       
   420 		}
       
   421 #ifdef _DEBUG
       
   422 	gPls.iMutex.Wait();
       
   423 	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
       
   424 	__ASSERT_DEBUG(gPls.iDriver->CheckImage(*iImpl), Panic(ESgPanicBadImageHandle));
       
   425 #endif
       
   426 	TInt err = static_cast<MSgImageAdapter*>(iImpl)->Unmap();
       
   427 #ifdef _DEBUG
       
   428 	gPls.iMutex.Signal();
       
   429 #endif
       
   430 	return err;
       
   431 	}
       
   432 
       
   433 
       
   434 /**
       
   435 @publishedPartner
       
   436 @prototype
       
   437 @deprecated
       
   438 
       
   439 Retrieves the list of image pixel formats supported on this device for a specified
       
   440 usage. This function is often called before creating images.
       
   441 
       
   442 @param aInfo The image attributes. aInfo.iPixelFormat is ignored.
       
   443 @param aPixelFormats A pointer to an array that on return will contain the supported
       
   444        pixel formats. If this parameter is null, then this function will just
       
   445        return the number of supported pixel formats in aCount.
       
   446 @param aCount On input, the number of elements in the array pointed to by aPixelFormats
       
   447        if not null, ignored otherwise. On return, the actual number of supported pixel
       
   448        formats. If this number is greater than the number of elements in the array,
       
   449        then the array will be filled with as many pixel formats as it can hold and the
       
   450        function will return KErrOverflow.
       
   451 @pre The Graphics Resource driver is initialised for use in the context of the
       
   452      calling process.
       
   453 @pre aInfo is valid.
       
   454 @pre If aPixelFormats is not null then aCount is greater than zero.
       
   455 @post None.
       
   456 @return KErrNone if successful.
       
   457 @return KErrArgument if aInfo is invalid or if aPixelFormats is not null and aCount
       
   458         is negative.
       
   459 @return KErrOverflow if the actual number of supported pixel formats is greater than
       
   460         the number of elements in the array pointed to by aPixelFormats.
       
   461 @return KErrNoMemory if there is not enough system memory.
       
   462 @panic SGRES 5 in debug builds if the Graphics Resource driver is not initialised
       
   463        for use in the context of the calling process.
       
   464 */
       
   465 EXPORT_C TInt RSgImage::GetPixelFormats(const TSgImageInfo& aInfo, TUidPixelFormat* aPixelFormats, TInt& aCount)
       
   466 	{
       
   467 #ifdef _DEBUG
       
   468 	gPls.iMutex.Wait();
       
   469 	__ASSERT_DEBUG(gPls.iDriver, Panic(ESgPanicNoDriver));
       
   470 #endif
       
   471 	TInt err = gPls.iDriver->GetPixelFormats(aInfo, aPixelFormats, aCount);
       
   472 #ifdef _DEBUG
       
   473 	gPls.iMutex.Signal();
       
   474 #endif
       
   475 	return err;
       
   476 	}