1
/**********************************************************************
3
* Copyright (C) Imagination Technologies Ltd. All rights reserved.
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms and conditions of the GNU General Public License,
7
* version 2, as published by the Free Software Foundation.
9
* This program is distributed in the hope it will be useful but, except
10
* as otherwise stated in writing, without any warranty; without even the
11
* implied warranty of merchantability or fitness for a particular purpose.
12
* See the GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License along with
15
* this program; if not, write to the Free Software Foundation, Inc.,
16
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18
* The full GNU General Public License is included in this distribution in
19
* the file called "COPYING".
21
* Contact Information:
22
* Imagination Technologies Ltd. <gpl-support@imgtec.com>
23
* Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
25
******************************************************************************/
27
#include "services_headers.h"
28
#include "buffer_manager.h"
29
#include "kernelbuffer.h"
30
#include "kerneldisplay.h"
31
#include "pvr_bridge_km.h"
37
PVRSRV_ERROR AllocateDeviceID(SYS_DATA *psSysData, IMG_UINT32 *pui32DevID);
38
PVRSRV_ERROR FreeDeviceID(SYS_DATA *psSysData, IMG_UINT32 ui32DevID);
40
#if defined(SUPPORT_MISR_IN_THREAD)
41
void OSVSyncMISR(IMG_HANDLE, IMG_BOOL);
44
#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS)
45
IMG_VOID PVRSRVFreeCommandCompletePacketKM(IMG_HANDLE hCmdCookie,
46
IMG_BOOL bScheduleMISR);
48
typedef struct PVRSRV_DC_SRV2DISP_KMJTABLE_TAG *PPVRSRV_DC_SRV2DISP_KMJTABLE;
50
typedef struct PVRSRV_DC_BUFFER_TAG
53
PVRSRV_DEVICECLASS_BUFFER sDeviceClassBuffer;
55
struct PVRSRV_DISPLAYCLASS_INFO_TAG *psDCInfo;
56
struct PVRSRV_DC_SWAPCHAIN_TAG *psSwapChain;
59
typedef struct PVRSRV_DC_SWAPCHAIN_TAG
61
IMG_HANDLE hExtSwapChain;
62
IMG_UINT32 ui32SwapChainID;
63
IMG_UINT32 ui32RefCount;
65
PVRSRV_QUEUE_INFO *psQueue;
66
PVRSRV_DC_BUFFER asBuffer[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS];
67
IMG_UINT32 ui32BufferCount;
68
PVRSRV_DC_BUFFER *psLastFlipBuffer;
69
IMG_UINT32 ui32MinSwapInterval;
70
IMG_UINT32 ui32MaxSwapInterval;
71
struct PVRSRV_DISPLAYCLASS_INFO_TAG *psDCInfo;
72
struct PVRSRV_DC_SWAPCHAIN_TAG *psNext;
73
} PVRSRV_DC_SWAPCHAIN;
76
typedef struct PVRSRV_DC_SWAPCHAIN_REF_TAG
78
struct PVRSRV_DC_SWAPCHAIN_TAG *psSwapChain;
80
} PVRSRV_DC_SWAPCHAIN_REF;
83
typedef struct PVRSRV_DISPLAYCLASS_INFO_TAG
85
IMG_UINT32 ui32RefCount;
86
IMG_UINT32 ui32DeviceID;
87
IMG_HANDLE hExtDevice;
88
PPVRSRV_DC_SRV2DISP_KMJTABLE psFuncTable;
89
IMG_HANDLE hDevMemContext;
90
PVRSRV_DC_BUFFER sSystemBuffer;
91
struct PVRSRV_DC_SWAPCHAIN_TAG *psDCSwapChainShared;
92
} PVRSRV_DISPLAYCLASS_INFO;
95
typedef struct PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO_TAG
97
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
98
PRESMAN_ITEM hResItem;
99
} PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO;
102
typedef struct PVRSRV_BC_SRV2BUFFER_KMJTABLE_TAG *PPVRSRV_BC_SRV2BUFFER_KMJTABLE;
104
typedef struct PVRSRV_BC_BUFFER_TAG
107
PVRSRV_DEVICECLASS_BUFFER sDeviceClassBuffer;
109
struct PVRSRV_BUFFERCLASS_INFO_TAG *psBCInfo;
113
typedef struct PVRSRV_BUFFERCLASS_INFO_TAG
115
IMG_UINT32 ui32RefCount;
116
IMG_UINT32 ui32DeviceID;
117
IMG_HANDLE hExtDevice;
118
PPVRSRV_BC_SRV2BUFFER_KMJTABLE psFuncTable;
119
IMG_HANDLE hDevMemContext;
121
IMG_UINT32 ui32BufferCount;
122
PVRSRV_BC_BUFFER *psBuffer;
124
} PVRSRV_BUFFERCLASS_INFO;
127
typedef struct PVRSRV_BUFFERCLASS_PERCONTEXT_INFO_TAG
129
PVRSRV_BUFFERCLASS_INFO *psBCInfo;
131
} PVRSRV_BUFFERCLASS_PERCONTEXT_INFO;
134
static PVRSRV_DISPLAYCLASS_INFO* DCDeviceHandleToDCInfo (IMG_HANDLE hDeviceKM)
136
PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
138
psDCPerContextInfo = (PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *)hDeviceKM;
140
return psDCPerContextInfo->psDCInfo;
144
static PVRSRV_BUFFERCLASS_INFO* BCDeviceHandleToBCInfo (IMG_HANDLE hDeviceKM)
146
PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
148
psBCPerContextInfo = (PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *)hDeviceKM;
150
return psBCPerContextInfo->psBCInfo;
153
static IMG_VOID PVRSRVEnumerateDCKM_ForEachVaCb(PVRSRV_DEVICE_NODE *psDeviceNode, va_list va)
155
IMG_UINT *pui32DevCount;
156
IMG_UINT32 **ppui32DevID;
157
PVRSRV_DEVICE_CLASS peDeviceClass;
159
pui32DevCount = va_arg(va, IMG_UINT*);
160
ppui32DevID = va_arg(va, IMG_UINT32**);
161
peDeviceClass = va_arg(va, PVRSRV_DEVICE_CLASS);
163
if ((psDeviceNode->sDevId.eDeviceClass == peDeviceClass)
164
&& (psDeviceNode->sDevId.eDeviceType == PVRSRV_DEVICE_TYPE_EXT))
169
*(*ppui32DevID)++ = psDeviceNode->sDevId.ui32DeviceIndex;
176
PVRSRV_ERROR PVRSRVEnumerateDCKM (PVRSRV_DEVICE_CLASS DeviceClass,
177
IMG_UINT32 *pui32DevCount,
178
IMG_UINT32 *pui32DevID )
181
IMG_UINT ui32DevCount = 0;
184
SysAcquireData(&psSysData);
187
List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList,
188
&PVRSRVEnumerateDCKM_ForEachVaCb,
195
*pui32DevCount = ui32DevCount;
197
else if(pui32DevID == IMG_NULL)
199
PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumerateDCKM: Invalid parameters"));
200
return (PVRSRV_ERROR_INVALID_PARAMS);
208
PVRSRV_ERROR PVRSRVRegisterDCDeviceKM (PVRSRV_DC_SRV2DISP_KMJTABLE *psFuncTable,
209
IMG_UINT32 *pui32DeviceID)
211
PVRSRV_DISPLAYCLASS_INFO *psDCInfo = IMG_NULL;
212
PVRSRV_DEVICE_NODE *psDeviceNode;
230
SysAcquireData(&psSysData);
236
if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
238
(IMG_VOID **)&psDCInfo, IMG_NULL,
239
"Display Class Info") != PVRSRV_OK)
241
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psDCInfo alloc"));
242
return PVRSRV_ERROR_OUT_OF_MEMORY;
244
OSMemSet (psDCInfo, 0, sizeof(*psDCInfo));
247
if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
248
sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE),
249
(IMG_VOID **)&psDCInfo->psFuncTable, IMG_NULL,
250
"Function table for SRVKM->DISPLAY") != PVRSRV_OK)
252
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psFuncTable alloc"));
255
OSMemSet (psDCInfo->psFuncTable, 0, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE));
258
*psDCInfo->psFuncTable = *psFuncTable;
261
if(OSAllocMem( PVRSRV_OS_NON_PAGEABLE_HEAP,
262
sizeof(PVRSRV_DEVICE_NODE),
263
(IMG_VOID **)&psDeviceNode, IMG_NULL,
264
"Device Node") != PVRSRV_OK)
266
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterDCDeviceKM: Failed psDeviceNode alloc"));
269
OSMemSet (psDeviceNode, 0, sizeof(PVRSRV_DEVICE_NODE));
271
psDeviceNode->pvDevice = (IMG_VOID*)psDCInfo;
272
psDeviceNode->ui32pvDeviceSize = sizeof(*psDCInfo);
273
psDeviceNode->ui32RefCount = 1;
274
psDeviceNode->sDevId.eDeviceType = PVRSRV_DEVICE_TYPE_EXT;
275
psDeviceNode->sDevId.eDeviceClass = PVRSRV_DEVICE_CLASS_DISPLAY;
276
psDeviceNode->psSysData = psSysData;
279
if (AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex) != PVRSRV_OK)
281
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed to allocate Device ID"));
284
psDCInfo->ui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex;
287
*pui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex;
291
SysRegisterExternalDevice(psDeviceNode);
294
List_PVRSRV_DEVICE_NODE_Insert(&psSysData->psDeviceNodeList, psDeviceNode);
300
if(psDCInfo->psFuncTable)
302
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, IMG_NULL);
303
psDCInfo->psFuncTable = IMG_NULL;
306
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_INFO), psDCInfo, IMG_NULL);
309
return PVRSRV_ERROR_OUT_OF_MEMORY;
312
static PVRSRV_ERROR PVRSRVRemoveDCDeviceKM(IMG_UINT32 ui32DevIndex)
315
PVRSRV_DEVICE_NODE *psDeviceNode;
316
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
318
SysAcquireData(&psSysData);
321
psDeviceNode = (PVRSRV_DEVICE_NODE*)
322
List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
323
&MatchDeviceKM_AnyVaCb,
326
PVRSRV_DEVICE_CLASS_DISPLAY);
330
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveDCDeviceKM: requested device %d not present", ui32DevIndex));
331
return PVRSRV_ERROR_NO_DEVICENODE_FOUND;
335
psDCInfo = (PVRSRV_DISPLAYCLASS_INFO*)psDeviceNode->pvDevice;
340
if(psDCInfo->ui32RefCount == 0)
344
List_PVRSRV_DEVICE_NODE_Remove(psDeviceNode);
347
SysRemoveExternalDevice(psDeviceNode);
352
PVR_ASSERT(psDCInfo->ui32RefCount == 0);
353
(IMG_VOID)FreeDeviceID(psSysData, ui32DevIndex);
354
(IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SRV2DISP_KMJTABLE), psDCInfo->psFuncTable, IMG_NULL);
355
psDCInfo->psFuncTable = IMG_NULL;
356
(IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_INFO), psDCInfo, IMG_NULL);
358
(IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDeviceNode, IMG_NULL);
363
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveDCDeviceKM: failed as %d Services DC API connections are still open", psDCInfo->ui32RefCount));
364
return PVRSRV_ERROR_UNABLE_TO_REMOVE_DEVICE;
372
PVRSRV_ERROR PVRSRVRegisterBCDeviceKM (PVRSRV_BC_SRV2BUFFER_KMJTABLE *psFuncTable,
373
IMG_UINT32 *pui32DeviceID)
375
PVRSRV_BUFFERCLASS_INFO *psBCInfo = IMG_NULL;
376
PVRSRV_DEVICE_NODE *psDeviceNode;
392
SysAcquireData(&psSysData);
398
if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
400
(IMG_VOID **)&psBCInfo, IMG_NULL,
401
"Buffer Class Info") != PVRSRV_OK)
403
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed psBCInfo alloc"));
404
return PVRSRV_ERROR_OUT_OF_MEMORY;
406
OSMemSet (psBCInfo, 0, sizeof(*psBCInfo));
409
if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
410
sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE),
411
(IMG_VOID **)&psBCInfo->psFuncTable, IMG_NULL,
412
"Function table for SRVKM->BUFFER") != PVRSRV_OK)
414
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed psFuncTable alloc"));
417
OSMemSet (psBCInfo->psFuncTable, 0, sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE));
420
*psBCInfo->psFuncTable = *psFuncTable;
423
if(OSAllocMem( PVRSRV_OS_NON_PAGEABLE_HEAP,
424
sizeof(PVRSRV_DEVICE_NODE),
425
(IMG_VOID **)&psDeviceNode, IMG_NULL,
426
"Device Node") != PVRSRV_OK)
428
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed psDeviceNode alloc"));
431
OSMemSet (psDeviceNode, 0, sizeof(PVRSRV_DEVICE_NODE));
433
psDeviceNode->pvDevice = (IMG_VOID*)psBCInfo;
434
psDeviceNode->ui32pvDeviceSize = sizeof(*psBCInfo);
435
psDeviceNode->ui32RefCount = 1;
436
psDeviceNode->sDevId.eDeviceType = PVRSRV_DEVICE_TYPE_EXT;
437
psDeviceNode->sDevId.eDeviceClass = PVRSRV_DEVICE_CLASS_BUFFER;
438
psDeviceNode->psSysData = psSysData;
441
if (AllocateDeviceID(psSysData, &psDeviceNode->sDevId.ui32DeviceIndex) != PVRSRV_OK)
443
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterBCDeviceKM: Failed to allocate Device ID"));
446
psBCInfo->ui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex;
449
*pui32DeviceID = psDeviceNode->sDevId.ui32DeviceIndex;
453
List_PVRSRV_DEVICE_NODE_Insert(&psSysData->psDeviceNodeList, psDeviceNode);
459
if(psBCInfo->psFuncTable)
461
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PPVRSRV_BC_SRV2BUFFER_KMJTABLE), psBCInfo->psFuncTable, IMG_NULL);
462
psBCInfo->psFuncTable = IMG_NULL;
465
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BUFFERCLASS_INFO), psBCInfo, IMG_NULL);
468
return PVRSRV_ERROR_OUT_OF_MEMORY;
472
static PVRSRV_ERROR PVRSRVRemoveBCDeviceKM(IMG_UINT32 ui32DevIndex)
475
PVRSRV_DEVICE_NODE *psDevNode;
476
PVRSRV_BUFFERCLASS_INFO *psBCInfo;
478
SysAcquireData(&psSysData);
481
psDevNode = (PVRSRV_DEVICE_NODE*)
482
List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
483
&MatchDeviceKM_AnyVaCb,
486
PVRSRV_DEVICE_CLASS_BUFFER);
490
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveBCDeviceKM: requested device %d not present", ui32DevIndex));
491
return PVRSRV_ERROR_NO_DEVICENODE_FOUND;
496
psBCInfo = (PVRSRV_BUFFERCLASS_INFO*)psDevNode->pvDevice;
501
if(psBCInfo->ui32RefCount == 0)
505
List_PVRSRV_DEVICE_NODE_Remove(psDevNode);
510
(IMG_VOID)FreeDeviceID(psSysData, ui32DevIndex);
513
(IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_SRV2BUFFER_KMJTABLE), psBCInfo->psFuncTable, IMG_NULL);
514
psBCInfo->psFuncTable = IMG_NULL;
515
(IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BUFFERCLASS_INFO), psBCInfo, IMG_NULL);
517
(IMG_VOID)OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DEVICE_NODE), psDevNode, IMG_NULL);
522
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRemoveBCDeviceKM: failed as %d Services BC API connections are still open", psBCInfo->ui32RefCount));
523
return PVRSRV_ERROR_UNABLE_TO_REMOVE_DEVICE;
532
PVRSRV_ERROR PVRSRVCloseDCDeviceKM (IMG_HANDLE hDeviceKM,
533
IMG_BOOL bResManCallback)
536
PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
538
PVR_UNREFERENCED_PARAMETER(bResManCallback);
540
psDCPerContextInfo = (PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *)hDeviceKM;
543
eError = ResManFreeResByPtr(psDCPerContextInfo->hResItem, CLEANUP_WITH_POLL);
549
static PVRSRV_ERROR CloseDCDeviceCallBack(IMG_PVOID pvParam,
550
IMG_UINT32 ui32Param,
553
PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
554
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
556
PVR_UNREFERENCED_PARAMETER(ui32Param);
557
PVR_UNREFERENCED_PARAMETER(bDummy);
559
psDCPerContextInfo = (PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *)pvParam;
560
psDCInfo = psDCPerContextInfo->psDCInfo;
562
if(psDCInfo->sSystemBuffer.sDeviceClassBuffer.ui32MemMapRefCount != 0)
564
PVR_DPF((PVR_DBG_ERROR,"CloseDCDeviceCallBack: system buffer (0x%p) still mapped (refcount = %d)",
565
&psDCInfo->sSystemBuffer.sDeviceClassBuffer,
566
psDCInfo->sSystemBuffer.sDeviceClassBuffer.ui32MemMapRefCount));
569
return PVRSRV_ERROR_STILL_MAPPED;
573
psDCInfo->ui32RefCount--;
574
if(psDCInfo->ui32RefCount == 0)
577
psDCInfo->psFuncTable->pfnCloseDCDevice(psDCInfo->hExtDevice);
579
if (--psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
581
PVRSRVFreeSyncInfoKM(psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo);
584
psDCInfo->hDevMemContext = IMG_NULL;
585
psDCInfo->hExtDevice = IMG_NULL;
588
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO), psDCPerContextInfo, IMG_NULL);
596
PVRSRV_ERROR PVRSRVOpenDCDeviceKM (PVRSRV_PER_PROCESS_DATA *psPerProc,
597
IMG_UINT32 ui32DeviceID,
598
IMG_HANDLE hDevCookie,
599
IMG_HANDLE *phDeviceKM)
601
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
602
PVRSRV_DISPLAYCLASS_PERCONTEXT_INFO *psDCPerContextInfo;
603
PVRSRV_DEVICE_NODE *psDeviceNode;
607
if(!phDeviceKM || !hDevCookie)
609
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: Invalid params"));
610
return PVRSRV_ERROR_INVALID_PARAMS;
613
SysAcquireData(&psSysData);
616
psDeviceNode = (PVRSRV_DEVICE_NODE*)
617
List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
618
&MatchDeviceKM_AnyVaCb,
621
PVRSRV_DEVICE_CLASS_DISPLAY);
624
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: no devnode matching index %d", ui32DeviceID));
625
return PVRSRV_ERROR_NO_DEVICENODE_FOUND;
627
psDCInfo = (PVRSRV_DISPLAYCLASS_INFO*)psDeviceNode->pvDevice;
632
if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
633
sizeof(*psDCPerContextInfo),
634
(IMG_VOID **)&psDCPerContextInfo, IMG_NULL,
635
"Display Class per Context Info") != PVRSRV_OK)
637
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: Failed psDCPerContextInfo alloc"));
638
return PVRSRV_ERROR_OUT_OF_MEMORY;
640
OSMemSet(psDCPerContextInfo, 0, sizeof(*psDCPerContextInfo));
642
if(psDCInfo->ui32RefCount++ == 0)
645
psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevCookie;
648
psDCInfo->hDevMemContext = (IMG_HANDLE)psDeviceNode->sDevMemoryInfo.pBMKernelContext;
651
eError = PVRSRVAllocSyncInfoKM(IMG_NULL,
652
(IMG_HANDLE)psDeviceNode->sDevMemoryInfo.pBMKernelContext,
653
&psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo);
654
if(eError != PVRSRV_OK)
656
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: Failed sync info alloc"));
657
psDCInfo->ui32RefCount--;
662
eError = psDCInfo->psFuncTable->pfnOpenDCDevice(ui32DeviceID,
663
&psDCInfo->hExtDevice,
664
(PVRSRV_SYNC_DATA*)psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo->psSyncDataMemInfoKM->pvLinAddrKM);
665
if(eError != PVRSRV_OK)
667
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenDCDeviceKM: Failed to open external DC device"));
668
psDCInfo->ui32RefCount--;
669
PVRSRVFreeSyncInfoKM(psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo);
673
psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount++;
674
psDCInfo->sSystemBuffer.sDeviceClassBuffer.ui32MemMapRefCount = 0;
677
psDCPerContextInfo->psDCInfo = psDCInfo;
678
psDCPerContextInfo->hResItem = ResManRegisterRes(psPerProc->hResManContext,
679
RESMAN_TYPE_DISPLAYCLASS_DEVICE,
682
&CloseDCDeviceCallBack);
685
*phDeviceKM = (IMG_HANDLE)psDCPerContextInfo;
692
PVRSRV_ERROR PVRSRVEnumDCFormatsKM (IMG_HANDLE hDeviceKM,
693
IMG_UINT32 *pui32Count,
694
DISPLAY_FORMAT *psFormat)
696
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
698
if(!hDeviceKM || !pui32Count || !psFormat)
700
PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumDCFormatsKM: Invalid parameters"));
701
return PVRSRV_ERROR_INVALID_PARAMS;
704
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
707
return psDCInfo->psFuncTable->pfnEnumDCFormats(psDCInfo->hExtDevice, pui32Count, psFormat);
713
PVRSRV_ERROR PVRSRVEnumDCDimsKM (IMG_HANDLE hDeviceKM,
714
DISPLAY_FORMAT *psFormat,
715
IMG_UINT32 *pui32Count,
718
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
720
if(!hDeviceKM || !pui32Count || !psFormat)
722
PVR_DPF((PVR_DBG_ERROR,"PVRSRVEnumDCDimsKM: Invalid parameters"));
723
return PVRSRV_ERROR_INVALID_PARAMS;
726
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
729
return psDCInfo->psFuncTable->pfnEnumDCDims(psDCInfo->hExtDevice, psFormat, pui32Count, psDim);
734
PVRSRV_ERROR PVRSRVGetDCSystemBufferKM (IMG_HANDLE hDeviceKM,
735
IMG_HANDLE *phBuffer)
738
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
739
IMG_HANDLE hExtBuffer;
741
if(!hDeviceKM || !phBuffer)
743
PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetDCSystemBufferKM: Invalid parameters"));
744
return PVRSRV_ERROR_INVALID_PARAMS;
747
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
750
eError = psDCInfo->psFuncTable->pfnGetDCSystemBuffer(psDCInfo->hExtDevice, &hExtBuffer);
751
if(eError != PVRSRV_OK)
753
PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetDCSystemBufferKM: Failed to get valid buffer handle from external driver"));
758
psDCInfo->sSystemBuffer.sDeviceClassBuffer.pfnGetBufferAddr = psDCInfo->psFuncTable->pfnGetBufferAddr;
759
psDCInfo->sSystemBuffer.sDeviceClassBuffer.hDevMemContext = psDCInfo->hDevMemContext;
760
psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtDevice = psDCInfo->hExtDevice;
761
psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtBuffer = hExtBuffer;
763
psDCInfo->sSystemBuffer.psDCInfo = psDCInfo;
766
*phBuffer = (IMG_HANDLE)&(psDCInfo->sSystemBuffer);
773
PVRSRV_ERROR PVRSRVGetDCInfoKM (IMG_HANDLE hDeviceKM,
774
DISPLAY_INFO *psDisplayInfo)
776
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
779
if(!hDeviceKM || !psDisplayInfo)
781
PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetDCInfoKM: Invalid parameters"));
782
return PVRSRV_ERROR_INVALID_PARAMS;
785
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
788
eError = psDCInfo->psFuncTable->pfnGetDCInfo(psDCInfo->hExtDevice, psDisplayInfo);
789
if (eError != PVRSRV_OK)
794
if (psDisplayInfo->ui32MaxSwapChainBuffers > PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS)
796
psDisplayInfo->ui32MaxSwapChainBuffers = PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS;
804
PVRSRV_ERROR PVRSRVDestroyDCSwapChainKM(IMG_HANDLE hSwapChainRef)
807
PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef;
811
PVR_DPF((PVR_DBG_ERROR,"PVRSRVDestroyDCSwapChainKM: Invalid parameters"));
812
return PVRSRV_ERROR_INVALID_PARAMS;
815
psSwapChainRef = hSwapChainRef;
817
eError = ResManFreeResByPtr(psSwapChainRef->hResItem, CLEANUP_WITH_POLL);
823
static PVRSRV_ERROR DestroyDCSwapChain(PVRSRV_DC_SWAPCHAIN *psSwapChain)
826
PVRSRV_DISPLAYCLASS_INFO *psDCInfo = psSwapChain->psDCInfo;
830
if( psDCInfo->psDCSwapChainShared )
832
if( psDCInfo->psDCSwapChainShared == psSwapChain )
834
psDCInfo->psDCSwapChainShared = psSwapChain->psNext;
838
PVRSRV_DC_SWAPCHAIN *psCurrentSwapChain;
839
psCurrentSwapChain = psDCInfo->psDCSwapChainShared;
840
while( psCurrentSwapChain->psNext )
842
if( psCurrentSwapChain->psNext != psSwapChain )
844
psCurrentSwapChain = psCurrentSwapChain->psNext;
847
psCurrentSwapChain->psNext = psSwapChain->psNext;
854
PVRSRVDestroyCommandQueueKM(psSwapChain->psQueue);
857
eError = psDCInfo->psFuncTable->pfnDestroyDCSwapChain(psDCInfo->hExtDevice,
858
psSwapChain->hExtSwapChain);
860
if (eError != PVRSRV_OK)
862
PVR_DPF((PVR_DBG_ERROR,"DestroyDCSwapChainCallBack: Failed to destroy DC swap chain"));
867
for(i=0; i<psSwapChain->ui32BufferCount; i++)
869
if(psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
871
if (--psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
873
PVRSRVFreeSyncInfoKM(psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
878
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SWAPCHAIN), psSwapChain, IMG_NULL);
885
static PVRSRV_ERROR DestroyDCSwapChainRefCallBack(IMG_PVOID pvParam,
886
IMG_UINT32 ui32Param,
889
PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef = (PVRSRV_DC_SWAPCHAIN_REF *) pvParam;
890
PVRSRV_ERROR eError = PVRSRV_OK;
893
PVR_UNREFERENCED_PARAMETER(ui32Param);
894
PVR_UNREFERENCED_PARAMETER(bDummy);
896
for (i = 0; i < psSwapChainRef->psSwapChain->ui32BufferCount; i++)
898
if (psSwapChainRef->psSwapChain->asBuffer[i].sDeviceClassBuffer.ui32MemMapRefCount != 0)
900
PVR_DPF((PVR_DBG_ERROR, "DestroyDCSwapChainRefCallBack: swapchain (0x%p) still mapped (ui32MemMapRefCount = %d)",
901
&psSwapChainRef->psSwapChain->asBuffer[i].sDeviceClassBuffer,
902
psSwapChainRef->psSwapChain->asBuffer[i].sDeviceClassBuffer.ui32MemMapRefCount));
905
return PVRSRV_ERROR_STILL_MAPPED;
910
if(--psSwapChainRef->psSwapChain->ui32RefCount == 0)
912
eError = DestroyDCSwapChain(psSwapChainRef->psSwapChain);
915
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SWAPCHAIN_REF), psSwapChainRef, IMG_NULL);
919
static PVRSRV_DC_SWAPCHAIN* PVRSRVFindSharedDCSwapChainKM(PVRSRV_DISPLAYCLASS_INFO *psDCInfo,
920
IMG_UINT32 ui32SwapChainID)
922
PVRSRV_DC_SWAPCHAIN *psCurrentSwapChain;
924
for(psCurrentSwapChain = psDCInfo->psDCSwapChainShared;
926
psCurrentSwapChain = psCurrentSwapChain->psNext)
928
if(psCurrentSwapChain->ui32SwapChainID == ui32SwapChainID)
929
return psCurrentSwapChain;
934
static PVRSRV_ERROR PVRSRVCreateDCSwapChainRefKM(PVRSRV_PER_PROCESS_DATA *psPerProc,
935
PVRSRV_DC_SWAPCHAIN *psSwapChain,
936
PVRSRV_DC_SWAPCHAIN_REF **ppsSwapChainRef)
938
PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef = IMG_NULL;
941
if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
942
sizeof(PVRSRV_DC_SWAPCHAIN_REF),
943
(IMG_VOID **)&psSwapChainRef, IMG_NULL,
944
"Display Class Swapchain Reference") != PVRSRV_OK)
946
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainRefKM: Failed psSwapChainRef alloc"));
947
return PVRSRV_ERROR_OUT_OF_MEMORY;
949
OSMemSet (psSwapChainRef, 0, sizeof(PVRSRV_DC_SWAPCHAIN_REF));
952
psSwapChain->ui32RefCount++;
955
psSwapChainRef->psSwapChain = psSwapChain;
956
psSwapChainRef->hResItem = ResManRegisterRes(psPerProc->hResManContext,
957
RESMAN_TYPE_DISPLAYCLASS_SWAPCHAIN_REF,
960
&DestroyDCSwapChainRefCallBack);
961
*ppsSwapChainRef = psSwapChainRef;
968
PVRSRV_ERROR PVRSRVCreateDCSwapChainKM (PVRSRV_PER_PROCESS_DATA *psPerProc,
969
IMG_HANDLE hDeviceKM,
970
IMG_UINT32 ui32Flags,
971
DISPLAY_SURF_ATTRIBUTES *psDstSurfAttrib,
972
DISPLAY_SURF_ATTRIBUTES *psSrcSurfAttrib,
973
IMG_UINT32 ui32BufferCount,
974
IMG_UINT32 ui32OEMFlags,
975
IMG_HANDLE *phSwapChainRef,
976
IMG_UINT32 *pui32SwapChainID)
978
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
979
PVRSRV_DC_SWAPCHAIN *psSwapChain = IMG_NULL;
980
PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef = IMG_NULL;
981
PVRSRV_SYNC_DATA *apsSyncData[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS];
982
PVRSRV_QUEUE_INFO *psQueue = IMG_NULL;
985
DISPLAY_INFO sDisplayInfo;
992
|| !pui32SwapChainID)
994
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Invalid parameters"));
995
return PVRSRV_ERROR_INVALID_PARAMS;
998
if (ui32BufferCount > PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS)
1000
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Too many buffers"));
1001
return PVRSRV_ERROR_TOOMANYBUFFERS;
1004
if (ui32BufferCount < 2)
1006
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Too few buffers"));
1007
return PVRSRV_ERROR_TOO_FEW_BUFFERS;
1010
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
1012
if( ui32Flags & PVRSRV_CREATE_SWAPCHAIN_QUERY )
1015
psSwapChain = PVRSRVFindSharedDCSwapChainKM(psDCInfo, *pui32SwapChainID );
1019
eError = PVRSRVCreateDCSwapChainRefKM(psPerProc,
1022
if( eError != PVRSRV_OK )
1024
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Couldn't create swap chain reference"));
1028
*phSwapChainRef = (IMG_HANDLE)psSwapChainRef;
1031
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: No shared SwapChain found for query"));
1032
return PVRSRV_ERROR_FLIP_CHAIN_EXISTS;
1036
if(OSAllocMem( PVRSRV_OS_PAGEABLE_HEAP,
1037
sizeof(PVRSRV_DC_SWAPCHAIN),
1038
(IMG_VOID **)&psSwapChain, IMG_NULL,
1039
"Display Class Swapchain") != PVRSRV_OK)
1041
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed psSwapChain alloc"));
1042
eError = PVRSRV_ERROR_OUT_OF_MEMORY;
1045
OSMemSet (psSwapChain, 0, sizeof(PVRSRV_DC_SWAPCHAIN));
1048
eError = PVRSRVCreateCommandQueueKM(1024, &psQueue);
1049
if(eError != PVRSRV_OK)
1051
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed to create CmdQueue"));
1056
psSwapChain->psQueue = psQueue;
1059
for(i=0; i<ui32BufferCount; i++)
1061
eError = PVRSRVAllocSyncInfoKM(IMG_NULL,
1062
psDCInfo->hDevMemContext,
1063
&psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
1064
if(eError != PVRSRV_OK)
1066
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed to alloc syninfo for psSwapChain"));
1070
psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount++;
1073
psSwapChain->asBuffer[i].sDeviceClassBuffer.pfnGetBufferAddr = psDCInfo->psFuncTable->pfnGetBufferAddr;
1074
psSwapChain->asBuffer[i].sDeviceClassBuffer.hDevMemContext = psDCInfo->hDevMemContext;
1075
psSwapChain->asBuffer[i].sDeviceClassBuffer.hExtDevice = psDCInfo->hExtDevice;
1078
psSwapChain->asBuffer[i].psDCInfo = psDCInfo;
1079
psSwapChain->asBuffer[i].psSwapChain = psSwapChain;
1082
apsSyncData[i] = (PVRSRV_SYNC_DATA*)psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->psSyncDataMemInfoKM->pvLinAddrKM;
1085
psSwapChain->ui32BufferCount = ui32BufferCount;
1086
psSwapChain->psDCInfo = psDCInfo;
1089
PDUMPCOMMENT("Allocate DC swap chain (SwapChainID == %u, BufferCount == %u)",
1092
PDUMPCOMMENT(" Src surface dimensions == %u x %u",
1093
psSrcSurfAttrib->sDims.ui32Width,
1094
psSrcSurfAttrib->sDims.ui32Height);
1095
PDUMPCOMMENT(" Dst surface dimensions == %u x %u",
1096
psDstSurfAttrib->sDims.ui32Width,
1097
psDstSurfAttrib->sDims.ui32Height);
1100
eError = psDCInfo->psFuncTable->pfnGetDCInfo(psDCInfo->hExtDevice, &sDisplayInfo);
1101
if (eError != PVRSRV_OK)
1103
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed to get DC info"));
1107
psSwapChain->ui32MinSwapInterval = sDisplayInfo.ui32MinSwapInterval;
1108
psSwapChain->ui32MaxSwapInterval = sDisplayInfo.ui32MaxSwapInterval;
1111
eError = psDCInfo->psFuncTable->pfnCreateDCSwapChain(psDCInfo->hExtDevice,
1118
&psSwapChain->hExtSwapChain,
1119
&psSwapChain->ui32SwapChainID);
1120
if(eError != PVRSRV_OK)
1122
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Failed to create 3rd party SwapChain"));
1123
PDUMPCOMMENT("Swapchain allocation failed.");
1128
eError = PVRSRVCreateDCSwapChainRefKM(psPerProc,
1131
if( eError != PVRSRV_OK )
1133
PVR_DPF((PVR_DBG_ERROR,"PVRSRVCreateDCSwapChainKM: Couldn't create swap chain reference"));
1134
PDUMPCOMMENT("Swapchain allocation failed.");
1138
psSwapChain->ui32RefCount = 1;
1139
psSwapChain->ui32Flags = ui32Flags;
1142
if( ui32Flags & PVRSRV_CREATE_SWAPCHAIN_SHARED )
1144
if(! psDCInfo->psDCSwapChainShared )
1146
psDCInfo->psDCSwapChainShared = psSwapChain;
1150
PVRSRV_DC_SWAPCHAIN *psOldHead = psDCInfo->psDCSwapChainShared;
1151
psDCInfo->psDCSwapChainShared = psSwapChain;
1152
psSwapChain->psNext = psOldHead;
1157
*pui32SwapChainID = psSwapChain->ui32SwapChainID;
1160
*phSwapChainRef= (IMG_HANDLE)psSwapChainRef;
1166
for(i=0; i<ui32BufferCount; i++)
1168
if(psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
1170
if (--psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
1172
PVRSRVFreeSyncInfoKM(psSwapChain->asBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
1179
PVRSRVDestroyCommandQueueKM(psQueue);
1184
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_DC_SWAPCHAIN), psSwapChain, IMG_NULL);
1195
PVRSRV_ERROR PVRSRVSetDCDstRectKM(IMG_HANDLE hDeviceKM,
1196
IMG_HANDLE hSwapChainRef,
1199
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
1200
PVRSRV_DC_SWAPCHAIN *psSwapChain;
1202
if(!hDeviceKM || !hSwapChainRef)
1204
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSetDCDstRectKM: Invalid parameters"));
1205
return PVRSRV_ERROR_INVALID_PARAMS;
1208
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
1209
psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
1211
return psDCInfo->psFuncTable->pfnSetDCDstRect(psDCInfo->hExtDevice,
1212
psSwapChain->hExtSwapChain,
1218
PVRSRV_ERROR PVRSRVSetDCSrcRectKM(IMG_HANDLE hDeviceKM,
1219
IMG_HANDLE hSwapChainRef,
1222
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
1223
PVRSRV_DC_SWAPCHAIN *psSwapChain;
1225
if(!hDeviceKM || !hSwapChainRef)
1227
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSetDCSrcRectKM: Invalid parameters"));
1228
return PVRSRV_ERROR_INVALID_PARAMS;
1231
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
1232
psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
1234
return psDCInfo->psFuncTable->pfnSetDCSrcRect(psDCInfo->hExtDevice,
1235
psSwapChain->hExtSwapChain,
1241
PVRSRV_ERROR PVRSRVSetDCDstColourKeyKM(IMG_HANDLE hDeviceKM,
1242
IMG_HANDLE hSwapChainRef,
1243
IMG_UINT32 ui32CKColour)
1245
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
1246
PVRSRV_DC_SWAPCHAIN *psSwapChain;
1248
if(!hDeviceKM || !hSwapChainRef)
1250
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSetDCDstColourKeyKM: Invalid parameters"));
1251
return PVRSRV_ERROR_INVALID_PARAMS;
1254
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
1255
psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
1257
return psDCInfo->psFuncTable->pfnSetDCDstColourKey(psDCInfo->hExtDevice,
1258
psSwapChain->hExtSwapChain,
1264
PVRSRV_ERROR PVRSRVSetDCSrcColourKeyKM(IMG_HANDLE hDeviceKM,
1265
IMG_HANDLE hSwapChainRef,
1266
IMG_UINT32 ui32CKColour)
1268
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
1269
PVRSRV_DC_SWAPCHAIN *psSwapChain;
1271
if(!hDeviceKM || !hSwapChainRef)
1273
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSetDCSrcColourKeyKM: Invalid parameters"));
1274
return PVRSRV_ERROR_INVALID_PARAMS;
1277
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
1278
psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
1280
return psDCInfo->psFuncTable->pfnSetDCSrcColourKey(psDCInfo->hExtDevice,
1281
psSwapChain->hExtSwapChain,
1287
PVRSRV_ERROR PVRSRVGetDCBuffersKM(IMG_HANDLE hDeviceKM,
1288
IMG_HANDLE hSwapChainRef,
1289
IMG_UINT32 *pui32BufferCount,
1290
IMG_HANDLE *phBuffer)
1292
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
1293
PVRSRV_DC_SWAPCHAIN *psSwapChain;
1294
IMG_HANDLE ahExtBuffer[PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS];
1295
PVRSRV_ERROR eError;
1298
if(!hDeviceKM || !hSwapChainRef || !phBuffer)
1300
PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetDCBuffersKM: Invalid parameters"));
1301
return PVRSRV_ERROR_INVALID_PARAMS;
1304
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
1305
psSwapChain = ((PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef)->psSwapChain;
1308
eError = psDCInfo->psFuncTable->pfnGetDCBuffers(psDCInfo->hExtDevice,
1309
psSwapChain->hExtSwapChain,
1313
PVR_ASSERT(*pui32BufferCount <= PVRSRV_MAX_DC_SWAPCHAIN_BUFFERS);
1318
for(i=0; i<*pui32BufferCount; i++)
1320
psSwapChain->asBuffer[i].sDeviceClassBuffer.hExtBuffer = ahExtBuffer[i];
1321
phBuffer[i] = (IMG_HANDLE)&psSwapChain->asBuffer[i];
1329
PVRSRV_ERROR PVRSRVSwapToDCBufferKM(IMG_HANDLE hDeviceKM,
1331
IMG_UINT32 ui32SwapInterval,
1332
IMG_HANDLE hPrivateTag,
1333
IMG_UINT32 ui32ClipRectCount,
1334
IMG_RECT *psClipRect)
1336
PVRSRV_ERROR eError;
1337
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
1338
PVRSRV_DC_BUFFER *psBuffer;
1339
PVRSRV_QUEUE_INFO *psQueue;
1340
DISPLAYCLASS_FLIP_COMMAND *psFlipCmd;
1342
IMG_BOOL bAddReferenceToLast = IMG_TRUE;
1343
IMG_UINT16 ui16SwapCommandID = DC_FLIP_COMMAND;
1344
IMG_UINT32 ui32NumSrcSyncs = 1;
1345
PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[2];
1346
PVRSRV_COMMAND *psCommand;
1347
SYS_DATA *psSysData;
1349
if(!hDeviceKM || !hBuffer || !psClipRect)
1351
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Invalid parameters"));
1352
return PVRSRV_ERROR_INVALID_PARAMS;
1355
psBuffer = (PVRSRV_DC_BUFFER*)hBuffer;
1356
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
1359
if(ui32SwapInterval < psBuffer->psSwapChain->ui32MinSwapInterval ||
1360
ui32SwapInterval > psBuffer->psSwapChain->ui32MaxSwapInterval)
1362
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Invalid swap interval. Requested %u, Allowed range %u-%u",
1363
ui32SwapInterval, psBuffer->psSwapChain->ui32MinSwapInterval, psBuffer->psSwapChain->ui32MaxSwapInterval));
1364
return PVRSRV_ERROR_INVALID_SWAPINTERVAL;
1367
#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS)
1369
if(psDCInfo->psFuncTable->pfnQuerySwapCommandID != IMG_NULL)
1371
psDCInfo->psFuncTable->pfnQuerySwapCommandID(psDCInfo->hExtDevice,
1372
psBuffer->psSwapChain->hExtSwapChain,
1373
psBuffer->sDeviceClassBuffer.hExtBuffer,
1376
&bAddReferenceToLast);
1383
psQueue = psBuffer->psSwapChain->psQueue;
1386
apsSrcSync[0] = psBuffer->sDeviceClassBuffer.psKernelSyncInfo;
1390
if(bAddReferenceToLast && psBuffer->psSwapChain->psLastFlipBuffer &&
1391
psBuffer != psBuffer->psSwapChain->psLastFlipBuffer)
1393
apsSrcSync[1] = psBuffer->psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.psKernelSyncInfo;
1401
eError = PVRSRVInsertCommandKM (psQueue,
1403
psDCInfo->ui32DeviceID,
1409
sizeof(DISPLAYCLASS_FLIP_COMMAND) + (sizeof(IMG_RECT) * ui32ClipRectCount));
1410
if(eError != PVRSRV_OK)
1412
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Failed to get space in queue"));
1417
psFlipCmd = (DISPLAYCLASS_FLIP_COMMAND*)psCommand->pvData;
1420
psFlipCmd->hExtDevice = psDCInfo->hExtDevice;
1423
psFlipCmd->hExtSwapChain = psBuffer->psSwapChain->hExtSwapChain;
1426
psFlipCmd->hExtBuffer = psBuffer->sDeviceClassBuffer.hExtBuffer;
1429
psFlipCmd->hPrivateTag = hPrivateTag;
1432
psFlipCmd->ui32ClipRectCount = ui32ClipRectCount;
1434
psFlipCmd->psClipRect = (IMG_RECT*)((IMG_UINT8*)psFlipCmd + sizeof(DISPLAYCLASS_FLIP_COMMAND));
1436
for(i=0; i<ui32ClipRectCount; i++)
1438
psFlipCmd->psClipRect[i] = psClipRect[i];
1442
psFlipCmd->ui32SwapInterval = ui32SwapInterval;
1445
eError = PVRSRVSubmitCommandKM (psQueue, psCommand);
1446
if (eError != PVRSRV_OK)
1448
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Failed to submit command"));
1454
SysAcquireData(&psSysData);
1455
eError = OSScheduleMISR(psSysData);
1457
if (eError != PVRSRV_OK)
1459
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCBufferKM: Failed to schedule MISR"));
1464
psBuffer->psSwapChain->psLastFlipBuffer = psBuffer;
1468
if(eError == PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE)
1470
eError = PVRSRV_ERROR_RETRY;
1478
PVRSRV_ERROR PVRSRVSwapToDCSystemKM(IMG_HANDLE hDeviceKM,
1479
IMG_HANDLE hSwapChainRef)
1481
PVRSRV_ERROR eError;
1482
PVRSRV_QUEUE_INFO *psQueue;
1483
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
1484
PVRSRV_DC_SWAPCHAIN *psSwapChain;
1485
PVRSRV_DC_SWAPCHAIN_REF *psSwapChainRef;
1486
DISPLAYCLASS_FLIP_COMMAND *psFlipCmd;
1487
IMG_UINT32 ui32NumSrcSyncs = 1;
1488
PVRSRV_KERNEL_SYNC_INFO *apsSrcSync[2];
1489
PVRSRV_COMMAND *psCommand;
1490
IMG_BOOL bAddReferenceToLast = IMG_TRUE;
1491
IMG_UINT16 ui16SwapCommandID = DC_FLIP_COMMAND;
1492
SYS_DATA *psSysData;
1494
if(!hDeviceKM || !hSwapChainRef)
1496
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCSystemKM: Invalid parameters"));
1497
return PVRSRV_ERROR_INVALID_PARAMS;
1500
psDCInfo = DCDeviceHandleToDCInfo(hDeviceKM);
1501
psSwapChainRef = (PVRSRV_DC_SWAPCHAIN_REF*)hSwapChainRef;
1502
psSwapChain = psSwapChainRef->psSwapChain;
1505
psQueue = psSwapChain->psQueue;
1507
#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS)
1509
if(psDCInfo->psFuncTable->pfnQuerySwapCommandID != IMG_NULL)
1511
psDCInfo->psFuncTable->pfnQuerySwapCommandID(psDCInfo->hExtDevice,
1512
psSwapChain->hExtSwapChain,
1513
psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtBuffer,
1516
&bAddReferenceToLast);
1523
apsSrcSync[0] = psDCInfo->sSystemBuffer.sDeviceClassBuffer.psKernelSyncInfo;
1527
if(bAddReferenceToLast && psSwapChain->psLastFlipBuffer)
1530
if (apsSrcSync[0] != psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.psKernelSyncInfo)
1532
apsSrcSync[1] = psSwapChain->psLastFlipBuffer->sDeviceClassBuffer.psKernelSyncInfo;
1541
eError = PVRSRVInsertCommandKM (psQueue,
1543
psDCInfo->ui32DeviceID,
1549
sizeof(DISPLAYCLASS_FLIP_COMMAND));
1550
if(eError != PVRSRV_OK)
1552
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCSystemKM: Failed to get space in queue"));
1557
psFlipCmd = (DISPLAYCLASS_FLIP_COMMAND*)psCommand->pvData;
1560
psFlipCmd->hExtDevice = psDCInfo->hExtDevice;
1563
psFlipCmd->hExtSwapChain = psSwapChain->hExtSwapChain;
1566
psFlipCmd->hExtBuffer = psDCInfo->sSystemBuffer.sDeviceClassBuffer.hExtBuffer;
1569
psFlipCmd->hPrivateTag = IMG_NULL;
1572
psFlipCmd->ui32ClipRectCount = 0;
1574
psFlipCmd->ui32SwapInterval = 1;
1577
eError = PVRSRVSubmitCommandKM (psQueue, psCommand);
1578
if (eError != PVRSRV_OK)
1580
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCSystemKM: Failed to submit command"));
1585
SysAcquireData(&psSysData);
1586
eError = OSScheduleMISR(psSysData);
1588
if (eError != PVRSRV_OK)
1590
PVR_DPF((PVR_DBG_ERROR,"PVRSRVSwapToDCSystemKM: Failed to schedule MISR"));
1595
psSwapChain->psLastFlipBuffer = &psDCInfo->sSystemBuffer;
1601
if(eError == PVRSRV_ERROR_CANNOT_GET_QUEUE_SPACE)
1603
eError = PVRSRV_ERROR_RETRY;
1611
PVRSRV_ERROR PVRSRVRegisterSystemISRHandler (PFN_ISR_HANDLER pfnISRHandler,
1612
IMG_VOID *pvISRHandlerData,
1613
IMG_UINT32 ui32ISRSourceMask,
1614
IMG_UINT32 ui32DeviceID)
1616
SYS_DATA *psSysData;
1617
PVRSRV_DEVICE_NODE *psDevNode;
1619
PVR_UNREFERENCED_PARAMETER(ui32ISRSourceMask);
1621
SysAcquireData(&psSysData);
1624
psDevNode = (PVRSRV_DEVICE_NODE*)
1625
List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
1626
&MatchDeviceKM_AnyVaCb,
1630
if (psDevNode == IMG_NULL)
1632
PVR_DPF((PVR_DBG_ERROR,"PVRSRVRegisterSystemISRHandler: Failed to get psDevNode"));
1634
return PVRSRV_ERROR_NO_DEVICENODE_FOUND;
1638
psDevNode->pvISRData = (IMG_VOID*) pvISRHandlerData;
1641
psDevNode->pfnDeviceISR = pfnISRHandler;
1647
IMG_VOID PVRSRVSetDCState_ForEachVaCb(PVRSRV_DEVICE_NODE *psDeviceNode, va_list va)
1649
PVRSRV_DISPLAYCLASS_INFO *psDCInfo;
1650
IMG_UINT32 ui32State;
1651
ui32State = va_arg(va, IMG_UINT32);
1653
if (psDeviceNode->sDevId.eDeviceClass == PVRSRV_DEVICE_CLASS_DISPLAY)
1655
psDCInfo = (PVRSRV_DISPLAYCLASS_INFO *)psDeviceNode->pvDevice;
1656
if (psDCInfo->psFuncTable->pfnSetDCState && psDCInfo->hExtDevice)
1658
psDCInfo->psFuncTable->pfnSetDCState(psDCInfo->hExtDevice, ui32State);
1664
IMG_VOID IMG_CALLCONV PVRSRVSetDCState(IMG_UINT32 ui32State)
1666
SYS_DATA *psSysData;
1668
SysAcquireData(&psSysData);
1670
List_PVRSRV_DEVICE_NODE_ForEach_va(psSysData->psDeviceNodeList,
1671
&PVRSRVSetDCState_ForEachVaCb,
1677
IMG_BOOL PVRGetDisplayClassJTable(PVRSRV_DC_DISP2SRV_KMJTABLE *psJTable)
1679
psJTable->ui32TableSize = sizeof(PVRSRV_DC_DISP2SRV_KMJTABLE);
1680
psJTable->pfnPVRSRVRegisterDCDevice = &PVRSRVRegisterDCDeviceKM;
1681
psJTable->pfnPVRSRVRemoveDCDevice = &PVRSRVRemoveDCDeviceKM;
1682
psJTable->pfnPVRSRVOEMFunction = &SysOEMFunction;
1683
psJTable->pfnPVRSRVRegisterCmdProcList = &PVRSRVRegisterCmdProcListKM;
1684
psJTable->pfnPVRSRVRemoveCmdProcList = &PVRSRVRemoveCmdProcListKM;
1685
#if defined(SUPPORT_MISR_IN_THREAD)
1686
psJTable->pfnPVRSRVCmdComplete = &OSVSyncMISR;
1688
psJTable->pfnPVRSRVCmdComplete = &PVRSRVCommandCompleteKM;
1690
psJTable->pfnPVRSRVRegisterSystemISRHandler = &PVRSRVRegisterSystemISRHandler;
1691
psJTable->pfnPVRSRVRegisterPowerDevice = &PVRSRVRegisterPowerDevice;
1692
#if defined(SUPPORT_CUSTOM_SWAP_OPERATIONS)
1693
psJTable->pfnPVRSRVFreeCmdCompletePacket = &PVRSRVFreeCommandCompletePacketKM;
1702
PVRSRV_ERROR PVRSRVCloseBCDeviceKM (IMG_HANDLE hDeviceKM,
1703
IMG_BOOL bResManCallback)
1705
PVRSRV_ERROR eError;
1706
PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
1708
PVR_UNREFERENCED_PARAMETER(bResManCallback);
1710
psBCPerContextInfo = (PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *)hDeviceKM;
1713
eError = ResManFreeResByPtr(psBCPerContextInfo->hResItem, CLEANUP_WITH_POLL);
1719
static PVRSRV_ERROR CloseBCDeviceCallBack(IMG_PVOID pvParam,
1720
IMG_UINT32 ui32Param,
1723
PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
1724
PVRSRV_BUFFERCLASS_INFO *psBCInfo;
1727
PVR_UNREFERENCED_PARAMETER(ui32Param);
1728
PVR_UNREFERENCED_PARAMETER(bDummy);
1730
psBCPerContextInfo = (PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *)pvParam;
1732
psBCInfo = psBCPerContextInfo->psBCInfo;
1734
for (i = 0; i < psBCInfo->ui32BufferCount; i++)
1736
if (psBCInfo->psBuffer[i].sDeviceClassBuffer.ui32MemMapRefCount != 0)
1738
PVR_DPF((PVR_DBG_ERROR, "CloseBCDeviceCallBack: buffer %d (0x%p) still mapped (ui32MemMapRefCount = %d)",
1740
&psBCInfo->psBuffer[i].sDeviceClassBuffer,
1741
psBCInfo->psBuffer[i].sDeviceClassBuffer.ui32MemMapRefCount));
1742
return PVRSRV_ERROR_STILL_MAPPED;
1746
psBCInfo->ui32RefCount--;
1747
if(psBCInfo->ui32RefCount == 0)
1750
psBCInfo->psFuncTable->pfnCloseBCDevice(psBCInfo->ui32DeviceID, psBCInfo->hExtDevice);
1753
for(i=0; i<psBCInfo->ui32BufferCount; i++)
1755
if(psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
1757
if (--psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
1759
PVRSRVFreeSyncInfoKM(psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
1765
if(psBCInfo->psBuffer)
1767
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_BUFFER) * psBCInfo->ui32BufferCount, psBCInfo->psBuffer, IMG_NULL);
1768
psBCInfo->psBuffer = IMG_NULL;
1772
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BUFFERCLASS_PERCONTEXT_INFO), psBCPerContextInfo, IMG_NULL);
1780
PVRSRV_ERROR PVRSRVOpenBCDeviceKM (PVRSRV_PER_PROCESS_DATA *psPerProc,
1781
IMG_UINT32 ui32DeviceID,
1782
IMG_HANDLE hDevCookie,
1783
IMG_HANDLE *phDeviceKM)
1785
PVRSRV_BUFFERCLASS_INFO *psBCInfo;
1786
PVRSRV_BUFFERCLASS_PERCONTEXT_INFO *psBCPerContextInfo;
1787
PVRSRV_DEVICE_NODE *psDeviceNode;
1788
SYS_DATA *psSysData;
1790
PVRSRV_ERROR eError;
1792
if(!phDeviceKM || !hDevCookie)
1794
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Invalid params"));
1795
return PVRSRV_ERROR_INVALID_PARAMS;
1798
SysAcquireData(&psSysData);
1801
psDeviceNode = (PVRSRV_DEVICE_NODE*)
1802
List_PVRSRV_DEVICE_NODE_Any_va(psSysData->psDeviceNodeList,
1803
&MatchDeviceKM_AnyVaCb,
1806
PVRSRV_DEVICE_CLASS_BUFFER);
1809
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: No devnode matching index %d", ui32DeviceID));
1810
return PVRSRV_ERROR_NO_DEVICENODE_FOUND;
1812
psBCInfo = (PVRSRV_BUFFERCLASS_INFO*)psDeviceNode->pvDevice;
1817
if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1818
sizeof(*psBCPerContextInfo),
1819
(IMG_VOID **)&psBCPerContextInfo, IMG_NULL,
1820
"Buffer Class per Context Info") != PVRSRV_OK)
1822
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed psBCPerContextInfo alloc"));
1823
return PVRSRV_ERROR_OUT_OF_MEMORY;
1825
OSMemSet(psBCPerContextInfo, 0, sizeof(*psBCPerContextInfo));
1827
if(psBCInfo->ui32RefCount++ == 0)
1829
BUFFER_INFO sBufferInfo;
1831
psDeviceNode = (PVRSRV_DEVICE_NODE *)hDevCookie;
1834
psBCInfo->hDevMemContext = (IMG_HANDLE)psDeviceNode->sDevMemoryInfo.pBMKernelContext;
1837
eError = psBCInfo->psFuncTable->pfnOpenBCDevice(ui32DeviceID, &psBCInfo->hExtDevice);
1838
if(eError != PVRSRV_OK)
1840
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed to open external BC device"));
1845
eError = psBCInfo->psFuncTable->pfnGetBCInfo(psBCInfo->hExtDevice, &sBufferInfo);
1846
if(eError != PVRSRV_OK)
1848
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM : Failed to get BC Info"));
1853
psBCInfo->ui32BufferCount = sBufferInfo.ui32BufferCount;
1857
eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
1858
sizeof(PVRSRV_BC_BUFFER) * sBufferInfo.ui32BufferCount,
1859
(IMG_VOID **)&psBCInfo->psBuffer,
1861
"Array of Buffer Class Buffer");
1862
if(eError != PVRSRV_OK)
1864
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed to allocate BC buffers"));
1867
OSMemSet (psBCInfo->psBuffer,
1869
sizeof(PVRSRV_BC_BUFFER) * sBufferInfo.ui32BufferCount);
1871
for(i=0; i<psBCInfo->ui32BufferCount; i++)
1874
eError = PVRSRVAllocSyncInfoKM(IMG_NULL,
1875
psBCInfo->hDevMemContext,
1876
&psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
1877
if(eError != PVRSRV_OK)
1879
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed sync info alloc"));
1883
psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount++;
1888
eError = psBCInfo->psFuncTable->pfnGetBCBuffer(psBCInfo->hExtDevice,
1890
psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->psSyncData,
1891
&psBCInfo->psBuffer[i].sDeviceClassBuffer.hExtBuffer);
1892
if(eError != PVRSRV_OK)
1894
PVR_DPF((PVR_DBG_ERROR,"PVRSRVOpenBCDeviceKM: Failed to get BC buffers"));
1899
psBCInfo->psBuffer[i].sDeviceClassBuffer.pfnGetBufferAddr = psBCInfo->psFuncTable->pfnGetBufferAddr;
1900
psBCInfo->psBuffer[i].sDeviceClassBuffer.hDevMemContext = psBCInfo->hDevMemContext;
1901
psBCInfo->psBuffer[i].sDeviceClassBuffer.hExtDevice = psBCInfo->hExtDevice;
1902
psBCInfo->psBuffer[i].sDeviceClassBuffer.ui32MemMapRefCount = 0;
1906
psBCPerContextInfo->psBCInfo = psBCInfo;
1907
psBCPerContextInfo->hResItem = ResManRegisterRes(psPerProc->hResManContext,
1908
RESMAN_TYPE_BUFFERCLASS_DEVICE,
1911
&CloseBCDeviceCallBack);
1914
*phDeviceKM = (IMG_HANDLE)psBCPerContextInfo;
1921
for(i=0; i<psBCInfo->ui32BufferCount; i++)
1923
if(psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo)
1925
if (--psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo->ui32RefCount == 0)
1927
PVRSRVFreeSyncInfoKM(psBCInfo->psBuffer[i].sDeviceClassBuffer.psKernelSyncInfo);
1933
if(psBCInfo->psBuffer)
1935
OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, sizeof(PVRSRV_BC_BUFFER), psBCInfo->psBuffer, IMG_NULL);
1936
psBCInfo->psBuffer = IMG_NULL;
1946
PVRSRV_ERROR PVRSRVGetBCInfoKM (IMG_HANDLE hDeviceKM,
1947
BUFFER_INFO *psBufferInfo)
1949
PVRSRV_BUFFERCLASS_INFO *psBCInfo;
1950
PVRSRV_ERROR eError;
1952
if(!hDeviceKM || !psBufferInfo)
1954
PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetBCInfoKM: Invalid parameters"));
1955
return PVRSRV_ERROR_INVALID_PARAMS;
1958
psBCInfo = BCDeviceHandleToBCInfo(hDeviceKM);
1960
eError = psBCInfo->psFuncTable->pfnGetBCInfo(psBCInfo->hExtDevice, psBufferInfo);
1962
if(eError != PVRSRV_OK)
1964
PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetBCInfoKM : Failed to get BC Info"));
1973
PVRSRV_ERROR PVRSRVGetBCBufferKM (IMG_HANDLE hDeviceKM,
1974
IMG_UINT32 ui32BufferIndex,
1975
IMG_HANDLE *phBuffer)
1977
PVRSRV_BUFFERCLASS_INFO *psBCInfo;
1979
if(!hDeviceKM || !phBuffer)
1981
PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetBCBufferKM: Invalid parameters"));
1982
return PVRSRV_ERROR_INVALID_PARAMS;
1985
psBCInfo = BCDeviceHandleToBCInfo(hDeviceKM);
1987
if(ui32BufferIndex < psBCInfo->ui32BufferCount)
1989
*phBuffer = (IMG_HANDLE)&psBCInfo->psBuffer[ui32BufferIndex];
1993
PVR_DPF((PVR_DBG_ERROR,"PVRSRVGetBCBufferKM: Buffer index %d out of range (%d)", ui32BufferIndex,psBCInfo->ui32BufferCount));
1994
return PVRSRV_ERROR_INVALID_PARAMS;
2002
IMG_BOOL PVRGetBufferClassJTable(PVRSRV_BC_BUFFER2SRV_KMJTABLE *psJTable)
2004
psJTable->ui32TableSize = sizeof(PVRSRV_BC_BUFFER2SRV_KMJTABLE);
2006
psJTable->pfnPVRSRVRegisterBCDevice = &PVRSRVRegisterBCDeviceKM;
2007
psJTable->pfnPVRSRVScheduleDevices = &PVRSRVScheduleDevicesKM;
2008
psJTable->pfnPVRSRVRemoveBCDevice = &PVRSRVRemoveBCDeviceKM;