sl@0: #include "egltest_releaseimagegles.h" sl@0: #include "eglendpointwrap.h" sl@0: #include "egltest_surface.h" sl@0: sl@0: sl@0: //Remote test step---------------------------------------------------------------- sl@0: sl@0: CEglTest_RemoteTestStep_EndpointReleaseImageGles::CEglTest_RemoteTestStep_EndpointReleaseImageGles() : sl@0: CRemoteTestStepBase(ETestUidEndpointReleaseImageGles) sl@0: { sl@0: } sl@0: sl@0: sl@0: CEglTest_RemoteTestStep_EndpointReleaseImageGles::~CEglTest_RemoteTestStep_EndpointReleaseImageGles() sl@0: { sl@0: } sl@0: sl@0: sl@0: TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::DoStartRemoteTestStepL(const TRemoteTestParams& /*aMessageIn*/) sl@0: { sl@0: REMOTE_INFO_PRINTF1(_L("Starting Remote Test Step.")); sl@0: EglStartL(); sl@0: sl@0: iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); sl@0: sl@0: //Create a raw surface that will be encapsulated by the endpoint. sl@0: iSurface = CRawSurface::NewL(); sl@0: iSurface->CreateL(EStandardSurface, TPoint(0, 0)); sl@0: sl@0: TSurfaceId id = iSurface->SurfaceId(); sl@0: iEndpoint = EglEndpoint().CreateEndpoint(iDisplay, EGL_ENDPOINT_TYPE_CONSUMER_NOK, EGL_TSURFACEID_NOK, &id, NULL); sl@0: if(iEndpoint == EGL_NO_ENDPOINT_NOK) sl@0: { sl@0: REMOTE_ERR_PRINTF1(_L("Failed to create endpoint.")); sl@0: User::Leave(KErrUnknown); sl@0: } sl@0: sl@0: iSurface->DrawContentL(TRgb(128,128,128)); sl@0: User::LeaveIfError(iSurface->SubmitContent(EFalse)); sl@0: EGLBoolean ret = EglEndpoint().EndpointBeginStreaming(iDisplay, iEndpoint); sl@0: if(!ret) sl@0: { sl@0: REMOTE_ERR_PRINTF1(_L("Failed to begin streaming from endpoint.")); sl@0: User::Leave(KErrUnknown); sl@0: } sl@0: sl@0: return ERtvPass; sl@0: } sl@0: sl@0: sl@0: TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::DoEndRemoteTestStepL(const TRemoteTestParams& /*aMessageIn*/) sl@0: { sl@0: REMOTE_INFO_PRINTF1(_L("Ending Remote Test Step.")); sl@0: if(iEndpoint != EGL_NO_ENDPOINT_NOK) sl@0: { sl@0: EglEndpoint().EndpointEndStreaming(iDisplay, iEndpoint); sl@0: EglEndpoint().DestroyEndpoint(iDisplay, iEndpoint); sl@0: } sl@0: delete iSurface; sl@0: EglEndL(); sl@0: return ERtvPass; sl@0: } sl@0: sl@0: sl@0: TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::DoRunRemoteTestCaseL(TInt aTestCase, const TRemoteTestParams& aParams) sl@0: { sl@0: switch(aTestCase) sl@0: { sl@0: case 0: return GlesContextTestCaseL(aParams); sl@0: default: return ERtvAbort; sl@0: } sl@0: } sl@0: sl@0: sl@0: TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::GlesContextTestCaseL(const TRemoteTestParams& aParams) sl@0: { sl@0: //This test case acquires an image from an endpoint then attempts to sl@0: //release the image, passing in EGL_OPENGL_ES_API as the API flag. sl@0: //There are two configurations for the test, that is controlled by sl@0: //a flag in aParams. The options are to have a valid GLES context sl@0: //set current, or to have nothing current. sl@0: sl@0: EGLContext glesContext = EGL_NO_CONTEXT; sl@0: EGLSurface glesSurface = EGL_NO_SURFACE; sl@0: sl@0: //Create GLES state and set it current if the test requires it. sl@0: if(aParams.iEndpointReleaseImageGles.iUseValidGlesContext) sl@0: { sl@0: EGLConfig config; sl@0: EGLint nConfigs = 0; sl@0: sl@0: static const EGLint KConfigAttribs[] = sl@0: { sl@0: EGL_BUFFER_SIZE, 32, sl@0: EGL_RED_SIZE, 8, sl@0: EGL_GREEN_SIZE, 8, sl@0: EGL_BLUE_SIZE, 8, sl@0: EGL_ALPHA_SIZE, 8, sl@0: EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, sl@0: EGL_RENDERABLE_TYPE,EGL_OPENGL_ES_BIT, sl@0: EGL_NONE sl@0: }; sl@0: sl@0: eglChooseConfig(iDisplay, KConfigAttribs, &config, 1, &nConfigs); sl@0: if (!nConfigs) sl@0: { sl@0: RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, eglGetError()); sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: if (!eglBindAPI(EGL_OPENGL_ES_API)) sl@0: { sl@0: RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, eglGetError()); sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: glesContext = eglCreateContext(iDisplay, config, 0, NULL); sl@0: if (glesContext == EGL_NO_CONTEXT) sl@0: { sl@0: RDebug::Printf("%s:%d: err = %d", __FILE__, __LINE__, eglGetError()); sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: static const EGLint KPbufferAttribs[] = sl@0: { sl@0: EGL_WIDTH, 100, sl@0: EGL_HEIGHT, 100, sl@0: EGL_NONE, sl@0: }; sl@0: sl@0: glesSurface = eglCreatePbufferSurface(iDisplay, config, KPbufferAttribs); sl@0: if (glesSurface == EGL_NO_SURFACE) sl@0: { sl@0: RDebug::Printf("%s:%d: err = %x", __FILE__, __LINE__, eglGetError()); sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: sl@0: eglMakeCurrent(iDisplay, glesSurface, glesSurface, glesContext); sl@0: } sl@0: sl@0: //Run the test case ansd trap to give us an opportunity to destroy the GLES state if it exists. sl@0: TRemoteTestVerdict verdict = ERtvPass; sl@0: TRAPD(err, verdict = DoGlesContextTestCaseL(aParams)); sl@0: sl@0: //Destroy the GLES state if it exists. sl@0: if(aParams.iEndpointReleaseImageGles.iUseValidGlesContext) sl@0: { sl@0: eglMakeCurrent(iDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); sl@0: eglDestroySurface(iDisplay, glesSurface); sl@0: eglDestroyContext(iDisplay, glesContext); sl@0: } sl@0: sl@0: //Releave if the test left or return the verdict. sl@0: User::LeaveIfError(err); sl@0: return verdict; sl@0: } sl@0: sl@0: sl@0: TRemoteTestVerdict CEglTest_RemoteTestStep_EndpointReleaseImageGles::DoGlesContextTestCaseL(const TRemoteTestParams& /*aParams*/) sl@0: { sl@0: //Draw to the surface and submit the update. sl@0: iSurface->DrawContentL(TRgb(128,128,128)); sl@0: User::LeaveIfError(iSurface->SubmitContent(ETrue)); sl@0: sl@0: //Acquire an image and check that it was successful. sl@0: EGLImageKHR image = EglEndpoint().AcquireImage(iDisplay, iEndpoint); sl@0: if(image == EGL_NO_IMAGE_KHR) sl@0: { sl@0: REMOTE_ERR_PRINTF2(_L("Failed to acquire image from endpoint with error = %d"), eglGetError()); sl@0: return ERtvFail; sl@0: } sl@0: sl@0: //Attempt to release the image. This must always succeed regardless of whether there is a valid GLES context. sl@0: EGLBoolean ret = EglEndpoint().ReleaseImage(iDisplay, iEndpoint, image, EGL_OPENGL_ES_API); sl@0: if(!ret) sl@0: { sl@0: REMOTE_ERR_PRINTF2(_L("Failed to release image from endpoint with error = %d"), eglGetError()); sl@0: return ERtvFail; sl@0: } sl@0: sl@0: return ERtvPass; sl@0: } sl@0: sl@0: //--------------------------------------------------------------------------------