xerpi

SceDmacplus CSC

Mar 29th, 2021 (edited)
357
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.77 KB | None | 0 0
  1. typedef struct SceDmacPlusCscParams {
  2.     uint16_t ctm[3][3]; /* 10-bit fixed point? */
  3.     uint8_t unk1;
  4.     uint8_t padding;
  5.     uint16_t unk2;
  6. } SceDmacPlusCscParams;
  7.  
  8. typedef struct SceMpegYCrCbBuffer {
  9.     SceInt32    iFrameBufferHeight16;
  10.     SceInt32    iFrameBufferWidth16;
  11.     SceInt32    iUnknown;           // Set to 0
  12.     SceInt32    iUnknown2;          // Set to 1
  13.     ScePVoid    pYBuffer;           // pointer to YBuffer (in VME EDRAM?)
  14.     ScePVoid    pYBuffer2;          // pointer to YBuffer + framebufferwidth*(frameheight/32)
  15.     ScePVoid    pCrBuffer;          // pointer to CrBuffer (in VME EDRAM?)
  16.     ScePVoid    pCbBuffer;          // pointer to CbBuffer (in VME EDRAM?)
  17.     ScePVoid    pCrBuffer2;         // pointer to CrBuffer + (framebufferwidth/2)*(frameheight/64)
  18.     ScePVoid    pCbBuffer2;         // pointer to CbBuffer + (framebufferwidth/2)*(frameheight/64)
  19.     SceInt32    iFrameHeight;
  20.     SceInt32    iFrameWidth;
  21.     SceInt32    iFrameBufferWidth;
  22.     SceInt32    iUnknown3[11];
  23. } __attribute__((aligned(64))) SceMpegYCrCbBuffer;
  24.  
  25. uint sceDmacplus_driver_0xB269EAC9_csc_params(int colorfmt, int stride, SceDmacPlusCscParams *cscparams)
  26. {
  27.   uint ret;
  28.  
  29.   ret = sceKernelCpuSuspendIntr();
  30.   if ((g_dmac_status & 2) == 0) {
  31.     g_csc_matrix0 =
  32.          (cscparams->ctm[2] & 0x3ff) << 0x14 | (cscparams->ctm[1] & 0x3ff) << 10 |
  33.          cscparams->ctm[0] & 0x3ff;
  34.     g_csc_matrix1 =
  35.          (cscparams->ctm[1][2] & 0x3ff) << 0x14 | (cscparams->ctm[1][1] & 0x3ff) << 10 |
  36.          cscparams->ctm[1][0] & 0x3ff;
  37.     g_csc_matrix2 =
  38.          (cscparams->ctm[2][2] & 0x3ff) << 0x14 | (cscparams->ctm[2][1] & 0x3ff) << 10 |
  39.          cscparams->ctm[2][0] & 0x3ff;
  40.     g_csc_params = (cscparams->unk2 & 1) << 8 | (uint)cscparams->unk1;
  41.     write_volatile_4(DAT_bc800150,g_csc_matrix0);
  42.     write_volatile_4(DAT_bc800154,g_csc_matrix1);
  43.     write_volatile_4(DAT_bc800158,g_csc_matrix2);
  44.     write_volatile_4(DAT_bc80015c,g_csc_params);
  45.     g_csc_stride = stride;
  46.     g_csc_colorfmt = colorfmt;
  47.     sceKernelCpuResumeIntr(ret);
  48.     ret = 0;
  49.   }
  50.   else {
  51.     sceKernelCpuResumeIntr(ret);
  52.     ret = 0x80000021;
  53.   }
  54.   return ret;
  55. }
  56.  
  57. int sceDmacplus_driver_0x9C492B9B_csc_vme(void *pRGBbuffer, void *pRGBbuffer2, SceMpegYCrCbBuffer *pYCrCbBuffer)
  58. {
  59.   uint ret;
  60.   uint flags;
  61.   uint param;
  62.   ushort unk;
  63.  
  64.   ret = 0x80000103;
  65.   if (pRGBbuffer != NULL) {
  66.     flags = sceKernelCpuSuspendIntr();
  67.     unk = 0x1a;
  68.     if ((pYCrCbBuffer->iFrameBufferWidth16 & 7U | g_csc_colorfmt) == 0) {
  69.       unk = 10;
  70.     }
  71.     if ((g_dmac_status & unk) == 0) {
  72.       write_volatile_4(DAT_bc800120,pYCrCbBuffer->pYBuffer);
  73.       write_volatile_4(DAT_bc800128,pYCrCbBuffer->pYBuffer2);
  74.       write_volatile_4(DAT_bc800130,pYCrCbBuffer->pCrBuffer);
  75.       write_volatile_4(DAT_bc800134,pYCrCbBuffer->pCbBuffer);
  76.       write_volatile_4(DAT_bc800138,pYCrCbBuffer->pCrBuffer2);
  77.       write_volatile_4(DAT_bc80013c,pYCrCbBuffer->pCbBuffer2);
  78.       write_volatile_4(DAT_bc800144,pRGBbuffer);
  79.       write_volatile_4(DAT_bc800148,pRGBbuffer2);
  80.       if (pRGBbuffer2 == NULL) {
  81.         param = g_csc_stride << 8 | g_csc_colorfmt << 1;
  82.       }
  83.       else {
  84.         param = g_csc_stride << 8 | g_csc_colorfmt << 1 | 1;
  85.       }
  86.       write_volatile_4(DAT_bc80014c,param);
  87.       write_volatile_4(DAT_bc800140,
  88.                        (pYCrCbBuffer->iFrameBufferHeight16 & 0x3fU) << 0x10 |
  89.                        (pYCrCbBuffer->iFrameBufferWidth16 & 0x3fU) << 8 |
  90.                        (pYCrCbBuffer->iUnknown & 1U) << 2 | (pYCrCbBuffer->iUnknown2 & 1U) << 1 |1)
  91.       ;
  92.       write_volatile_4(DAT_bc800160,0xd);
  93.       g_dmac_status = g_dmac_status | 0x8002;
  94.       sceKernelClearEventFlag(g_SceDmacplusAvc_evflag,0xfffffffc);
  95.       sceKernelCpuResumeIntrWithSync(flags);
  96.       ret = 0;
  97.     }
  98.     else {
  99.       sceKernelCpuResumeIntr(flags);
  100.       ret = 0x80000021;
  101.     }
  102.   }
  103.   return ret;
  104. }
  105.  
  106. int sceDmacplus_driver_0xD126494B_csc_avc(void *pRGBbuffer, void *pRGBbuffer2, SceMpegYCrCbBuffer *pYCrCbBuffer)
  107. {
  108.   uint ret;
  109.   uint flags;
  110.   uint param;
  111.   ushort tmp;
  112.  
  113.   ret = 0x80000103;
  114.   if (pRGBbuffer != NULL) {
  115.     flags = sceKernelCpuSuspendIntr();
  116.     tmp = 0x1a;
  117.     if (g_csc_colorfmt == 0) {
  118.       tmp = 10;
  119.     }
  120.     if ((g_dmac_status & tmp) == 0) {
  121.       tmp = g_dmac_status | 0x8002;
  122.       g_dmac_status = g_dmac_status | 2;
  123.       if (g_csc_colorfmt != 0) {
  124.         g_dmac_status = tmp;
  125.       }
  126.       write_volatile_4(DAT_bc800120,pYCrCbBuffer->pYBuffer);
  127.       write_volatile_4(DAT_bc800124,pYCrCbBuffer->pYBuffer2);
  128.       write_volatile_4(DAT_bc800128,pYCrCbBuffer->pCrBuffer);
  129.       write_volatile_4(DAT_bc80012c,pYCrCbBuffer->pCbBuffer);
  130.       write_volatile_4(DAT_bc800130,pYCrCbBuffer->pCrBuffer2);
  131.       write_volatile_4(DAT_bc800134,pYCrCbBuffer->pCbBuffer2);
  132.       write_volatile_4(DAT_bc800138,pYCrCbBuffer->iFrameHeight);
  133.       write_volatile_4(DAT_bc80013c,pYCrCbBuffer->iFrameWidth);
  134.       write_volatile_4(DAT_bc800144,pRGBbuffer);
  135.       write_volatile_4(DAT_bc800148,pRGBbuffer2);
  136.       if (pRGBbuffer2 == NULL) {
  137.         param = g_csc_stride << 8 | g_csc_colorfmt << 1;
  138.       }
  139.       else {
  140.         param = g_csc_stride << 8 | g_csc_colorfmt << 1 | 1;
  141.       }
  142.       write_volatile_4(DAT_bc80014c,param);
  143.       write_volatile_4(DAT_bc800140,
  144.                        (pYCrCbBuffer->iFrameBufferHeight16 & 0x3fU) << 0x10 |
  145.                        (pYCrCbBuffer->iFrameBufferWidth16 & 0x3fU) << 8 |
  146.                        (pYCrCbBuffer->iUnknown & 1U) << 2 | (pYCrCbBuffer->iUnknown2 & 1U) << 1);
  147.       write_volatile_4(DAT_bc800160,0xd);
  148.       sceKernelClearEventFlag(g_SceDmacplusAvc_evflag,0xfffffffc);
  149.       sceKernelCpuResumeIntrWithSync(flags);
  150.       ret = 0;
  151.     }
  152.     else {
  153.       sceKernelCpuResumeIntr(flags);
  154.       ret = 0x80000021;
  155.     }
  156.   }
  157.   return ret;
  158. }
  159.  
  160. /*
  161.  * sceMpegBaseCscVme calls sceDmacplus_driver_0xB269EAC9_csc_params and then sceDmacplus_driver_0x9C492B9B_csc_vme.
  162. */
  163.  
Add Comment
Please, Sign In to add comment