First public contribution.
1 /* Copyright (c) 2009-2010 The Khronos Group Inc.
2 * Portions copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies)
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and/or associated documentation files (the
6 * "Materials"), to deal in the Materials without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sublicense, and/or sell copies of the Materials, and to
9 * permit persons to whom the Materials are furnished to do so, subject to
10 * the following conditions:
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Materials.
15 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
26 * \brief OpenWF Composition SI, API implementation.
28 * For function documentations, see OpenWF Composition specification 1.0
30 * The general layout of an API function is:
31 * - grab API mutex (lock API)
32 * - check parameter validity
33 * - invoke implementation function (WFD_...)
45 #include <WF/wfcext.h>
47 #include "wfcstructs.h"
48 #include "wfccontext.h"
49 #include "owfnativestream.h"
50 #include "owfscreen.h"
52 #define RGB_NUM_BYTES (sizeof(WFCuint8) * 4)
54 #define COND_FAIL(cond,error,retval) \
56 WFC_Device_SetError(dev, error); \
61 #define COND_FAIL_NR(cond,error) \
63 WFC_Device_SetError(dev, error); \
68 #define GET_DEVICE(d, h, x) \
70 d = WFC_Device_FindByHandle(h); \
76 #define GET_DEVICE_NR(d, h) \
78 d = WFC_Device_FindByHandle(h); \
79 if (WFC_INVALID_HANDLE == d) { \
84 #define GET_CONTEXT_NR(c,d,h) \
85 c = WFC_Device_FindContext(d, h); \
86 if (WFC_INVALID_HANDLE == c) { \
87 WFC_Device_SetError((d)->handle, WFC_ERROR_BAD_HANDLE); \
92 #define GET_CONTEXT(c,d,h,x) \
93 c = WFC_Device_FindContext(d, h); \
94 if (WFC_INVALID_HANDLE == c) { \
95 WFC_Device_SetError((d)->handle, WFC_ERROR_BAD_HANDLE); \
100 #define SUCCEED(retval) \
101 WFC_Device_SetError(dev, WFC_ERROR_NONE); \
105 #define SUCCEED_NR() \
106 WFC_Device_SetError(dev, WFC_ERROR_NONE); \
110 #define FAIL(err, retval) \
111 WFC_Device_SetError(dev, err); \
115 #define FAIL_NR(err) \
116 WFC_Device_SetError(dev, err); \
121 static OWF_MUTEX mutex;
123 static void WFC_Cleanup()
125 OWF_Mutex_Destroy(&mutex);
128 static void WFC_Lock()
132 OWF_Mutex_Init(&mutex);
133 xatexit(WFC_Cleanup); // Use adaptation version of atexit
135 OWF_Mutex_Lock(&mutex);
138 static void WFC_Unlock()
140 OWF_Mutex_Unlock(&mutex);
143 /*=========================================================================*/
145 /*=========================================================================*/
147 WFC_API_CALL WFCint WFC_APIENTRY
148 wfcEnumerateDevices(WFCint *deviceIds,
149 WFCint deviceIdsCount,
150 const WFCint *filterList)
154 /* populate list with device IDs */
155 n = WFC_Devices_GetIds(deviceIds, deviceIdsCount, filterList);
159 WFC_API_CALL WFCDevice WFC_APIENTRY
160 wfcCreateDevice(WFCint deviceId, const WFCint *attribList)
164 /* currently only empty attribute list or NULL is allowed */
165 if (attribList && *attribList != WFC_NONE)
168 return WFC_INVALID_HANDLE;
171 device = WFC_Device_Create(deviceId);
177 WFC_API_CALL WFCErrorCode WFC_APIENTRY
178 wfcDestroyDevice(WFCDevice dev)
181 WFCErrorCode result = WFC_ERROR_BAD_DEVICE;
183 DPRINT(("wfcDestroyDevice(%d)", dev));
186 device = WFC_Device_FindByHandle(dev);
189 WFC_Device_Destroy(device);
190 result = WFC_ERROR_NONE;
196 WFC_API_CALL WFCint WFC_APIENTRY
197 wfcGetDeviceAttribi(WFCDevice dev,
198 WFCDeviceAttrib attrib)
204 GET_DEVICE(device, dev, 0);
205 err = WFC_Device_GetAttribi(device, attrib, &result);
210 WFC_API_CALL WFCErrorCode WFC_APIENTRY
211 wfcGetError(WFCDevice dev)
216 GET_DEVICE(device, dev, WFC_ERROR_BAD_DEVICE);
218 err = WFC_Device_GetError(device);
223 WFC_API_CALL void WFC_APIENTRY
224 wfcCommit(WFCDevice dev, WFCContext ctx, WFCboolean wait)
227 WFC_CONTEXT* context;
230 DPRINT(("wfcCommit(%d,%d,%d)", dev, ctx, wait));
231 GET_DEVICE_NR(device, dev);
232 GET_CONTEXT_NR(context, device, ctx);
234 error = WFC_Context_InvokeCommit(device, context, wait);
239 /*=========================================================================*/
241 /*=========================================================================*/
243 WFC_API_CALL WFCContext WFC_APIENTRY
244 wfcCreateOnScreenContext(WFCDevice dev,
246 const WFCint* attribList)
248 WFC_CONTEXT* context = NULL;
249 WFC_DEVICE* device = NULL;
251 GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
253 /* currently only empty attribute list or NULL is allowed */
254 COND_FAIL(!(attribList && *attribList != WFC_NONE),
255 WFC_ERROR_BAD_ATTRIBUTE,
258 if (screenNumber == WFC_DEFAULT_SCREEN_NUMBER)
260 screenNumber = OWF_Screen_GetDefaultNumber();
263 /* check screen number validity */
264 if (!OWF_Screen_Valid(screenNumber))
266 FAIL(WFC_ERROR_UNSUPPORTED, WFC_INVALID_HANDLE);
269 /* check that no other context currently uses this screen */
270 if (WFC_Device_FindScreenNumber(screenNumber))
272 FAIL(WFC_ERROR_IN_USE, WFC_INVALID_HANDLE);
276 context = WFC_Device_CreateContext(device,
278 WFC_CONTEXT_TYPE_ON_SCREEN,
282 FAIL(WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
285 SUCCEED(context->handle);
288 WFC_API_CALL WFCContext WFC_APIENTRY
289 wfcCreateOffScreenContext(WFCDevice dev,
290 WFCNativeStreamType stream,
291 const WFCint *attribList)
293 WFC_CONTEXT* context = NULL;
294 WFC_DEVICE* device = NULL;
295 OWFNativeStreamType internalStream=OWF_INVALID_HANDLE;
296 OWF_STREAM_ERROR streamError;
298 GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
300 /* currently only empty attribute list or NULL is allowed */
301 COND_FAIL(!(attribList && *attribList != WFC_NONE),
302 WFC_ERROR_BAD_ATTRIBUTE,
305 COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream,
306 WFC_ERROR_ILLEGAL_ARGUMENT,
308 internalStream=owfNativeStreamFromWFC(stream,&streamError);
309 COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE);
310 COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE);
312 if (!WFC_Context_IsValidTargetStream(internalStream))
314 owfNativeStreamDestroy(internalStream); /*cancel owfNativeStreamFromWFC reference increase*/
315 FAIL(WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE);
317 context = WFC_Device_CreateContext(device, internalStream,
318 WFC_CONTEXT_TYPE_OFF_SCREEN,
319 OWF_RESERVED_BAD_SCREEN_NUMBER);
320 owfNativeStreamDestroy(internalStream); /*cancel owfNativeStreamFromWFC reference increase*/
321 COND_FAIL(NULL != context, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
323 SUCCEED(context->handle);
326 WFC_API_CALL void WFC_APIENTRY
327 wfcDestroyContext(WFCDevice dev,
330 WFC_DEVICE* device = NULL;
333 DPRINT(("wfcDestroyContext(%d, %d)", dev, ctx));
334 GET_DEVICE_NR(device, dev);
336 err = WFC_Device_DestroyContext(device, ctx);
340 WFC_API_CALL WFCint WFC_APIENTRY
341 wfcGetContextAttribi(WFCDevice dev,
343 WFCContextAttrib attrib)
345 WFC_CONTEXT* context = NULL;
346 WFC_DEVICE* device = NULL;
350 GET_DEVICE(device, dev, 0);
351 GET_CONTEXT(context, device, ctx, 0);
353 err = WFC_Context_GetAttribi(context, attrib, &value);
358 WFC_API_CALL void WFC_APIENTRY
359 wfcSetContextAttribi(WFCDevice dev,
361 WFCContextAttrib attrib,
365 WFC_CONTEXT* context;
368 GET_DEVICE_NR(device, dev);
369 GET_CONTEXT_NR(context, device, ctx);
371 err = WFC_Context_SetAttribi(context, attrib, value);
375 WFC_API_CALL void WFC_APIENTRY
376 wfcGetContextAttribfv(WFCDevice dev,
378 WFCContextAttrib attrib,
380 WFCfloat *values) WFC_APIEXIT
383 WFC_CONTEXT* context;
386 GET_DEVICE_NR(device, dev);
387 GET_CONTEXT_NR(context, device, ctx);
389 err = WFC_Context_GetAttribfv(context, attrib, count, values);
393 WFC_API_CALL void WFC_APIENTRY
394 wfcSetContextAttribfv(WFCDevice dev,
396 WFCContextAttrib attrib,
398 const WFCfloat *values) WFC_APIEXIT
401 WFC_CONTEXT* context;
404 GET_DEVICE_NR(device, dev);
405 GET_CONTEXT_NR(context, device, ctx);
407 err = WFC_Context_SetAttribfv(context, attrib, count, values);
411 /*=========================================================================*/
412 /* 6. IMAGE PROVIDERS (SOURCES & MASKS) */
413 /*=========================================================================*/
415 WFC_API_CALL WFCSource WFC_APIENTRY
416 wfcCreateSourceFromStream(WFCDevice dev,
418 WFCNativeStreamType stream,
419 const WFCint *attribList)
422 WFC_IMAGE_PROVIDER* source;
423 WFC_CONTEXT* context;
424 OWFNativeStreamType internalStream=OWF_INVALID_HANDLE;
425 OWF_STREAM_ERROR streamError;
427 GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
429 /* currently only empty attribute list or NULL is allowed */
430 COND_FAIL(!(attribList && *attribList != WFC_NONE),
431 WFC_ERROR_BAD_ATTRIBUTE,
434 GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE);
435 COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream,
436 WFC_ERROR_ILLEGAL_ARGUMENT,
439 internalStream=owfNativeStreamFromWFC(stream,&streamError);
440 COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE);
441 COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE);
443 if (context->stream == internalStream)
445 owfNativeStreamDestroy(internalStream);
446 FAIL( WFC_ERROR_IN_USE, WFC_INVALID_HANDLE);
449 if (!WFC_Context_IsValidSourceStream(internalStream))
451 owfNativeStreamDestroy(internalStream);
452 FAIL( WFC_ERROR_UNSUPPORTED, WFC_INVALID_HANDLE);
455 source = WFC_Device_CreateSource(device, context, internalStream);
456 owfNativeStreamDestroy(internalStream); /*cancel FromWFC reference increase*/
457 COND_FAIL(NULL != source, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
459 SUCCEED(source->handle);
462 WFC_API_CALL void WFC_APIENTRY
463 wfcDestroySource(WFCDevice dev,
469 GET_DEVICE_NR(device, dev);
471 err = WFC_Device_DestroySource(device, src);
476 WFC_API_CALL WFCMask WFC_APIENTRY
477 wfcCreateMaskFromStream(WFCDevice dev,
479 WFCNativeStreamType stream,
480 const WFCint *attribList) WFC_APIEXIT
483 WFC_CONTEXT* context;
484 WFC_IMAGE_PROVIDER* mask;
486 OWFNativeStreamType internalStream=OWF_INVALID_HANDLE;
487 OWF_STREAM_ERROR streamError;
490 GET_DEVICE(device, dev, WFC_ERROR_BAD_DEVICE);
492 /* currently only empty attribute list or NULL is allowed */
493 COND_FAIL(!(attribList && *attribList != WFC_NONE),
494 WFC_ERROR_BAD_ATTRIBUTE,
497 GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE);
498 COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream,
499 WFC_ERROR_ILLEGAL_ARGUMENT,
502 internalStream=owfNativeStreamFromWFC(stream,&streamError);
503 COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE);
504 COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE);
506 inUse = WFC_Device_StreamIsTarget(device, internalStream);
509 owfNativeStreamDestroy(internalStream);
510 FAIL( WFC_ERROR_IN_USE, WFC_INVALID_HANDLE);
513 mask = WFC_Device_CreateMask(device, context, internalStream);
514 owfNativeStreamDestroy(internalStream); /*cancel FromWFC reference increase*/
515 COND_FAIL(NULL != mask, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
517 SUCCEED(mask->handle);
520 WFC_API_CALL void WFC_APIENTRY
521 wfcDestroyMask(WFCDevice dev,
522 WFCMask mask) WFC_APIEXIT
527 GET_DEVICE_NR(device, dev);
529 error = WFC_Device_DestroyMask(device, mask);
534 /*=========================================================================*/
535 /* 7. COMPOSITION ELEMENTS */
536 /*=========================================================================*/
538 WFC_API_CALL WFCElement WFC_APIENTRY
539 wfcCreateElement(WFCDevice dev,
541 const WFCint* attribList) WFC_APIEXIT
544 WFC_ELEMENT* element;
545 WFC_CONTEXT* context;
547 GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
549 /* currently only empty attribute list or NULL is allowed */
550 COND_FAIL(!(attribList && *attribList != WFC_NONE),
551 WFC_ERROR_BAD_ATTRIBUTE,
554 GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE);
556 element = WFC_Device_CreateElement(device, context);
557 COND_FAIL(NULL != element, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
559 SUCCEED(element->handle);
562 WFC_API_CALL void WFC_APIENTRY
563 wfcDestroyElement(WFCDevice dev,
564 WFCElement element) WFC_APIEXIT
567 WFCErrorCode error = WFC_ERROR_BAD_HANDLE;
569 GET_DEVICE_NR(device, dev);
571 error = WFC_Device_DestroyElement(device, element);
576 #define ATTR_FUNC_PROLOGUE \
577 WFCErrorCode error; \
578 WFC_DEVICE* device; \
580 GET_DEVICE(device, dev, 0)
582 #define ATTR_FUNC_PROLOGUE_NR \
583 WFCErrorCode error; \
584 WFC_DEVICE* device; \
586 GET_DEVICE_NR(device, dev)
588 #define ATTR_FUNC_EPILOGUE(x) \
591 #define ATTR_FUNC_EPILOGUE_NR \
594 WFC_API_CALL WFCint WFC_APIENTRY
595 wfcGetElementAttribi(WFCDevice dev,
597 WFCElementAttrib attrib) WFC_APIEXIT
603 error = WFC_Device_GetElementAttribiv(device, element, attrib, 1, &value);
605 ATTR_FUNC_EPILOGUE(value);
608 WFC_API_CALL WFCfloat WFC_APIENTRY
609 wfcGetElementAttribf(WFCDevice dev,
611 WFCElementAttrib attrib) WFC_APIEXIT
617 COND_FAIL(WFC_ELEMENT_GLOBAL_ALPHA == attrib,
618 WFC_ERROR_BAD_ATTRIBUTE,
621 error = WFC_Device_GetElementAttribfv(device, element, attrib, 1, &value);
623 /* value is [0, OWF_ALPHA_MAX_VALUE], map to [0, 1] */
624 value = value / OWF_ALPHA_MAX_VALUE;
626 ATTR_FUNC_EPILOGUE(value);
629 WFC_API_CALL void WFC_APIENTRY
630 wfcGetElementAttribiv(WFCDevice dev,
632 WFCElementAttrib attrib,
634 WFCint *values) WFC_APIEXIT
636 ATTR_FUNC_PROLOGUE_NR;
638 COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib ||
639 WFC_ELEMENT_DESTINATION_RECTANGLE == attrib,
640 WFC_ERROR_BAD_ATTRIBUTE);
642 error = WFC_Device_GetElementAttribiv(device, element, attrib, count,
644 ATTR_FUNC_EPILOGUE_NR;
647 WFC_API_CALL void WFC_APIENTRY
648 wfcGetElementAttribfv(WFCDevice dev,
650 WFCElementAttrib attrib,
652 WFCfloat *values) WFC_APIEXIT
654 ATTR_FUNC_PROLOGUE_NR;
656 COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib ||
657 WFC_ELEMENT_DESTINATION_RECTANGLE == attrib,
658 WFC_ERROR_BAD_ATTRIBUTE);
660 error = WFC_Device_GetElementAttribfv(device, element, attrib, count,
663 ATTR_FUNC_EPILOGUE_NR;
666 WFC_API_CALL void WFC_APIENTRY
667 wfcSetElementAttribi(WFCDevice dev,
669 WFCElementAttrib attrib,
670 WFCint value) WFC_APIEXIT
672 ATTR_FUNC_PROLOGUE_NR;
674 error = WFC_Device_SetElementAttribiv(device, element, attrib, 1, &value);
676 ATTR_FUNC_EPILOGUE_NR;
679 WFC_API_CALL void WFC_APIENTRY
680 wfcSetElementAttribf(WFCDevice dev,
682 WFCElementAttrib attrib,
683 WFCfloat value) WFC_APIEXIT
685 ATTR_FUNC_PROLOGUE_NR;
687 COND_FAIL_NR(WFC_ELEMENT_GLOBAL_ALPHA == attrib,
688 WFC_ERROR_BAD_ATTRIBUTE);
690 error = WFC_Device_SetElementAttribfv(device, element, attrib, 1, &value);
692 ATTR_FUNC_EPILOGUE_NR;
695 WFC_API_CALL void WFC_APIENTRY
696 wfcSetElementAttribiv(WFCDevice dev,
698 WFCElementAttrib attrib,
700 const WFCint *values) WFC_APIEXIT
702 ATTR_FUNC_PROLOGUE_NR;
704 COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib ||
705 WFC_ELEMENT_DESTINATION_RECTANGLE == attrib,
706 WFC_ERROR_BAD_ATTRIBUTE);
708 error = WFC_Device_SetElementAttribiv(device, element, attrib, count,
711 ATTR_FUNC_EPILOGUE_NR;
714 WFC_API_CALL void WFC_APIENTRY
715 wfcSetElementAttribfv(WFCDevice dev,
717 WFCElementAttrib attrib,
719 const WFCfloat *values) WFC_APIEXIT
721 ATTR_FUNC_PROLOGUE_NR;
723 COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib ||
724 WFC_ELEMENT_DESTINATION_RECTANGLE == attrib,
725 WFC_ERROR_BAD_ATTRIBUTE);
727 error = WFC_Device_SetElementAttribfv(device, element, attrib, count,
730 ATTR_FUNC_EPILOGUE_NR;
733 WFC_API_CALL void WFC_APIENTRY
734 wfcInsertElement(WFCDevice dev,
736 WFCElement subordinate) WFC_APIEXIT
739 WFC_ELEMENT* elemento;
742 GET_DEVICE_NR(device, dev);
745 - element is inserted immediately above subordinate
746 - if subordinate is NULL, then element will go to bottom
747 - both elements must be in the same scene (context)
749 elemento = WFC_Device_FindElement(device, element);
750 COND_FAIL_NR(WFC_INVALID_HANDLE != elemento, WFC_ERROR_BAD_HANDLE);
752 error = WFC_Context_InsertElement(CONTEXT(elemento->context),
759 WFC_API_CALL void WFC_APIENTRY
760 wfcRemoveElement(WFCDevice dev,
761 WFCElement element) WFC_APIEXIT
764 WFC_ELEMENT* elemento;
767 GET_DEVICE_NR(device, dev);
769 elemento = WFC_Device_FindElement(device, element);
770 COND_FAIL_NR(WFC_INVALID_HANDLE != elemento, WFC_ERROR_BAD_HANDLE);
772 error = WFC_Context_RemoveElement(CONTEXT(elemento->context), element);
777 WFC_API_CALL WFCElement WFC_APIENTRY
778 wfcGetElementAbove(WFCDevice dev, WFCElement element) WFC_APIEXIT
780 WFC_DEVICE* device = NULL;
781 WFC_ELEMENT* elemento = NULL;
782 WFCElement result = WFC_INVALID_HANDLE;
783 WFCErrorCode error = WFC_ERROR_NONE;
785 GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
787 elemento = WFC_Device_FindElement(device, element);
788 COND_FAIL(WFC_INVALID_HANDLE != elemento,
789 WFC_ERROR_BAD_HANDLE,
792 error = WFC_Context_GetElementAbove(CONTEXT(elemento->context),
799 WFC_API_CALL WFCElement WFC_APIENTRY
800 wfcGetElementBelow(WFCDevice dev, WFCElement element) WFC_APIEXIT
802 WFC_DEVICE* device = NULL;
803 WFC_ELEMENT* elemento = NULL;
804 WFCElement result = WFC_INVALID_HANDLE;
805 WFCErrorCode error = WFC_ERROR_NONE;
807 GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
809 elemento = WFC_Device_FindElement(device, element);
810 COND_FAIL(WFC_INVALID_HANDLE != elemento,
811 WFC_ERROR_BAD_HANDLE,
814 error = WFC_Context_GetElementBelow(CONTEXT(elemento->context),
821 /*=========================================================================*/
823 /*=========================================================================*/
825 WFC_API_CALL void WFC_APIENTRY
826 wfcActivate(WFCDevice dev,
827 WFCContext ctx) WFC_APIEXIT
830 WFC_CONTEXT* context;
832 GET_DEVICE_NR(device, dev);
833 GET_CONTEXT_NR(context, device, ctx);
835 WFC_Context_Activate(context, WFC_TRUE);
840 WFC_API_CALL void WFC_APIENTRY
841 wfcDeactivate(WFCDevice dev,
842 WFCContext ctx) WFC_APIEXIT
845 WFC_CONTEXT* context;
847 GET_DEVICE_NR(device, dev);
848 GET_CONTEXT_NR(context, device, ctx);
850 WFC_Context_Activate(context, WFC_FALSE);
855 WFC_API_CALL void WFC_APIENTRY
856 wfcCompose(WFCDevice dev,
858 WFCboolean wait) WFC_APIEXIT
861 WFC_CONTEXT* context;
864 GET_DEVICE_NR(device, dev);
865 GET_CONTEXT_NR(context, device, ctx);
867 /* context must not be active */
868 COND_FAIL_NR(!WFC_Context_Active(context), WFC_ERROR_UNSUPPORTED);
870 /* send composition request */
871 able = WFC_Context_InvokeComposition(device, context, wait);
872 COND_FAIL_NR(WFC_TRUE == able, WFC_ERROR_BUSY);
878 /*=========================================================================*/
879 /* 9. SYNCHRONIZATION */
880 /*=========================================================================*/
882 WFC_API_CALL void WFC_APIENTRY
883 wfcFence(WFCDevice dev,
889 WFC_CONTEXT* context;
891 DPRINT(("wfcFence(%08x,%08x,%08x)", dev, ctx, sync));
893 GET_DEVICE_NR(device, dev);
894 DPRINT((" device = %p", device));
896 GET_CONTEXT_NR(context, device, ctx);
897 DPRINT((" context = %p", context));
899 /* unsignal sync object first */
900 OWF_ASSERT(context->eglPrivateSignalSync);
901 if ( !(context->eglPrivateSignalSync((EGLDisplay)dpy, sync, EGL_UNSIGNALED_KHR)) )
903 FAIL_NR(WFC_ERROR_ILLEGAL_ARGUMENT);
906 /* insert fence 'token' to command stream */
907 WFC_Context_InsertFence(context, dpy, sync);
911 /*=========================================================================*/
912 /* 10. EXTENSION SUPPORT */
913 /*=========================================================================*/
915 WFC_API_CALL WFCint WFC_APIENTRY
916 wfcGetStrings(WFCDevice dev,
918 const char **strings,
919 WFCint stringsCount) WFC_APIEXIT
925 GET_DEVICE(pDevice, dev, 0);
926 COND_FAIL(stringsCount >= 0, WFC_ERROR_ILLEGAL_ARGUMENT, 0);
932 tmp = &wfc_strings[WFC_VENDOR_INDEX];
937 tmp = &wfc_strings[WFC_RENDERER_INDEX];
942 tmp = &wfc_strings[WFC_VERSION_INDEX];
946 tmp = &wfc_extensions[0];
947 /* we know that wfc_extensions always has NULL as the last member
948 so this loop will never exceed the size of tmp */
949 /* coverity[overrun-local] */
950 for (retVal=0; tmp[retVal] != NULL; retVal++)
952 /* get extensions array size */
957 FAIL(WFC_ERROR_ILLEGAL_ARGUMENT, 0);
964 if (stringsCount < retVal)
966 retVal = stringsCount;
968 for (i=0; i<retVal; i++)
977 WFC_API_CALL WFCboolean WFC_APIENTRY
978 wfcIsExtensionSupported(WFCDevice dev,
979 const char *string) WFC_APIEXIT
983 WFCboolean retVal = WFC_FALSE;
985 GET_DEVICE(pDevice, dev, retVal);
986 /* Bad param does not update device error state */
987 COND_FAIL(string,WFC_ERROR_NONE,retVal);
989 for (i=0; wfc_extensions[i] != NULL; i++)
991 if (strcmp(string, wfc_extensions[i])==0)
1001 /*=========================================================================*/
1002 /* 11. TEST ONLY API FOR ON SCREEN IMAGE EXPORTING */
1003 /*=========================================================================*/
1005 WFC_API_CALL WFCNativeStreamType WFC_APIENTRY
1006 extwfcGetOnScreenStream(WFCDevice dev, WFCContext ctx) WFC_APIEXIT
1009 WFC_CONTEXT* context;
1011 GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
1012 DPRINT((" device = %p", device));
1014 GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE);
1015 DPRINT((" context = %p", context));
1017 /* Protect context's target stream from being destroyed by the user
1018 * WFC_CONTEXT_Dtor will reset this flag. */
1019 owfNativeStreamSetProtectionFlag(context->stream, OWF_TRUE);
1021 OWF_DisplayContext_FlagInternalStreamAccessed(context->displayContext);
1023 SUCCEED(context->stream);