RenderTargetManager.py (2720B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\RenderTargetManager\RenderTargetManager.py 2 import blue 3 import trinity 4 import telemetry 5 import uthread 6 7 class RenderTargetManager(object): 8 __metaclass__ = telemetry.ZONE_PER_METHOD 9 __shared_state = {} 10 11 def __init__(self): 12 self.__dict__ = self.__shared_state 13 if not hasattr(self, 'keepAliveMS'): 14 self.targets = {} 15 self.lockedTargets = {} 16 self.targetsSleepCycles = {} 17 self.keepAliveMS = 3000 18 trinity.device.RegisterResource(self) 19 20 def OnCreate(self, dev): 21 pass 22 23 def OnInvalidate(self, level): 24 self.targets.clear() 25 self.targetsSleepCycles.clear() 26 27 def GetRenderTarget(self, renderTargetFormat, width, height, locked = False): 28 i = 0 29 hashKey = self.__Hash(renderTargetFormat, width, height, i) 30 while self.lockedTargets.get(hashKey): 31 i += 1 32 hashKey = self.__Hash(renderTargetFormat, width, height, i) 33 34 rt = self.targets.get(hashKey) 35 if rt and locked: 36 self.lockedTargets[hashKey] = rt 37 reapTasklet = None 38 while not rt: 39 try: 40 rt = trinity.Tr2RenderTarget(width, height, 1, renderTargetFormat) 41 self.targets[hashKey] = rt 42 if locked: 43 self.lockedTargets[hashKey] = rt 44 reapTasklet = uthread.new(self.Reaper_t, hashKey).context = 'RenderTargetMananger::Reaper' 45 except trinity.ALDeviceLostError: 46 rt = None 47 blue.synchro.SleepWallclock(100) 48 49 sleepCycles = self.targetsSleepCycles.get(hashKey, 0) 50 self.targetsSleepCycles[hashKey] = sleepCycles + 1 51 if reapTasklet: 52 uthread.schedule(reapTasklet) 53 return rt 54 55 def ReturnLockedRenderTarget(self, renderTarget): 56 foundKey = None 57 for key, value in self.lockedTargets.iteritems(): 58 if id(value) == id(renderTarget): 59 foundKey = key 60 break 61 62 if foundKey in self.lockedTargets: 63 del self.lockedTargets[foundKey] 64 65 def Reaper_t(self, hashKey): 66 if self.targetsSleepCycles.get(hashKey, 0) > 0: 67 self.targetsSleepCycles[hashKey] -= 1 68 blue.synchro.SleepWallclock(self.keepAliveMS) 69 if self.targets.get(hashKey): 70 del self.targets[hashKey] 71 if self.lockedTargets.get(hashKey): 72 del self.lockedTargets[hashKey] 73 74 def __Hash(self, textureFormat, width, height, level): 75 k = (textureFormat, 76 width, 77 height, 78 level) 79 return hash(k)