1 /*************************************************************************/ /*!
3 @Title Server bridge for rgxta3d
4 @Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
5 @Description Implements the server side of the bridge for rgxta3d
6 @License Dual MIT/GPLv2
8 The contents of this file are subject to the MIT license as set out below.
10 Permission is hereby granted, free of charge, to any person obtaining a copy
11 of this software and associated documentation files (the "Software"), to deal
12 in the Software without restriction, including without limitation the rights
13 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 copies of the Software, and to permit persons to whom the Software is
15 furnished to do so, subject to the following conditions:
17 The above copyright notice and this permission notice shall be included in
18 all copies or substantial portions of the Software.
20 Alternatively, the contents of this file may be used under the terms of
21 the GNU General Public License Version 2 ("GPL") in which case the provisions
22 of GPL are applicable instead of those above.
24 If you wish to allow use of your version of this file only under the terms of
25 GPL, and not to allow others to use your version of this file under the terms
26 of the MIT license, indicate your decision by deleting the provisions above
27 and replace them with the notice and other provisions required by GPL as set
28 out in the file called "GPL-COPYING" included in this distribution. If you do
29 not delete the provisions above, a recipient may use your version of this file
30 under the terms of either the MIT license or GPL.
32 This License is also included in this distribution in the file called
35 EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
36 PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
37 BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
38 PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
39 COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
40 IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
41 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
42 */ /**************************************************************************/
45 #include <asm/uaccess.h>
52 #include "common_rgxta3d_bridge.h"
55 #include "pvr_debug.h"
56 #include "connection_server.h"
57 #include "pvr_bridge.h"
58 #include "rgx_bridge.h"
62 #include <linux/slab.h>
69 /* ***************************************************************************
70 * Server-side bridge entry points
74 PVRSRVBridgeRGXCreateHWRTData(IMG_UINT32 ui32DispatchTableEntry,
75 PVRSRV_BRIDGE_IN_RGXCREATEHWRTDATA *psRGXCreateHWRTDataIN,
76 PVRSRV_BRIDGE_OUT_RGXCREATEHWRTDATA *psRGXCreateHWRTDataOUT,
77 CONNECTION_DATA *psConnection)
79 RGX_FREELIST * *psapsFreeListsInt = NULL;
80 IMG_HANDLE *hapsFreeListsInt2 = NULL;
81 RGX_RTDATA_CLEANUP_DATA * psCleanupCookieInt = NULL;
82 DEVMEM_MEMDESC * psRTACtlMemDescInt = NULL;
83 DEVMEM_MEMDESC * pssHWRTDataMemDescInt = NULL;
85 IMG_UINT32 ui32NextOffset = 0;
86 IMG_BYTE *pArrayArgsBuffer = NULL;
87 #if !defined(INTEGRITY_OS)
88 IMG_BOOL bHaveEnoughSpace = IMG_FALSE;
91 IMG_UINT32 ui32BufferSize =
92 (RGXFW_MAX_FREELISTS * sizeof(RGX_FREELIST *)) +
93 (RGXFW_MAX_FREELISTS * sizeof(IMG_HANDLE)) +
99 psRGXCreateHWRTDataOUT->hCleanupCookie = NULL;
101 if (ui32BufferSize != 0)
103 #if !defined(INTEGRITY_OS)
104 /* Try to use remainder of input buffer for copies if possible, word-aligned for safety. */
105 IMG_UINT32 ui32InBufferOffset = PVR_ALIGN(sizeof(*psRGXCreateHWRTDataIN), sizeof(unsigned long));
106 IMG_UINT32 ui32InBufferExcessSize = ui32InBufferOffset >= PVRSRV_MAX_BRIDGE_IN_SIZE ? 0 :
107 PVRSRV_MAX_BRIDGE_IN_SIZE - ui32InBufferOffset;
109 bHaveEnoughSpace = ui32BufferSize <= ui32InBufferExcessSize;
110 if (bHaveEnoughSpace)
112 IMG_BYTE *pInputBuffer = (IMG_BYTE *)psRGXCreateHWRTDataIN;
114 pArrayArgsBuffer = &pInputBuffer[ui32InBufferOffset]; }
118 pArrayArgsBuffer = OSAllocMemNoStats(ui32BufferSize);
120 if(!pArrayArgsBuffer)
122 psRGXCreateHWRTDataOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
123 goto RGXCreateHWRTData_exit;
130 psapsFreeListsInt = (RGX_FREELIST **)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
131 ui32NextOffset += RGXFW_MAX_FREELISTS * sizeof(RGX_FREELIST *);
132 hapsFreeListsInt2 = (IMG_HANDLE *)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
133 ui32NextOffset += RGXFW_MAX_FREELISTS * sizeof(IMG_HANDLE);
136 /* Copy the data over */
137 if (RGXFW_MAX_FREELISTS * sizeof(IMG_HANDLE) > 0)
139 if ( OSCopyFromUser(NULL, hapsFreeListsInt2, psRGXCreateHWRTDataIN->phapsFreeLists, RGXFW_MAX_FREELISTS * sizeof(IMG_HANDLE)) != PVRSRV_OK )
141 psRGXCreateHWRTDataOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
143 goto RGXCreateHWRTData_exit;
147 /* Lock over handle lookup. */
157 for (i=0;i<RGXFW_MAX_FREELISTS;i++)
160 /* Look up the address from the handle */
161 psRGXCreateHWRTDataOUT->eError =
162 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
163 (void **) &psapsFreeListsInt[i],
164 hapsFreeListsInt2[i],
165 PVRSRV_HANDLE_TYPE_RGX_FREELIST,
167 if(psRGXCreateHWRTDataOUT->eError != PVRSRV_OK)
170 goto RGXCreateHWRTData_exit;
175 /* Release now we have looked up handles. */
178 psRGXCreateHWRTDataOUT->eError =
179 RGXCreateHWRTData(psConnection, OSGetDevData(psConnection),
180 psRGXCreateHWRTDataIN->ui32RenderTarget,
181 psRGXCreateHWRTDataIN->sPMMlistDevVAddr,
182 psRGXCreateHWRTDataIN->sVFPPageTableAddr,
186 psRGXCreateHWRTDataIN->ui32PPPScreen,
187 psRGXCreateHWRTDataIN->ui32PPPGridOffset,
188 psRGXCreateHWRTDataIN->ui64PPPMultiSampleCtl,
189 psRGXCreateHWRTDataIN->ui32TPCStride,
190 psRGXCreateHWRTDataIN->sTailPtrsDevVAddr,
191 psRGXCreateHWRTDataIN->ui32TPCSize,
192 psRGXCreateHWRTDataIN->ui32TEScreen,
193 psRGXCreateHWRTDataIN->ui32TEAA,
194 psRGXCreateHWRTDataIN->ui32TEMTILE1,
195 psRGXCreateHWRTDataIN->ui32TEMTILE2,
196 psRGXCreateHWRTDataIN->ui32MTileStride,
197 psRGXCreateHWRTDataIN->ui32ui32ISPMergeLowerX,
198 psRGXCreateHWRTDataIN->ui32ui32ISPMergeLowerY,
199 psRGXCreateHWRTDataIN->ui32ui32ISPMergeUpperX,
200 psRGXCreateHWRTDataIN->ui32ui32ISPMergeUpperY,
201 psRGXCreateHWRTDataIN->ui32ui32ISPMergeScaleX,
202 psRGXCreateHWRTDataIN->ui32ui32ISPMergeScaleY,
203 psRGXCreateHWRTDataIN->ui16MaxRTs,
204 &pssHWRTDataMemDescInt,
205 &psRGXCreateHWRTDataOUT->ui32FWHWRTData);
206 /* Exit early if bridged call fails */
207 if(psRGXCreateHWRTDataOUT->eError != PVRSRV_OK)
209 goto RGXCreateHWRTData_exit;
212 /* Lock over handle creation. */
219 psRGXCreateHWRTDataOUT->eError = PVRSRVAllocHandleUnlocked(psConnection->psHandleBase,
221 &psRGXCreateHWRTDataOUT->hCleanupCookie,
222 (void *) psCleanupCookieInt,
223 PVRSRV_HANDLE_TYPE_RGX_RTDATA_CLEANUP,
224 PVRSRV_HANDLE_ALLOC_FLAG_MULTI
225 ,(PFN_HANDLE_RELEASE)&RGXDestroyHWRTData);
226 if (psRGXCreateHWRTDataOUT->eError != PVRSRV_OK)
229 goto RGXCreateHWRTData_exit;
237 psRGXCreateHWRTDataOUT->eError = PVRSRVAllocSubHandleUnlocked(psConnection->psHandleBase,
239 &psRGXCreateHWRTDataOUT->hRTACtlMemDesc,
240 (void *) psRTACtlMemDescInt,
241 PVRSRV_HANDLE_TYPE_RGX_FW_MEMDESC,
242 PVRSRV_HANDLE_ALLOC_FLAG_NONE
243 ,psRGXCreateHWRTDataOUT->hCleanupCookie);
244 if (psRGXCreateHWRTDataOUT->eError != PVRSRV_OK)
247 goto RGXCreateHWRTData_exit;
255 psRGXCreateHWRTDataOUT->eError = PVRSRVAllocSubHandleUnlocked(psConnection->psHandleBase,
257 &psRGXCreateHWRTDataOUT->hsHWRTDataMemDesc,
258 (void *) pssHWRTDataMemDescInt,
259 PVRSRV_HANDLE_TYPE_RGX_FW_MEMDESC,
260 PVRSRV_HANDLE_ALLOC_FLAG_NONE
261 ,psRGXCreateHWRTDataOUT->hCleanupCookie);
262 if (psRGXCreateHWRTDataOUT->eError != PVRSRV_OK)
265 goto RGXCreateHWRTData_exit;
268 /* Release now we have created handles. */
273 RGXCreateHWRTData_exit:
275 /* Lock over handle lookup cleanup. */
286 for (i=0;i<RGXFW_MAX_FREELISTS;i++)
289 /* Unreference the previously looked up handle */
290 if(psapsFreeListsInt[i])
292 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
293 hapsFreeListsInt2[i],
294 PVRSRV_HANDLE_TYPE_RGX_FREELIST);
299 /* Release now we have cleaned up look up handles. */
302 if (psRGXCreateHWRTDataOUT->eError != PVRSRV_OK)
304 /* Lock over handle creation cleanup. */
306 if (psRGXCreateHWRTDataOUT->hCleanupCookie)
310 PVRSRV_ERROR eError = PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
311 (IMG_HANDLE) psRGXCreateHWRTDataOUT->hCleanupCookie,
312 PVRSRV_HANDLE_TYPE_RGX_RTDATA_CLEANUP);
313 if ((eError != PVRSRV_OK) && (eError != PVRSRV_ERROR_RETRY))
315 PVR_DPF((PVR_DBG_ERROR,
316 "PVRSRVBridgeRGXCreateHWRTData: %s",
317 PVRSRVGetErrorStringKM(eError)));
319 /* Releasing the handle should free/destroy/release the resource.
320 * This should never fail... */
321 PVR_ASSERT((eError == PVRSRV_OK) || (eError == PVRSRV_ERROR_RETRY));
323 /* Avoid freeing/destroying/releasing the resource a second time below */
324 psCleanupCookieInt = NULL;
328 /* Release now we have cleaned up creation handles. */
330 if (psCleanupCookieInt)
332 RGXDestroyHWRTData(psCleanupCookieInt);
336 /* Allocated space should be equal to the last updated offset */
337 PVR_ASSERT(ui32BufferSize == ui32NextOffset);
339 #if defined(INTEGRITY_OS)
342 if(!bHaveEnoughSpace && pArrayArgsBuffer)
344 OSFreeMemNoStats(pArrayArgsBuffer);
352 PVRSRVBridgeRGXDestroyHWRTData(IMG_UINT32 ui32DispatchTableEntry,
353 PVRSRV_BRIDGE_IN_RGXDESTROYHWRTDATA *psRGXDestroyHWRTDataIN,
354 PVRSRV_BRIDGE_OUT_RGXDESTROYHWRTDATA *psRGXDestroyHWRTDataOUT,
355 CONNECTION_DATA *psConnection)
366 /* Lock over handle destruction. */
373 psRGXDestroyHWRTDataOUT->eError =
374 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
375 (IMG_HANDLE) psRGXDestroyHWRTDataIN->hCleanupCookie,
376 PVRSRV_HANDLE_TYPE_RGX_RTDATA_CLEANUP);
377 if ((psRGXDestroyHWRTDataOUT->eError != PVRSRV_OK) &&
378 (psRGXDestroyHWRTDataOUT->eError != PVRSRV_ERROR_RETRY))
380 PVR_DPF((PVR_DBG_ERROR,
381 "PVRSRVBridgeRGXDestroyHWRTData: %s",
382 PVRSRVGetErrorStringKM(psRGXDestroyHWRTDataOUT->eError)));
385 goto RGXDestroyHWRTData_exit;
388 /* Release now we have destroyed handles. */
393 RGXDestroyHWRTData_exit:
403 PVRSRVBridgeRGXCreateRenderTarget(IMG_UINT32 ui32DispatchTableEntry,
404 PVRSRV_BRIDGE_IN_RGXCREATERENDERTARGET *psRGXCreateRenderTargetIN,
405 PVRSRV_BRIDGE_OUT_RGXCREATERENDERTARGET *psRGXCreateRenderTargetOUT,
406 CONNECTION_DATA *psConnection)
408 RGX_RT_CLEANUP_DATA * pssRenderTargetMemDescInt = NULL;
417 psRGXCreateRenderTargetOUT->eError =
418 RGXCreateRenderTarget(psConnection, OSGetDevData(psConnection),
419 psRGXCreateRenderTargetIN->spsVHeapTableDevVAddr,
420 &pssRenderTargetMemDescInt,
421 &psRGXCreateRenderTargetOUT->ui32sRenderTargetFWDevVAddr);
422 /* Exit early if bridged call fails */
423 if(psRGXCreateRenderTargetOUT->eError != PVRSRV_OK)
425 goto RGXCreateRenderTarget_exit;
428 /* Lock over handle creation. */
435 psRGXCreateRenderTargetOUT->eError = PVRSRVAllocHandleUnlocked(psConnection->psHandleBase,
437 &psRGXCreateRenderTargetOUT->hsRenderTargetMemDesc,
438 (void *) pssRenderTargetMemDescInt,
439 PVRSRV_HANDLE_TYPE_RGX_FWIF_RENDERTARGET,
440 PVRSRV_HANDLE_ALLOC_FLAG_MULTI
441 ,(PFN_HANDLE_RELEASE)&RGXDestroyRenderTarget);
442 if (psRGXCreateRenderTargetOUT->eError != PVRSRV_OK)
445 goto RGXCreateRenderTarget_exit;
448 /* Release now we have created handles. */
453 RGXCreateRenderTarget_exit:
457 if (psRGXCreateRenderTargetOUT->eError != PVRSRV_OK)
459 if (pssRenderTargetMemDescInt)
461 RGXDestroyRenderTarget(pssRenderTargetMemDescInt);
471 PVRSRVBridgeRGXDestroyRenderTarget(IMG_UINT32 ui32DispatchTableEntry,
472 PVRSRV_BRIDGE_IN_RGXDESTROYRENDERTARGET *psRGXDestroyRenderTargetIN,
473 PVRSRV_BRIDGE_OUT_RGXDESTROYRENDERTARGET *psRGXDestroyRenderTargetOUT,
474 CONNECTION_DATA *psConnection)
485 /* Lock over handle destruction. */
492 psRGXDestroyRenderTargetOUT->eError =
493 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
494 (IMG_HANDLE) psRGXDestroyRenderTargetIN->hsRenderTargetMemDesc,
495 PVRSRV_HANDLE_TYPE_RGX_FWIF_RENDERTARGET);
496 if ((psRGXDestroyRenderTargetOUT->eError != PVRSRV_OK) &&
497 (psRGXDestroyRenderTargetOUT->eError != PVRSRV_ERROR_RETRY))
499 PVR_DPF((PVR_DBG_ERROR,
500 "PVRSRVBridgeRGXDestroyRenderTarget: %s",
501 PVRSRVGetErrorStringKM(psRGXDestroyRenderTargetOUT->eError)));
504 goto RGXDestroyRenderTarget_exit;
507 /* Release now we have destroyed handles. */
512 RGXDestroyRenderTarget_exit:
522 PVRSRVBridgeRGXCreateZSBuffer(IMG_UINT32 ui32DispatchTableEntry,
523 PVRSRV_BRIDGE_IN_RGXCREATEZSBUFFER *psRGXCreateZSBufferIN,
524 PVRSRV_BRIDGE_OUT_RGXCREATEZSBUFFER *psRGXCreateZSBufferOUT,
525 CONNECTION_DATA *psConnection)
527 IMG_HANDLE hReservation = psRGXCreateZSBufferIN->hReservation;
528 DEVMEMINT_RESERVATION * psReservationInt = NULL;
529 IMG_HANDLE hPMR = psRGXCreateZSBufferIN->hPMR;
530 PMR * psPMRInt = NULL;
531 RGX_ZSBUFFER_DATA * pssZSBufferKMInt = NULL;
539 /* Lock over handle lookup. */
547 /* Look up the address from the handle */
548 psRGXCreateZSBufferOUT->eError =
549 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
550 (void **) &psReservationInt,
552 PVRSRV_HANDLE_TYPE_DEVMEMINT_RESERVATION,
554 if(psRGXCreateZSBufferOUT->eError != PVRSRV_OK)
557 goto RGXCreateZSBuffer_exit;
566 /* Look up the address from the handle */
567 psRGXCreateZSBufferOUT->eError =
568 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
571 PVRSRV_HANDLE_TYPE_PHYSMEM_PMR,
573 if(psRGXCreateZSBufferOUT->eError != PVRSRV_OK)
576 goto RGXCreateZSBuffer_exit;
579 /* Release now we have looked up handles. */
582 psRGXCreateZSBufferOUT->eError =
583 RGXCreateZSBufferKM(psConnection, OSGetDevData(psConnection),
586 psRGXCreateZSBufferIN->uiMapFlags,
588 &psRGXCreateZSBufferOUT->ui32sZSBufferFWDevVAddr);
589 /* Exit early if bridged call fails */
590 if(psRGXCreateZSBufferOUT->eError != PVRSRV_OK)
592 goto RGXCreateZSBuffer_exit;
595 /* Lock over handle creation. */
602 psRGXCreateZSBufferOUT->eError = PVRSRVAllocHandleUnlocked(psConnection->psHandleBase,
604 &psRGXCreateZSBufferOUT->hsZSBufferKM,
605 (void *) pssZSBufferKMInt,
606 PVRSRV_HANDLE_TYPE_RGX_FWIF_ZSBUFFER,
607 PVRSRV_HANDLE_ALLOC_FLAG_MULTI
608 ,(PFN_HANDLE_RELEASE)&RGXDestroyZSBufferKM);
609 if (psRGXCreateZSBufferOUT->eError != PVRSRV_OK)
612 goto RGXCreateZSBuffer_exit;
615 /* Release now we have created handles. */
620 RGXCreateZSBuffer_exit:
622 /* Lock over handle lookup cleanup. */
631 /* Unreference the previously looked up handle */
634 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
636 PVRSRV_HANDLE_TYPE_DEVMEMINT_RESERVATION);
645 /* Unreference the previously looked up handle */
648 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
650 PVRSRV_HANDLE_TYPE_PHYSMEM_PMR);
653 /* Release now we have cleaned up look up handles. */
656 if (psRGXCreateZSBufferOUT->eError != PVRSRV_OK)
658 if (pssZSBufferKMInt)
660 RGXDestroyZSBufferKM(pssZSBufferKMInt);
670 PVRSRVBridgeRGXDestroyZSBuffer(IMG_UINT32 ui32DispatchTableEntry,
671 PVRSRV_BRIDGE_IN_RGXDESTROYZSBUFFER *psRGXDestroyZSBufferIN,
672 PVRSRV_BRIDGE_OUT_RGXDESTROYZSBUFFER *psRGXDestroyZSBufferOUT,
673 CONNECTION_DATA *psConnection)
684 /* Lock over handle destruction. */
691 psRGXDestroyZSBufferOUT->eError =
692 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
693 (IMG_HANDLE) psRGXDestroyZSBufferIN->hsZSBufferMemDesc,
694 PVRSRV_HANDLE_TYPE_RGX_FWIF_ZSBUFFER);
695 if ((psRGXDestroyZSBufferOUT->eError != PVRSRV_OK) &&
696 (psRGXDestroyZSBufferOUT->eError != PVRSRV_ERROR_RETRY))
698 PVR_DPF((PVR_DBG_ERROR,
699 "PVRSRVBridgeRGXDestroyZSBuffer: %s",
700 PVRSRVGetErrorStringKM(psRGXDestroyZSBufferOUT->eError)));
703 goto RGXDestroyZSBuffer_exit;
706 /* Release now we have destroyed handles. */
711 RGXDestroyZSBuffer_exit:
721 PVRSRVBridgeRGXPopulateZSBuffer(IMG_UINT32 ui32DispatchTableEntry,
722 PVRSRV_BRIDGE_IN_RGXPOPULATEZSBUFFER *psRGXPopulateZSBufferIN,
723 PVRSRV_BRIDGE_OUT_RGXPOPULATEZSBUFFER *psRGXPopulateZSBufferOUT,
724 CONNECTION_DATA *psConnection)
726 IMG_HANDLE hsZSBufferKM = psRGXPopulateZSBufferIN->hsZSBufferKM;
727 RGX_ZSBUFFER_DATA * pssZSBufferKMInt = NULL;
728 RGX_POPULATION * pssPopulationInt = NULL;
736 /* Lock over handle lookup. */
744 /* Look up the address from the handle */
745 psRGXPopulateZSBufferOUT->eError =
746 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
747 (void **) &pssZSBufferKMInt,
749 PVRSRV_HANDLE_TYPE_RGX_FWIF_ZSBUFFER,
751 if(psRGXPopulateZSBufferOUT->eError != PVRSRV_OK)
754 goto RGXPopulateZSBuffer_exit;
757 /* Release now we have looked up handles. */
760 psRGXPopulateZSBufferOUT->eError =
761 RGXPopulateZSBufferKM(
764 /* Exit early if bridged call fails */
765 if(psRGXPopulateZSBufferOUT->eError != PVRSRV_OK)
767 goto RGXPopulateZSBuffer_exit;
770 /* Lock over handle creation. */
777 psRGXPopulateZSBufferOUT->eError = PVRSRVAllocHandleUnlocked(psConnection->psHandleBase,
779 &psRGXPopulateZSBufferOUT->hsPopulation,
780 (void *) pssPopulationInt,
781 PVRSRV_HANDLE_TYPE_RGX_POPULATION,
782 PVRSRV_HANDLE_ALLOC_FLAG_MULTI
783 ,(PFN_HANDLE_RELEASE)&RGXUnpopulateZSBufferKM);
784 if (psRGXPopulateZSBufferOUT->eError != PVRSRV_OK)
787 goto RGXPopulateZSBuffer_exit;
790 /* Release now we have created handles. */
795 RGXPopulateZSBuffer_exit:
797 /* Lock over handle lookup cleanup. */
806 /* Unreference the previously looked up handle */
809 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
811 PVRSRV_HANDLE_TYPE_RGX_FWIF_ZSBUFFER);
814 /* Release now we have cleaned up look up handles. */
817 if (psRGXPopulateZSBufferOUT->eError != PVRSRV_OK)
819 if (pssPopulationInt)
821 RGXUnpopulateZSBufferKM(pssPopulationInt);
831 PVRSRVBridgeRGXUnpopulateZSBuffer(IMG_UINT32 ui32DispatchTableEntry,
832 PVRSRV_BRIDGE_IN_RGXUNPOPULATEZSBUFFER *psRGXUnpopulateZSBufferIN,
833 PVRSRV_BRIDGE_OUT_RGXUNPOPULATEZSBUFFER *psRGXUnpopulateZSBufferOUT,
834 CONNECTION_DATA *psConnection)
845 /* Lock over handle destruction. */
852 psRGXUnpopulateZSBufferOUT->eError =
853 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
854 (IMG_HANDLE) psRGXUnpopulateZSBufferIN->hsPopulation,
855 PVRSRV_HANDLE_TYPE_RGX_POPULATION);
856 if ((psRGXUnpopulateZSBufferOUT->eError != PVRSRV_OK) &&
857 (psRGXUnpopulateZSBufferOUT->eError != PVRSRV_ERROR_RETRY))
859 PVR_DPF((PVR_DBG_ERROR,
860 "PVRSRVBridgeRGXUnpopulateZSBuffer: %s",
861 PVRSRVGetErrorStringKM(psRGXUnpopulateZSBufferOUT->eError)));
864 goto RGXUnpopulateZSBuffer_exit;
867 /* Release now we have destroyed handles. */
872 RGXUnpopulateZSBuffer_exit:
882 PVRSRVBridgeRGXCreateFreeList(IMG_UINT32 ui32DispatchTableEntry,
883 PVRSRV_BRIDGE_IN_RGXCREATEFREELIST *psRGXCreateFreeListIN,
884 PVRSRV_BRIDGE_OUT_RGXCREATEFREELIST *psRGXCreateFreeListOUT,
885 CONNECTION_DATA *psConnection)
887 IMG_HANDLE hsGlobalFreeList = psRGXCreateFreeListIN->hsGlobalFreeList;
888 RGX_FREELIST * pssGlobalFreeListInt = NULL;
889 IMG_HANDLE hsFreeListPMR = psRGXCreateFreeListIN->hsFreeListPMR;
890 PMR * pssFreeListPMRInt = NULL;
891 RGX_FREELIST * psCleanupCookieInt = NULL;
899 /* Lock over handle lookup. */
906 if (psRGXCreateFreeListIN->hsGlobalFreeList)
908 /* Look up the address from the handle */
909 psRGXCreateFreeListOUT->eError =
910 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
911 (void **) &pssGlobalFreeListInt,
913 PVRSRV_HANDLE_TYPE_RGX_FREELIST,
915 if(psRGXCreateFreeListOUT->eError != PVRSRV_OK)
918 goto RGXCreateFreeList_exit;
927 /* Look up the address from the handle */
928 psRGXCreateFreeListOUT->eError =
929 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
930 (void **) &pssFreeListPMRInt,
932 PVRSRV_HANDLE_TYPE_PHYSMEM_PMR,
934 if(psRGXCreateFreeListOUT->eError != PVRSRV_OK)
937 goto RGXCreateFreeList_exit;
940 /* Release now we have looked up handles. */
943 psRGXCreateFreeListOUT->eError =
944 RGXCreateFreeList(psConnection, OSGetDevData(psConnection),
945 psRGXCreateFreeListIN->ui32ui32MaxFLPages,
946 psRGXCreateFreeListIN->ui32ui32InitFLPages,
947 psRGXCreateFreeListIN->ui32ui32GrowFLPages,
948 pssGlobalFreeListInt,
949 psRGXCreateFreeListIN->bbFreeListCheck,
950 psRGXCreateFreeListIN->spsFreeListDevVAddr,
952 psRGXCreateFreeListIN->uiPMROffset,
953 &psCleanupCookieInt);
954 /* Exit early if bridged call fails */
955 if(psRGXCreateFreeListOUT->eError != PVRSRV_OK)
957 goto RGXCreateFreeList_exit;
960 /* Lock over handle creation. */
967 psRGXCreateFreeListOUT->eError = PVRSRVAllocHandleUnlocked(psConnection->psHandleBase,
969 &psRGXCreateFreeListOUT->hCleanupCookie,
970 (void *) psCleanupCookieInt,
971 PVRSRV_HANDLE_TYPE_RGX_FREELIST,
972 PVRSRV_HANDLE_ALLOC_FLAG_MULTI
973 ,(PFN_HANDLE_RELEASE)&RGXDestroyFreeList);
974 if (psRGXCreateFreeListOUT->eError != PVRSRV_OK)
977 goto RGXCreateFreeList_exit;
980 /* Release now we have created handles. */
985 RGXCreateFreeList_exit:
987 /* Lock over handle lookup cleanup. */
995 if (psRGXCreateFreeListIN->hsGlobalFreeList)
997 /* Unreference the previously looked up handle */
998 if(pssGlobalFreeListInt)
1000 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
1002 PVRSRV_HANDLE_TYPE_RGX_FREELIST);
1011 /* Unreference the previously looked up handle */
1012 if(pssFreeListPMRInt)
1014 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
1016 PVRSRV_HANDLE_TYPE_PHYSMEM_PMR);
1019 /* Release now we have cleaned up look up handles. */
1022 if (psRGXCreateFreeListOUT->eError != PVRSRV_OK)
1024 if (psCleanupCookieInt)
1026 RGXDestroyFreeList(psCleanupCookieInt);
1036 PVRSRVBridgeRGXDestroyFreeList(IMG_UINT32 ui32DispatchTableEntry,
1037 PVRSRV_BRIDGE_IN_RGXDESTROYFREELIST *psRGXDestroyFreeListIN,
1038 PVRSRV_BRIDGE_OUT_RGXDESTROYFREELIST *psRGXDestroyFreeListOUT,
1039 CONNECTION_DATA *psConnection)
1050 /* Lock over handle destruction. */
1057 psRGXDestroyFreeListOUT->eError =
1058 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
1059 (IMG_HANDLE) psRGXDestroyFreeListIN->hCleanupCookie,
1060 PVRSRV_HANDLE_TYPE_RGX_FREELIST);
1061 if ((psRGXDestroyFreeListOUT->eError != PVRSRV_OK) &&
1062 (psRGXDestroyFreeListOUT->eError != PVRSRV_ERROR_RETRY))
1064 PVR_DPF((PVR_DBG_ERROR,
1065 "PVRSRVBridgeRGXDestroyFreeList: %s",
1066 PVRSRVGetErrorStringKM(psRGXDestroyFreeListOUT->eError)));
1069 goto RGXDestroyFreeList_exit;
1072 /* Release now we have destroyed handles. */
1077 RGXDestroyFreeList_exit:
1087 PVRSRVBridgeRGXAddBlockToFreeList(IMG_UINT32 ui32DispatchTableEntry,
1088 PVRSRV_BRIDGE_IN_RGXADDBLOCKTOFREELIST *psRGXAddBlockToFreeListIN,
1089 PVRSRV_BRIDGE_OUT_RGXADDBLOCKTOFREELIST *psRGXAddBlockToFreeListOUT,
1090 CONNECTION_DATA *psConnection)
1092 IMG_HANDLE hsFreeList = psRGXAddBlockToFreeListIN->hsFreeList;
1093 RGX_FREELIST * pssFreeListInt = NULL;
1101 /* Lock over handle lookup. */
1109 /* Look up the address from the handle */
1110 psRGXAddBlockToFreeListOUT->eError =
1111 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
1112 (void **) &pssFreeListInt,
1114 PVRSRV_HANDLE_TYPE_RGX_FREELIST,
1116 if(psRGXAddBlockToFreeListOUT->eError != PVRSRV_OK)
1119 goto RGXAddBlockToFreeList_exit;
1122 /* Release now we have looked up handles. */
1125 psRGXAddBlockToFreeListOUT->eError =
1126 RGXAddBlockToFreeListKM(
1128 psRGXAddBlockToFreeListIN->ui3232NumPages);
1133 RGXAddBlockToFreeList_exit:
1135 /* Lock over handle lookup cleanup. */
1144 /* Unreference the previously looked up handle */
1147 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
1149 PVRSRV_HANDLE_TYPE_RGX_FREELIST);
1152 /* Release now we have cleaned up look up handles. */
1161 PVRSRVBridgeRGXRemoveBlockFromFreeList(IMG_UINT32 ui32DispatchTableEntry,
1162 PVRSRV_BRIDGE_IN_RGXREMOVEBLOCKFROMFREELIST *psRGXRemoveBlockFromFreeListIN,
1163 PVRSRV_BRIDGE_OUT_RGXREMOVEBLOCKFROMFREELIST *psRGXRemoveBlockFromFreeListOUT,
1164 CONNECTION_DATA *psConnection)
1166 IMG_HANDLE hsFreeList = psRGXRemoveBlockFromFreeListIN->hsFreeList;
1167 RGX_FREELIST * pssFreeListInt = NULL;
1175 /* Lock over handle lookup. */
1183 /* Look up the address from the handle */
1184 psRGXRemoveBlockFromFreeListOUT->eError =
1185 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
1186 (void **) &pssFreeListInt,
1188 PVRSRV_HANDLE_TYPE_RGX_FREELIST,
1190 if(psRGXRemoveBlockFromFreeListOUT->eError != PVRSRV_OK)
1193 goto RGXRemoveBlockFromFreeList_exit;
1196 /* Release now we have looked up handles. */
1199 psRGXRemoveBlockFromFreeListOUT->eError =
1200 RGXRemoveBlockFromFreeListKM(
1206 RGXRemoveBlockFromFreeList_exit:
1208 /* Lock over handle lookup cleanup. */
1217 /* Unreference the previously looked up handle */
1220 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
1222 PVRSRV_HANDLE_TYPE_RGX_FREELIST);
1225 /* Release now we have cleaned up look up handles. */
1234 PVRSRVBridgeRGXCreateRenderContext(IMG_UINT32 ui32DispatchTableEntry,
1235 PVRSRV_BRIDGE_IN_RGXCREATERENDERCONTEXT *psRGXCreateRenderContextIN,
1236 PVRSRV_BRIDGE_OUT_RGXCREATERENDERCONTEXT *psRGXCreateRenderContextOUT,
1237 CONNECTION_DATA *psConnection)
1239 IMG_BYTE *psFrameworkCmdInt = NULL;
1240 IMG_HANDLE hPrivData = psRGXCreateRenderContextIN->hPrivData;
1241 IMG_HANDLE hPrivDataInt = NULL;
1242 RGX_SERVER_RENDER_CONTEXT * psRenderContextInt = NULL;
1244 IMG_UINT32 ui32NextOffset = 0;
1245 IMG_BYTE *pArrayArgsBuffer = NULL;
1246 #if !defined(INTEGRITY_OS)
1247 IMG_BOOL bHaveEnoughSpace = IMG_FALSE;
1250 IMG_UINT32 ui32BufferSize =
1251 (psRGXCreateRenderContextIN->ui32FrameworkCmdize * sizeof(IMG_BYTE)) +
1258 if (ui32BufferSize != 0)
1260 #if !defined(INTEGRITY_OS)
1261 /* Try to use remainder of input buffer for copies if possible, word-aligned for safety. */
1262 IMG_UINT32 ui32InBufferOffset = PVR_ALIGN(sizeof(*psRGXCreateRenderContextIN), sizeof(unsigned long));
1263 IMG_UINT32 ui32InBufferExcessSize = ui32InBufferOffset >= PVRSRV_MAX_BRIDGE_IN_SIZE ? 0 :
1264 PVRSRV_MAX_BRIDGE_IN_SIZE - ui32InBufferOffset;
1266 bHaveEnoughSpace = ui32BufferSize <= ui32InBufferExcessSize;
1267 if (bHaveEnoughSpace)
1269 IMG_BYTE *pInputBuffer = (IMG_BYTE *)psRGXCreateRenderContextIN;
1271 pArrayArgsBuffer = &pInputBuffer[ui32InBufferOffset]; }
1275 pArrayArgsBuffer = OSAllocMemNoStats(ui32BufferSize);
1277 if(!pArrayArgsBuffer)
1279 psRGXCreateRenderContextOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1280 goto RGXCreateRenderContext_exit;
1285 if (psRGXCreateRenderContextIN->ui32FrameworkCmdize != 0)
1287 psFrameworkCmdInt = (IMG_BYTE*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1288 ui32NextOffset += psRGXCreateRenderContextIN->ui32FrameworkCmdize * sizeof(IMG_BYTE);
1291 /* Copy the data over */
1292 if (psRGXCreateRenderContextIN->ui32FrameworkCmdize * sizeof(IMG_BYTE) > 0)
1294 if ( OSCopyFromUser(NULL, psFrameworkCmdInt, psRGXCreateRenderContextIN->psFrameworkCmd, psRGXCreateRenderContextIN->ui32FrameworkCmdize * sizeof(IMG_BYTE)) != PVRSRV_OK )
1296 psRGXCreateRenderContextOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1298 goto RGXCreateRenderContext_exit;
1302 /* Lock over handle lookup. */
1310 /* Look up the address from the handle */
1311 psRGXCreateRenderContextOUT->eError =
1312 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
1313 (void **) &hPrivDataInt,
1315 PVRSRV_HANDLE_TYPE_DEV_PRIV_DATA,
1317 if(psRGXCreateRenderContextOUT->eError != PVRSRV_OK)
1320 goto RGXCreateRenderContext_exit;
1323 /* Release now we have looked up handles. */
1326 psRGXCreateRenderContextOUT->eError =
1327 PVRSRVRGXCreateRenderContextKM(psConnection, OSGetDevData(psConnection),
1328 psRGXCreateRenderContextIN->ui32Priority,
1329 psRGXCreateRenderContextIN->sMCUFenceAddr,
1330 psRGXCreateRenderContextIN->sVDMCallStackAddr,
1331 psRGXCreateRenderContextIN->ui32FrameworkCmdize,
1334 &psRenderContextInt);
1335 /* Exit early if bridged call fails */
1336 if(psRGXCreateRenderContextOUT->eError != PVRSRV_OK)
1338 goto RGXCreateRenderContext_exit;
1341 /* Lock over handle creation. */
1348 psRGXCreateRenderContextOUT->eError = PVRSRVAllocHandleUnlocked(psConnection->psHandleBase,
1350 &psRGXCreateRenderContextOUT->hRenderContext,
1351 (void *) psRenderContextInt,
1352 PVRSRV_HANDLE_TYPE_RGX_SERVER_RENDER_CONTEXT,
1353 PVRSRV_HANDLE_ALLOC_FLAG_MULTI
1354 ,(PFN_HANDLE_RELEASE)&PVRSRVRGXDestroyRenderContextKM);
1355 if (psRGXCreateRenderContextOUT->eError != PVRSRV_OK)
1358 goto RGXCreateRenderContext_exit;
1361 /* Release now we have created handles. */
1366 RGXCreateRenderContext_exit:
1368 /* Lock over handle lookup cleanup. */
1377 /* Unreference the previously looked up handle */
1380 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
1382 PVRSRV_HANDLE_TYPE_DEV_PRIV_DATA);
1385 /* Release now we have cleaned up look up handles. */
1388 if (psRGXCreateRenderContextOUT->eError != PVRSRV_OK)
1390 if (psRenderContextInt)
1392 PVRSRVRGXDestroyRenderContextKM(psRenderContextInt);
1396 /* Allocated space should be equal to the last updated offset */
1397 PVR_ASSERT(ui32BufferSize == ui32NextOffset);
1399 #if defined(INTEGRITY_OS)
1400 if(pArrayArgsBuffer)
1402 if(!bHaveEnoughSpace && pArrayArgsBuffer)
1404 OSFreeMemNoStats(pArrayArgsBuffer);
1412 PVRSRVBridgeRGXDestroyRenderContext(IMG_UINT32 ui32DispatchTableEntry,
1413 PVRSRV_BRIDGE_IN_RGXDESTROYRENDERCONTEXT *psRGXDestroyRenderContextIN,
1414 PVRSRV_BRIDGE_OUT_RGXDESTROYRENDERCONTEXT *psRGXDestroyRenderContextOUT,
1415 CONNECTION_DATA *psConnection)
1426 /* Lock over handle destruction. */
1433 psRGXDestroyRenderContextOUT->eError =
1434 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
1435 (IMG_HANDLE) psRGXDestroyRenderContextIN->hCleanupCookie,
1436 PVRSRV_HANDLE_TYPE_RGX_SERVER_RENDER_CONTEXT);
1437 if ((psRGXDestroyRenderContextOUT->eError != PVRSRV_OK) &&
1438 (psRGXDestroyRenderContextOUT->eError != PVRSRV_ERROR_RETRY))
1440 PVR_DPF((PVR_DBG_ERROR,
1441 "PVRSRVBridgeRGXDestroyRenderContext: %s",
1442 PVRSRVGetErrorStringKM(psRGXDestroyRenderContextOUT->eError)));
1445 goto RGXDestroyRenderContext_exit;
1448 /* Release now we have destroyed handles. */
1453 RGXDestroyRenderContext_exit:
1463 PVRSRVBridgeRGXKickTA3D(IMG_UINT32 ui32DispatchTableEntry,
1464 PVRSRV_BRIDGE_IN_RGXKICKTA3D *psRGXKickTA3DIN,
1465 PVRSRV_BRIDGE_OUT_RGXKICKTA3D *psRGXKickTA3DOUT,
1466 CONNECTION_DATA *psConnection)
1468 IMG_HANDLE hRenderContext = psRGXKickTA3DIN->hRenderContext;
1469 RGX_SERVER_RENDER_CONTEXT * psRenderContextInt = NULL;
1470 SYNC_PRIMITIVE_BLOCK * *psClientTAFenceSyncPrimBlockInt = NULL;
1471 IMG_HANDLE *hClientTAFenceSyncPrimBlockInt2 = NULL;
1472 IMG_UINT32 *ui32ClientTAFenceSyncOffsetInt = NULL;
1473 IMG_UINT32 *ui32ClientTAFenceValueInt = NULL;
1474 SYNC_PRIMITIVE_BLOCK * *psClientTAUpdateSyncPrimBlockInt = NULL;
1475 IMG_HANDLE *hClientTAUpdateSyncPrimBlockInt2 = NULL;
1476 IMG_UINT32 *ui32ClientTAUpdateSyncOffsetInt = NULL;
1477 IMG_UINT32 *ui32ClientTAUpdateValueInt = NULL;
1478 IMG_UINT32 *ui32ServerTASyncFlagsInt = NULL;
1479 SERVER_SYNC_PRIMITIVE * *psServerTASyncsInt = NULL;
1480 IMG_HANDLE *hServerTASyncsInt2 = NULL;
1481 SYNC_PRIMITIVE_BLOCK * *psClient3DFenceSyncPrimBlockInt = NULL;
1482 IMG_HANDLE *hClient3DFenceSyncPrimBlockInt2 = NULL;
1483 IMG_UINT32 *ui32Client3DFenceSyncOffsetInt = NULL;
1484 IMG_UINT32 *ui32Client3DFenceValueInt = NULL;
1485 SYNC_PRIMITIVE_BLOCK * *psClient3DUpdateSyncPrimBlockInt = NULL;
1486 IMG_HANDLE *hClient3DUpdateSyncPrimBlockInt2 = NULL;
1487 IMG_UINT32 *ui32Client3DUpdateSyncOffsetInt = NULL;
1488 IMG_UINT32 *ui32Client3DUpdateValueInt = NULL;
1489 IMG_UINT32 *ui32Server3DSyncFlagsInt = NULL;
1490 SERVER_SYNC_PRIMITIVE * *psServer3DSyncsInt = NULL;
1491 IMG_HANDLE *hServer3DSyncsInt2 = NULL;
1492 IMG_HANDLE hPRFenceUFOSyncPrimBlock = psRGXKickTA3DIN->hPRFenceUFOSyncPrimBlock;
1493 SYNC_PRIMITIVE_BLOCK * psPRFenceUFOSyncPrimBlockInt = NULL;
1494 IMG_CHAR *uiUpdateFenceNameInt = NULL;
1495 IMG_BYTE *psTACmdInt = NULL;
1496 IMG_BYTE *ps3DPRCmdInt = NULL;
1497 IMG_BYTE *ps3DCmdInt = NULL;
1498 IMG_HANDLE hRTDataCleanup = psRGXKickTA3DIN->hRTDataCleanup;
1499 RGX_RTDATA_CLEANUP_DATA * psRTDataCleanupInt = NULL;
1500 IMG_HANDLE hZBuffer = psRGXKickTA3DIN->hZBuffer;
1501 RGX_ZSBUFFER_DATA * psZBufferInt = NULL;
1502 IMG_HANDLE hSBuffer = psRGXKickTA3DIN->hSBuffer;
1503 RGX_ZSBUFFER_DATA * psSBufferInt = NULL;
1504 IMG_UINT32 *ui32SyncPMRFlagsInt = NULL;
1505 PMR * *psSyncPMRsInt = NULL;
1506 IMG_HANDLE *hSyncPMRsInt2 = NULL;
1508 IMG_UINT32 ui32NextOffset = 0;
1509 IMG_BYTE *pArrayArgsBuffer = NULL;
1510 #if !defined(INTEGRITY_OS)
1511 IMG_BOOL bHaveEnoughSpace = IMG_FALSE;
1514 IMG_UINT32 ui32BufferSize =
1515 (psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(SYNC_PRIMITIVE_BLOCK *)) +
1516 (psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_HANDLE)) +
1517 (psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_UINT32)) +
1518 (psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_UINT32)) +
1519 (psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(SYNC_PRIMITIVE_BLOCK *)) +
1520 (psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_HANDLE)) +
1521 (psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_UINT32)) +
1522 (psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_UINT32)) +
1523 (psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(IMG_UINT32)) +
1524 (psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(SERVER_SYNC_PRIMITIVE *)) +
1525 (psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(IMG_HANDLE)) +
1526 (psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(SYNC_PRIMITIVE_BLOCK *)) +
1527 (psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_HANDLE)) +
1528 (psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_UINT32)) +
1529 (psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_UINT32)) +
1530 (psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(SYNC_PRIMITIVE_BLOCK *)) +
1531 (psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_HANDLE)) +
1532 (psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_UINT32)) +
1533 (psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_UINT32)) +
1534 (psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(IMG_UINT32)) +
1535 (psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(SERVER_SYNC_PRIMITIVE *)) +
1536 (psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(IMG_HANDLE)) +
1537 (32 * sizeof(IMG_CHAR)) +
1538 (psRGXKickTA3DIN->ui32TACmdSize * sizeof(IMG_BYTE)) +
1539 (psRGXKickTA3DIN->ui323DPRCmdSize * sizeof(IMG_BYTE)) +
1540 (psRGXKickTA3DIN->ui323DCmdSize * sizeof(IMG_BYTE)) +
1541 (psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(IMG_UINT32)) +
1542 (psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(PMR *)) +
1543 (psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(IMG_HANDLE)) +
1550 if (ui32BufferSize != 0)
1552 #if !defined(INTEGRITY_OS)
1553 /* Try to use remainder of input buffer for copies if possible, word-aligned for safety. */
1554 IMG_UINT32 ui32InBufferOffset = PVR_ALIGN(sizeof(*psRGXKickTA3DIN), sizeof(unsigned long));
1555 IMG_UINT32 ui32InBufferExcessSize = ui32InBufferOffset >= PVRSRV_MAX_BRIDGE_IN_SIZE ? 0 :
1556 PVRSRV_MAX_BRIDGE_IN_SIZE - ui32InBufferOffset;
1558 bHaveEnoughSpace = ui32BufferSize <= ui32InBufferExcessSize;
1559 if (bHaveEnoughSpace)
1561 IMG_BYTE *pInputBuffer = (IMG_BYTE *)psRGXKickTA3DIN;
1563 pArrayArgsBuffer = &pInputBuffer[ui32InBufferOffset]; }
1567 pArrayArgsBuffer = OSAllocMemNoStats(ui32BufferSize);
1569 if(!pArrayArgsBuffer)
1571 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1572 goto RGXKickTA3D_exit;
1577 if (psRGXKickTA3DIN->ui32ClientTAFenceCount != 0)
1579 psClientTAFenceSyncPrimBlockInt = (SYNC_PRIMITIVE_BLOCK **)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1580 ui32NextOffset += psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(SYNC_PRIMITIVE_BLOCK *);
1581 hClientTAFenceSyncPrimBlockInt2 = (IMG_HANDLE *)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1582 ui32NextOffset += psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_HANDLE);
1585 /* Copy the data over */
1586 if (psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_HANDLE) > 0)
1588 if ( OSCopyFromUser(NULL, hClientTAFenceSyncPrimBlockInt2, psRGXKickTA3DIN->phClientTAFenceSyncPrimBlock, psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_HANDLE)) != PVRSRV_OK )
1590 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1592 goto RGXKickTA3D_exit;
1595 if (psRGXKickTA3DIN->ui32ClientTAFenceCount != 0)
1597 ui32ClientTAFenceSyncOffsetInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1598 ui32NextOffset += psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_UINT32);
1601 /* Copy the data over */
1602 if (psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_UINT32) > 0)
1604 if ( OSCopyFromUser(NULL, ui32ClientTAFenceSyncOffsetInt, psRGXKickTA3DIN->pui32ClientTAFenceSyncOffset, psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1606 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1608 goto RGXKickTA3D_exit;
1611 if (psRGXKickTA3DIN->ui32ClientTAFenceCount != 0)
1613 ui32ClientTAFenceValueInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1614 ui32NextOffset += psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_UINT32);
1617 /* Copy the data over */
1618 if (psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_UINT32) > 0)
1620 if ( OSCopyFromUser(NULL, ui32ClientTAFenceValueInt, psRGXKickTA3DIN->pui32ClientTAFenceValue, psRGXKickTA3DIN->ui32ClientTAFenceCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1622 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1624 goto RGXKickTA3D_exit;
1627 if (psRGXKickTA3DIN->ui32ClientTAUpdateCount != 0)
1629 psClientTAUpdateSyncPrimBlockInt = (SYNC_PRIMITIVE_BLOCK **)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1630 ui32NextOffset += psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(SYNC_PRIMITIVE_BLOCK *);
1631 hClientTAUpdateSyncPrimBlockInt2 = (IMG_HANDLE *)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1632 ui32NextOffset += psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_HANDLE);
1635 /* Copy the data over */
1636 if (psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_HANDLE) > 0)
1638 if ( OSCopyFromUser(NULL, hClientTAUpdateSyncPrimBlockInt2, psRGXKickTA3DIN->phClientTAUpdateSyncPrimBlock, psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_HANDLE)) != PVRSRV_OK )
1640 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1642 goto RGXKickTA3D_exit;
1645 if (psRGXKickTA3DIN->ui32ClientTAUpdateCount != 0)
1647 ui32ClientTAUpdateSyncOffsetInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1648 ui32NextOffset += psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_UINT32);
1651 /* Copy the data over */
1652 if (psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_UINT32) > 0)
1654 if ( OSCopyFromUser(NULL, ui32ClientTAUpdateSyncOffsetInt, psRGXKickTA3DIN->pui32ClientTAUpdateSyncOffset, psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1656 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1658 goto RGXKickTA3D_exit;
1661 if (psRGXKickTA3DIN->ui32ClientTAUpdateCount != 0)
1663 ui32ClientTAUpdateValueInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1664 ui32NextOffset += psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_UINT32);
1667 /* Copy the data over */
1668 if (psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_UINT32) > 0)
1670 if ( OSCopyFromUser(NULL, ui32ClientTAUpdateValueInt, psRGXKickTA3DIN->pui32ClientTAUpdateValue, psRGXKickTA3DIN->ui32ClientTAUpdateCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1672 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1674 goto RGXKickTA3D_exit;
1677 if (psRGXKickTA3DIN->ui32ServerTASyncPrims != 0)
1679 ui32ServerTASyncFlagsInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1680 ui32NextOffset += psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(IMG_UINT32);
1683 /* Copy the data over */
1684 if (psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(IMG_UINT32) > 0)
1686 if ( OSCopyFromUser(NULL, ui32ServerTASyncFlagsInt, psRGXKickTA3DIN->pui32ServerTASyncFlags, psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(IMG_UINT32)) != PVRSRV_OK )
1688 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1690 goto RGXKickTA3D_exit;
1693 if (psRGXKickTA3DIN->ui32ServerTASyncPrims != 0)
1695 psServerTASyncsInt = (SERVER_SYNC_PRIMITIVE **)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1696 ui32NextOffset += psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(SERVER_SYNC_PRIMITIVE *);
1697 hServerTASyncsInt2 = (IMG_HANDLE *)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1698 ui32NextOffset += psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(IMG_HANDLE);
1701 /* Copy the data over */
1702 if (psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(IMG_HANDLE) > 0)
1704 if ( OSCopyFromUser(NULL, hServerTASyncsInt2, psRGXKickTA3DIN->phServerTASyncs, psRGXKickTA3DIN->ui32ServerTASyncPrims * sizeof(IMG_HANDLE)) != PVRSRV_OK )
1706 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1708 goto RGXKickTA3D_exit;
1711 if (psRGXKickTA3DIN->ui32Client3DFenceCount != 0)
1713 psClient3DFenceSyncPrimBlockInt = (SYNC_PRIMITIVE_BLOCK **)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1714 ui32NextOffset += psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(SYNC_PRIMITIVE_BLOCK *);
1715 hClient3DFenceSyncPrimBlockInt2 = (IMG_HANDLE *)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1716 ui32NextOffset += psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_HANDLE);
1719 /* Copy the data over */
1720 if (psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_HANDLE) > 0)
1722 if ( OSCopyFromUser(NULL, hClient3DFenceSyncPrimBlockInt2, psRGXKickTA3DIN->phClient3DFenceSyncPrimBlock, psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_HANDLE)) != PVRSRV_OK )
1724 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1726 goto RGXKickTA3D_exit;
1729 if (psRGXKickTA3DIN->ui32Client3DFenceCount != 0)
1731 ui32Client3DFenceSyncOffsetInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1732 ui32NextOffset += psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_UINT32);
1735 /* Copy the data over */
1736 if (psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_UINT32) > 0)
1738 if ( OSCopyFromUser(NULL, ui32Client3DFenceSyncOffsetInt, psRGXKickTA3DIN->pui32Client3DFenceSyncOffset, psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1740 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1742 goto RGXKickTA3D_exit;
1745 if (psRGXKickTA3DIN->ui32Client3DFenceCount != 0)
1747 ui32Client3DFenceValueInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1748 ui32NextOffset += psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_UINT32);
1751 /* Copy the data over */
1752 if (psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_UINT32) > 0)
1754 if ( OSCopyFromUser(NULL, ui32Client3DFenceValueInt, psRGXKickTA3DIN->pui32Client3DFenceValue, psRGXKickTA3DIN->ui32Client3DFenceCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1756 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1758 goto RGXKickTA3D_exit;
1761 if (psRGXKickTA3DIN->ui32Client3DUpdateCount != 0)
1763 psClient3DUpdateSyncPrimBlockInt = (SYNC_PRIMITIVE_BLOCK **)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1764 ui32NextOffset += psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(SYNC_PRIMITIVE_BLOCK *);
1765 hClient3DUpdateSyncPrimBlockInt2 = (IMG_HANDLE *)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1766 ui32NextOffset += psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_HANDLE);
1769 /* Copy the data over */
1770 if (psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_HANDLE) > 0)
1772 if ( OSCopyFromUser(NULL, hClient3DUpdateSyncPrimBlockInt2, psRGXKickTA3DIN->phClient3DUpdateSyncPrimBlock, psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_HANDLE)) != PVRSRV_OK )
1774 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1776 goto RGXKickTA3D_exit;
1779 if (psRGXKickTA3DIN->ui32Client3DUpdateCount != 0)
1781 ui32Client3DUpdateSyncOffsetInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1782 ui32NextOffset += psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_UINT32);
1785 /* Copy the data over */
1786 if (psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_UINT32) > 0)
1788 if ( OSCopyFromUser(NULL, ui32Client3DUpdateSyncOffsetInt, psRGXKickTA3DIN->pui32Client3DUpdateSyncOffset, psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1790 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1792 goto RGXKickTA3D_exit;
1795 if (psRGXKickTA3DIN->ui32Client3DUpdateCount != 0)
1797 ui32Client3DUpdateValueInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1798 ui32NextOffset += psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_UINT32);
1801 /* Copy the data over */
1802 if (psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_UINT32) > 0)
1804 if ( OSCopyFromUser(NULL, ui32Client3DUpdateValueInt, psRGXKickTA3DIN->pui32Client3DUpdateValue, psRGXKickTA3DIN->ui32Client3DUpdateCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1806 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1808 goto RGXKickTA3D_exit;
1811 if (psRGXKickTA3DIN->ui32Server3DSyncPrims != 0)
1813 ui32Server3DSyncFlagsInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1814 ui32NextOffset += psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(IMG_UINT32);
1817 /* Copy the data over */
1818 if (psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(IMG_UINT32) > 0)
1820 if ( OSCopyFromUser(NULL, ui32Server3DSyncFlagsInt, psRGXKickTA3DIN->pui32Server3DSyncFlags, psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(IMG_UINT32)) != PVRSRV_OK )
1822 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1824 goto RGXKickTA3D_exit;
1827 if (psRGXKickTA3DIN->ui32Server3DSyncPrims != 0)
1829 psServer3DSyncsInt = (SERVER_SYNC_PRIMITIVE **)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1830 ui32NextOffset += psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(SERVER_SYNC_PRIMITIVE *);
1831 hServer3DSyncsInt2 = (IMG_HANDLE *)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1832 ui32NextOffset += psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(IMG_HANDLE);
1835 /* Copy the data over */
1836 if (psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(IMG_HANDLE) > 0)
1838 if ( OSCopyFromUser(NULL, hServer3DSyncsInt2, psRGXKickTA3DIN->phServer3DSyncs, psRGXKickTA3DIN->ui32Server3DSyncPrims * sizeof(IMG_HANDLE)) != PVRSRV_OK )
1840 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1842 goto RGXKickTA3D_exit;
1847 uiUpdateFenceNameInt = (IMG_CHAR*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1848 ui32NextOffset += 32 * sizeof(IMG_CHAR);
1851 /* Copy the data over */
1852 if (32 * sizeof(IMG_CHAR) > 0)
1854 if ( OSCopyFromUser(NULL, uiUpdateFenceNameInt, psRGXKickTA3DIN->puiUpdateFenceName, 32 * sizeof(IMG_CHAR)) != PVRSRV_OK )
1856 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1858 goto RGXKickTA3D_exit;
1861 if (psRGXKickTA3DIN->ui32TACmdSize != 0)
1863 psTACmdInt = (IMG_BYTE*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1864 ui32NextOffset += psRGXKickTA3DIN->ui32TACmdSize * sizeof(IMG_BYTE);
1867 /* Copy the data over */
1868 if (psRGXKickTA3DIN->ui32TACmdSize * sizeof(IMG_BYTE) > 0)
1870 if ( OSCopyFromUser(NULL, psTACmdInt, psRGXKickTA3DIN->psTACmd, psRGXKickTA3DIN->ui32TACmdSize * sizeof(IMG_BYTE)) != PVRSRV_OK )
1872 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1874 goto RGXKickTA3D_exit;
1877 if (psRGXKickTA3DIN->ui323DPRCmdSize != 0)
1879 ps3DPRCmdInt = (IMG_BYTE*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1880 ui32NextOffset += psRGXKickTA3DIN->ui323DPRCmdSize * sizeof(IMG_BYTE);
1883 /* Copy the data over */
1884 if (psRGXKickTA3DIN->ui323DPRCmdSize * sizeof(IMG_BYTE) > 0)
1886 if ( OSCopyFromUser(NULL, ps3DPRCmdInt, psRGXKickTA3DIN->ps3DPRCmd, psRGXKickTA3DIN->ui323DPRCmdSize * sizeof(IMG_BYTE)) != PVRSRV_OK )
1888 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1890 goto RGXKickTA3D_exit;
1893 if (psRGXKickTA3DIN->ui323DCmdSize != 0)
1895 ps3DCmdInt = (IMG_BYTE*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1896 ui32NextOffset += psRGXKickTA3DIN->ui323DCmdSize * sizeof(IMG_BYTE);
1899 /* Copy the data over */
1900 if (psRGXKickTA3DIN->ui323DCmdSize * sizeof(IMG_BYTE) > 0)
1902 if ( OSCopyFromUser(NULL, ps3DCmdInt, psRGXKickTA3DIN->ps3DCmd, psRGXKickTA3DIN->ui323DCmdSize * sizeof(IMG_BYTE)) != PVRSRV_OK )
1904 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1906 goto RGXKickTA3D_exit;
1909 if (psRGXKickTA3DIN->ui32SyncPMRCount != 0)
1911 ui32SyncPMRFlagsInt = (IMG_UINT32*)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1912 ui32NextOffset += psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(IMG_UINT32);
1915 /* Copy the data over */
1916 if (psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(IMG_UINT32) > 0)
1918 if ( OSCopyFromUser(NULL, ui32SyncPMRFlagsInt, psRGXKickTA3DIN->pui32SyncPMRFlags, psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(IMG_UINT32)) != PVRSRV_OK )
1920 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1922 goto RGXKickTA3D_exit;
1925 if (psRGXKickTA3DIN->ui32SyncPMRCount != 0)
1927 psSyncPMRsInt = (PMR **)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1928 ui32NextOffset += psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(PMR *);
1929 hSyncPMRsInt2 = (IMG_HANDLE *)(((IMG_UINT8 *)pArrayArgsBuffer) + ui32NextOffset);
1930 ui32NextOffset += psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(IMG_HANDLE);
1933 /* Copy the data over */
1934 if (psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(IMG_HANDLE) > 0)
1936 if ( OSCopyFromUser(NULL, hSyncPMRsInt2, psRGXKickTA3DIN->phSyncPMRs, psRGXKickTA3DIN->ui32SyncPMRCount * sizeof(IMG_HANDLE)) != PVRSRV_OK )
1938 psRGXKickTA3DOUT->eError = PVRSRV_ERROR_INVALID_PARAMS;
1940 goto RGXKickTA3D_exit;
1944 /* Lock over handle lookup. */
1952 /* Look up the address from the handle */
1953 psRGXKickTA3DOUT->eError =
1954 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
1955 (void **) &psRenderContextInt,
1957 PVRSRV_HANDLE_TYPE_RGX_SERVER_RENDER_CONTEXT,
1959 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
1962 goto RGXKickTA3D_exit;
1973 for (i=0;i<psRGXKickTA3DIN->ui32ClientTAFenceCount;i++)
1976 /* Look up the address from the handle */
1977 psRGXKickTA3DOUT->eError =
1978 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
1979 (void **) &psClientTAFenceSyncPrimBlockInt[i],
1980 hClientTAFenceSyncPrimBlockInt2[i],
1981 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK,
1983 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
1986 goto RGXKickTA3D_exit;
1999 for (i=0;i<psRGXKickTA3DIN->ui32ClientTAUpdateCount;i++)
2002 /* Look up the address from the handle */
2003 psRGXKickTA3DOUT->eError =
2004 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2005 (void **) &psClientTAUpdateSyncPrimBlockInt[i],
2006 hClientTAUpdateSyncPrimBlockInt2[i],
2007 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK,
2009 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2012 goto RGXKickTA3D_exit;
2025 for (i=0;i<psRGXKickTA3DIN->ui32ServerTASyncPrims;i++)
2028 /* Look up the address from the handle */
2029 psRGXKickTA3DOUT->eError =
2030 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2031 (void **) &psServerTASyncsInt[i],
2032 hServerTASyncsInt2[i],
2033 PVRSRV_HANDLE_TYPE_SERVER_SYNC_PRIMITIVE,
2035 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2038 goto RGXKickTA3D_exit;
2051 for (i=0;i<psRGXKickTA3DIN->ui32Client3DFenceCount;i++)
2054 /* Look up the address from the handle */
2055 psRGXKickTA3DOUT->eError =
2056 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2057 (void **) &psClient3DFenceSyncPrimBlockInt[i],
2058 hClient3DFenceSyncPrimBlockInt2[i],
2059 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK,
2061 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2064 goto RGXKickTA3D_exit;
2077 for (i=0;i<psRGXKickTA3DIN->ui32Client3DUpdateCount;i++)
2080 /* Look up the address from the handle */
2081 psRGXKickTA3DOUT->eError =
2082 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2083 (void **) &psClient3DUpdateSyncPrimBlockInt[i],
2084 hClient3DUpdateSyncPrimBlockInt2[i],
2085 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK,
2087 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2090 goto RGXKickTA3D_exit;
2103 for (i=0;i<psRGXKickTA3DIN->ui32Server3DSyncPrims;i++)
2106 /* Look up the address from the handle */
2107 psRGXKickTA3DOUT->eError =
2108 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2109 (void **) &psServer3DSyncsInt[i],
2110 hServer3DSyncsInt2[i],
2111 PVRSRV_HANDLE_TYPE_SERVER_SYNC_PRIMITIVE,
2113 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2116 goto RGXKickTA3D_exit;
2127 /* Look up the address from the handle */
2128 psRGXKickTA3DOUT->eError =
2129 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2130 (void **) &psPRFenceUFOSyncPrimBlockInt,
2131 hPRFenceUFOSyncPrimBlock,
2132 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK,
2134 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2137 goto RGXKickTA3D_exit;
2145 if (psRGXKickTA3DIN->hRTDataCleanup)
2147 /* Look up the address from the handle */
2148 psRGXKickTA3DOUT->eError =
2149 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2150 (void **) &psRTDataCleanupInt,
2152 PVRSRV_HANDLE_TYPE_RGX_RTDATA_CLEANUP,
2154 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2157 goto RGXKickTA3D_exit;
2165 if (psRGXKickTA3DIN->hZBuffer)
2167 /* Look up the address from the handle */
2168 psRGXKickTA3DOUT->eError =
2169 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2170 (void **) &psZBufferInt,
2172 PVRSRV_HANDLE_TYPE_RGX_FWIF_ZSBUFFER,
2174 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2177 goto RGXKickTA3D_exit;
2185 if (psRGXKickTA3DIN->hSBuffer)
2187 /* Look up the address from the handle */
2188 psRGXKickTA3DOUT->eError =
2189 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2190 (void **) &psSBufferInt,
2192 PVRSRV_HANDLE_TYPE_RGX_FWIF_ZSBUFFER,
2194 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2197 goto RGXKickTA3D_exit;
2208 for (i=0;i<psRGXKickTA3DIN->ui32SyncPMRCount;i++)
2211 /* Look up the address from the handle */
2212 psRGXKickTA3DOUT->eError =
2213 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2214 (void **) &psSyncPMRsInt[i],
2216 PVRSRV_HANDLE_TYPE_PHYSMEM_PMR,
2218 if(psRGXKickTA3DOUT->eError != PVRSRV_OK)
2221 goto RGXKickTA3D_exit;
2226 /* Release now we have looked up handles. */
2229 psRGXKickTA3DOUT->eError =
2230 PVRSRVRGXKickTA3DKM(
2232 psRGXKickTA3DIN->ui32ClientCacheOpSeqNum,
2233 psRGXKickTA3DIN->ui32ClientTAFenceCount,
2234 psClientTAFenceSyncPrimBlockInt,
2235 ui32ClientTAFenceSyncOffsetInt,
2236 ui32ClientTAFenceValueInt,
2237 psRGXKickTA3DIN->ui32ClientTAUpdateCount,
2238 psClientTAUpdateSyncPrimBlockInt,
2239 ui32ClientTAUpdateSyncOffsetInt,
2240 ui32ClientTAUpdateValueInt,
2241 psRGXKickTA3DIN->ui32ServerTASyncPrims,
2242 ui32ServerTASyncFlagsInt,
2244 psRGXKickTA3DIN->ui32Client3DFenceCount,
2245 psClient3DFenceSyncPrimBlockInt,
2246 ui32Client3DFenceSyncOffsetInt,
2247 ui32Client3DFenceValueInt,
2248 psRGXKickTA3DIN->ui32Client3DUpdateCount,
2249 psClient3DUpdateSyncPrimBlockInt,
2250 ui32Client3DUpdateSyncOffsetInt,
2251 ui32Client3DUpdateValueInt,
2252 psRGXKickTA3DIN->ui32Server3DSyncPrims,
2253 ui32Server3DSyncFlagsInt,
2255 psPRFenceUFOSyncPrimBlockInt,
2256 psRGXKickTA3DIN->ui32FRFenceUFOSyncOffset,
2257 psRGXKickTA3DIN->ui32FRFenceValue,
2258 psRGXKickTA3DIN->i32CheckFenceFD,
2259 psRGXKickTA3DIN->i32UpdateTimelineFD,
2260 &psRGXKickTA3DOUT->i32UpdateFenceFD,
2261 uiUpdateFenceNameInt,
2262 psRGXKickTA3DIN->ui32TACmdSize,
2264 psRGXKickTA3DIN->ui323DPRCmdSize,
2266 psRGXKickTA3DIN->ui323DCmdSize,
2268 psRGXKickTA3DIN->ui32ExtJobRef,
2269 psRGXKickTA3DIN->bbLastTAInScene,
2270 psRGXKickTA3DIN->bbKickTA,
2271 psRGXKickTA3DIN->bbKickPR,
2272 psRGXKickTA3DIN->bbKick3D,
2273 psRGXKickTA3DIN->bbAbort,
2274 psRGXKickTA3DIN->ui32PDumpFlags,
2278 psRGXKickTA3DIN->bbCommitRefCountsTA,
2279 psRGXKickTA3DIN->bbCommitRefCounts3D,
2280 &psRGXKickTA3DOUT->bbCommittedRefCountsTA,
2281 &psRGXKickTA3DOUT->bbCommittedRefCounts3D,
2282 psRGXKickTA3DIN->ui32SyncPMRCount,
2283 ui32SyncPMRFlagsInt,
2285 psRGXKickTA3DIN->ui32RenderTargetSize,
2286 psRGXKickTA3DIN->ui32NumberOfDrawCalls,
2287 psRGXKickTA3DIN->ui32NumberOfIndices,
2288 psRGXKickTA3DIN->ui32NumberOfMRTs,
2289 psRGXKickTA3DIN->ui64Deadline);
2296 /* Lock over handle lookup cleanup. */
2305 /* Unreference the previously looked up handle */
2306 if(psRenderContextInt)
2308 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2310 PVRSRV_HANDLE_TYPE_RGX_SERVER_RENDER_CONTEXT);
2321 for (i=0;i<psRGXKickTA3DIN->ui32ClientTAFenceCount;i++)
2324 /* Unreference the previously looked up handle */
2325 if(psClientTAFenceSyncPrimBlockInt[i])
2327 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2328 hClientTAFenceSyncPrimBlockInt2[i],
2329 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK);
2342 for (i=0;i<psRGXKickTA3DIN->ui32ClientTAUpdateCount;i++)
2345 /* Unreference the previously looked up handle */
2346 if(psClientTAUpdateSyncPrimBlockInt[i])
2348 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2349 hClientTAUpdateSyncPrimBlockInt2[i],
2350 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK);
2363 for (i=0;i<psRGXKickTA3DIN->ui32ServerTASyncPrims;i++)
2366 /* Unreference the previously looked up handle */
2367 if(psServerTASyncsInt[i])
2369 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2370 hServerTASyncsInt2[i],
2371 PVRSRV_HANDLE_TYPE_SERVER_SYNC_PRIMITIVE);
2384 for (i=0;i<psRGXKickTA3DIN->ui32Client3DFenceCount;i++)
2387 /* Unreference the previously looked up handle */
2388 if(psClient3DFenceSyncPrimBlockInt[i])
2390 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2391 hClient3DFenceSyncPrimBlockInt2[i],
2392 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK);
2405 for (i=0;i<psRGXKickTA3DIN->ui32Client3DUpdateCount;i++)
2408 /* Unreference the previously looked up handle */
2409 if(psClient3DUpdateSyncPrimBlockInt[i])
2411 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2412 hClient3DUpdateSyncPrimBlockInt2[i],
2413 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK);
2426 for (i=0;i<psRGXKickTA3DIN->ui32Server3DSyncPrims;i++)
2429 /* Unreference the previously looked up handle */
2430 if(psServer3DSyncsInt[i])
2432 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2433 hServer3DSyncsInt2[i],
2434 PVRSRV_HANDLE_TYPE_SERVER_SYNC_PRIMITIVE);
2445 /* Unreference the previously looked up handle */
2446 if(psPRFenceUFOSyncPrimBlockInt)
2448 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2449 hPRFenceUFOSyncPrimBlock,
2450 PVRSRV_HANDLE_TYPE_SYNC_PRIMITIVE_BLOCK);
2458 if (psRGXKickTA3DIN->hRTDataCleanup)
2460 /* Unreference the previously looked up handle */
2461 if(psRTDataCleanupInt)
2463 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2465 PVRSRV_HANDLE_TYPE_RGX_RTDATA_CLEANUP);
2473 if (psRGXKickTA3DIN->hZBuffer)
2475 /* Unreference the previously looked up handle */
2478 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2480 PVRSRV_HANDLE_TYPE_RGX_FWIF_ZSBUFFER);
2488 if (psRGXKickTA3DIN->hSBuffer)
2490 /* Unreference the previously looked up handle */
2493 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2495 PVRSRV_HANDLE_TYPE_RGX_FWIF_ZSBUFFER);
2506 for (i=0;i<psRGXKickTA3DIN->ui32SyncPMRCount;i++)
2509 /* Unreference the previously looked up handle */
2510 if(psSyncPMRsInt[i])
2512 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2514 PVRSRV_HANDLE_TYPE_PHYSMEM_PMR);
2519 /* Release now we have cleaned up look up handles. */
2522 /* Allocated space should be equal to the last updated offset */
2523 PVR_ASSERT(ui32BufferSize == ui32NextOffset);
2525 #if defined(INTEGRITY_OS)
2526 if(pArrayArgsBuffer)
2528 if(!bHaveEnoughSpace && pArrayArgsBuffer)
2530 OSFreeMemNoStats(pArrayArgsBuffer);
2538 PVRSRVBridgeRGXSetRenderContextPriority(IMG_UINT32 ui32DispatchTableEntry,
2539 PVRSRV_BRIDGE_IN_RGXSETRENDERCONTEXTPRIORITY *psRGXSetRenderContextPriorityIN,
2540 PVRSRV_BRIDGE_OUT_RGXSETRENDERCONTEXTPRIORITY *psRGXSetRenderContextPriorityOUT,
2541 CONNECTION_DATA *psConnection)
2543 IMG_HANDLE hRenderContext = psRGXSetRenderContextPriorityIN->hRenderContext;
2544 RGX_SERVER_RENDER_CONTEXT * psRenderContextInt = NULL;
2552 /* Lock over handle lookup. */
2560 /* Look up the address from the handle */
2561 psRGXSetRenderContextPriorityOUT->eError =
2562 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2563 (void **) &psRenderContextInt,
2565 PVRSRV_HANDLE_TYPE_RGX_SERVER_RENDER_CONTEXT,
2567 if(psRGXSetRenderContextPriorityOUT->eError != PVRSRV_OK)
2570 goto RGXSetRenderContextPriority_exit;
2573 /* Release now we have looked up handles. */
2576 psRGXSetRenderContextPriorityOUT->eError =
2577 PVRSRVRGXSetRenderContextPriorityKM(psConnection, OSGetDevData(psConnection),
2579 psRGXSetRenderContextPriorityIN->ui32Priority);
2584 RGXSetRenderContextPriority_exit:
2586 /* Lock over handle lookup cleanup. */
2595 /* Unreference the previously looked up handle */
2596 if(psRenderContextInt)
2598 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2600 PVRSRV_HANDLE_TYPE_RGX_SERVER_RENDER_CONTEXT);
2603 /* Release now we have cleaned up look up handles. */
2612 PVRSRVBridgeRGXGetLastRenderContextResetReason(IMG_UINT32 ui32DispatchTableEntry,
2613 PVRSRV_BRIDGE_IN_RGXGETLASTRENDERCONTEXTRESETREASON *psRGXGetLastRenderContextResetReasonIN,
2614 PVRSRV_BRIDGE_OUT_RGXGETLASTRENDERCONTEXTRESETREASON *psRGXGetLastRenderContextResetReasonOUT,
2615 CONNECTION_DATA *psConnection)
2617 IMG_HANDLE hRenderContext = psRGXGetLastRenderContextResetReasonIN->hRenderContext;
2618 RGX_SERVER_RENDER_CONTEXT * psRenderContextInt = NULL;
2626 /* Lock over handle lookup. */
2634 /* Look up the address from the handle */
2635 psRGXGetLastRenderContextResetReasonOUT->eError =
2636 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2637 (void **) &psRenderContextInt,
2639 PVRSRV_HANDLE_TYPE_RGX_SERVER_RENDER_CONTEXT,
2641 if(psRGXGetLastRenderContextResetReasonOUT->eError != PVRSRV_OK)
2644 goto RGXGetLastRenderContextResetReason_exit;
2647 /* Release now we have looked up handles. */
2650 psRGXGetLastRenderContextResetReasonOUT->eError =
2651 PVRSRVRGXGetLastRenderContextResetReasonKM(
2653 &psRGXGetLastRenderContextResetReasonOUT->ui32LastResetReason,
2654 &psRGXGetLastRenderContextResetReasonOUT->ui32LastResetJobRef);
2659 RGXGetLastRenderContextResetReason_exit:
2661 /* Lock over handle lookup cleanup. */
2670 /* Unreference the previously looked up handle */
2671 if(psRenderContextInt)
2673 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2675 PVRSRV_HANDLE_TYPE_RGX_SERVER_RENDER_CONTEXT);
2678 /* Release now we have cleaned up look up handles. */
2687 PVRSRVBridgeRGXGetPartialRenderCount(IMG_UINT32 ui32DispatchTableEntry,
2688 PVRSRV_BRIDGE_IN_RGXGETPARTIALRENDERCOUNT *psRGXGetPartialRenderCountIN,
2689 PVRSRV_BRIDGE_OUT_RGXGETPARTIALRENDERCOUNT *psRGXGetPartialRenderCountOUT,
2690 CONNECTION_DATA *psConnection)
2692 IMG_HANDLE hHWRTDataMemDesc = psRGXGetPartialRenderCountIN->hHWRTDataMemDesc;
2693 DEVMEM_MEMDESC * psHWRTDataMemDescInt = NULL;
2701 /* Lock over handle lookup. */
2709 /* Look up the address from the handle */
2710 psRGXGetPartialRenderCountOUT->eError =
2711 PVRSRVLookupHandleUnlocked(psConnection->psHandleBase,
2712 (void **) &psHWRTDataMemDescInt,
2714 PVRSRV_HANDLE_TYPE_RGX_FW_MEMDESC,
2716 if(psRGXGetPartialRenderCountOUT->eError != PVRSRV_OK)
2719 goto RGXGetPartialRenderCount_exit;
2722 /* Release now we have looked up handles. */
2725 psRGXGetPartialRenderCountOUT->eError =
2726 PVRSRVRGXGetPartialRenderCountKM(
2727 psHWRTDataMemDescInt,
2728 &psRGXGetPartialRenderCountOUT->ui32NumPartialRenders);
2733 RGXGetPartialRenderCount_exit:
2735 /* Lock over handle lookup cleanup. */
2744 /* Unreference the previously looked up handle */
2745 if(psHWRTDataMemDescInt)
2747 PVRSRVReleaseHandleUnlocked(psConnection->psHandleBase,
2749 PVRSRV_HANDLE_TYPE_RGX_FW_MEMDESC);
2752 /* Release now we have cleaned up look up handles. */
2762 /* ***************************************************************************
2763 * Server bridge dispatch related glue
2766 static IMG_BOOL bUseLock = IMG_TRUE;
2768 PVRSRV_ERROR InitRGXTA3DBridge(void);
2769 PVRSRV_ERROR DeinitRGXTA3DBridge(void);
2772 * Register all RGXTA3D functions with services
2774 PVRSRV_ERROR InitRGXTA3DBridge(void)
2777 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXCREATEHWRTDATA, PVRSRVBridgeRGXCreateHWRTData,
2780 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXDESTROYHWRTDATA, PVRSRVBridgeRGXDestroyHWRTData,
2783 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXCREATERENDERTARGET, PVRSRVBridgeRGXCreateRenderTarget,
2786 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXDESTROYRENDERTARGET, PVRSRVBridgeRGXDestroyRenderTarget,
2789 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXCREATEZSBUFFER, PVRSRVBridgeRGXCreateZSBuffer,
2792 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXDESTROYZSBUFFER, PVRSRVBridgeRGXDestroyZSBuffer,
2795 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXPOPULATEZSBUFFER, PVRSRVBridgeRGXPopulateZSBuffer,
2798 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXUNPOPULATEZSBUFFER, PVRSRVBridgeRGXUnpopulateZSBuffer,
2801 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXCREATEFREELIST, PVRSRVBridgeRGXCreateFreeList,
2804 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXDESTROYFREELIST, PVRSRVBridgeRGXDestroyFreeList,
2807 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXADDBLOCKTOFREELIST, PVRSRVBridgeRGXAddBlockToFreeList,
2810 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXREMOVEBLOCKFROMFREELIST, PVRSRVBridgeRGXRemoveBlockFromFreeList,
2813 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXCREATERENDERCONTEXT, PVRSRVBridgeRGXCreateRenderContext,
2816 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXDESTROYRENDERCONTEXT, PVRSRVBridgeRGXDestroyRenderContext,
2819 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXKICKTA3D, PVRSRVBridgeRGXKickTA3D,
2822 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXSETRENDERCONTEXTPRIORITY, PVRSRVBridgeRGXSetRenderContextPriority,
2825 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXGETLASTRENDERCONTEXTRESETREASON, PVRSRVBridgeRGXGetLastRenderContextResetReason,
2828 SetDispatchTableEntry(PVRSRV_BRIDGE_RGXTA3D, PVRSRV_BRIDGE_RGXTA3D_RGXGETPARTIALRENDERCOUNT, PVRSRVBridgeRGXGetPartialRenderCount,
2836 * Unregister all rgxta3d functions with services
2838 PVRSRV_ERROR DeinitRGXTA3DBridge(void)