NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)