/[pcsx2_0.9.7]/trunk/pcsx2/Vif1_Dma.cpp
ViewVC logotype

Diff of /trunk/pcsx2/Vif1_Dma.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 62 by william, Tue Sep 7 11:08:22 2010 UTC revision 87 by william, Wed Sep 8 12:10:38 2010 UTC
# Line 58  __fi void vif1FLUSH() Line 58  __fi void vif1FLUSH()
58  void vif1TransferToMemory()  void vif1TransferToMemory()
59  {  {
60          u32 size;          u32 size;
61          u64* pMem = (u64*)dmaGetAddr(vif1ch.madr, false);          u128* pMem = (u128*)dmaGetAddr(vif1ch.madr, false);
62    
63          // VIF from gsMemory          // VIF from gsMemory
64          if (pMem == NULL)                                               //Is vif0ptag empty?          if (pMem == NULL)                                               //Is vif0ptag empty?
# Line 78  void vif1TransferToMemory() Line 78  void vif1TransferToMemory()
78          // completely and execute the transfer there-after.          // completely and execute the transfer there-after.
79          //Console.Warning("Real QWC %x", vif1ch.qwc);          //Console.Warning("Real QWC %x", vif1ch.qwc);
80          size = min((u32)vif1ch.qwc, vif1.GSLastDownloadSize);          size = min((u32)vif1ch.qwc, vif1.GSLastDownloadSize);
81            const u128* pMemEnd = pMem + vif1.GSLastDownloadSize;
82    
83          if (GSreadFIFO2 == NULL)          if (GSreadFIFO2 == NULL)
84          {          {
85                  for (;size > 0; --size)                  for (;size > 0; --size)
86                  {                  {
87                          GetMTGS().WaitGS();                          GetMTGS().WaitGS();
88                          GSreadFIFO(&psHu64(VIF1_FIFO));                          GSreadFIFO((u64*)pMem);
89                            ++pMem;
                         pMem[0] = psHu64(VIF1_FIFO);  
                         pMem[1] = psHu64(VIF1_FIFO + 8);  
                         pMem += 2;  
                 }  
                 if(vif1ch.qwc > vif1.GSLastDownloadSize)  
                 {  
                         DevCon.Warning("GS Transfer < VIF QWC, Clearing end of space");  
                         for (size = vif1ch.qwc - vif1.GSLastDownloadSize; size > 0; --size)  
                         {  
                                 psHu64(VIF1_FIFO) = 0;  
                                 psHu64(VIF1_FIFO + 8) = 0;  
                                 pMem[0] = psHu64(VIF1_FIFO);  
                                 pMem[1] = psHu64(VIF1_FIFO + 8);  
                                 pMem += 2;  
                         }  
90                  }                  }
91          }          }
92          else          else
93          {          {
94                  GetMTGS().WaitGS();                  GetMTGS().WaitGS();
95                  GSreadFIFO2(pMem, size);                  GSreadFIFO2((u64*)pMem, size);
96                    pMem += size;
                 // set incase read  
                 psHu64(VIF1_FIFO) = pMem[2*size-2];  
                 psHu64(VIF1_FIFO + 8) = pMem[2*size-1];  
                 pMem += size * 2;  
                 if(vif1ch.qwc > vif1.GSLastDownloadSize)  
                 {  
                         DevCon.Warning("GS Transfer < VIF QWC, Clearing end of space");  
                         for (size = vif1ch.qwc - vif1.GSLastDownloadSize; size > 0; --size)  
                         {  
                                 psHu64(VIF1_FIFO) = 0;  
                                 psHu64(VIF1_FIFO + 8) = 0;  
                                 pMem[0] = psHu64(VIF1_FIFO);  
                                 pMem[1] = psHu64(VIF1_FIFO + 8);  
                                 pMem += 2;  
                         }  
                 }  
97          }          }
98    
99            if(pMem < pMemEnd)
100            {
101                    DevCon.Warning("GS Transfer < VIF QWC, Clearing end of space");
102                    
103                    __m128 zeroreg = _mm_setzero_ps();
104                    do {
105                            _mm_store_ps((float*)pMem, zeroreg);
106                            ++pMem;
107                    } while (pMem < pMemEnd);
108            }
109    
110          g_vifCycles += vif1ch.qwc * 2;          g_vifCycles += vif1ch.qwc * 2;
111          vif1ch.madr += vif1ch.qwc * 16; // mgs3 scene changes          vif1ch.madr += vif1ch.qwc * 16; // mgs3 scene changes

Legend:
Removed from v.62  
changed lines
  Added in v.87

  ViewVC Help
Powered by ViewVC 1.1.22