Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.55 KB | None | 0 0
  1. #include <eekernel.h>
  2. #include <stdio.h>
  3. #include <libdev.h>
  4. #include <eeregs.h>
  5. #include <libgraph.h>
  6. #include <libdma.h>
  7. #include <math.h>
  8.  
  9.  
  10.  
  11.  
  12. struct DrawSetup {
  13. sceGifTag giftag;
  14. sceGsDrawEnv1 de;
  15. } __attribute__((aligned(16)));
  16.  
  17.  
  18. void print_draw_env(sceGsDrawEnv1& env) {
  19. printf("DRAW ENV\n");
  20. printf(" frame\n");
  21. printf(" FBP: 0x%lx\n", env.frame1.FBP);
  22. printf(" FBW: 0x%lx\n", env.frame1.FBW);
  23. printf(" PSM: 0x%lx\n", env.frame1.PSM);
  24. printf(" FBMSK: 0x%lx\n", env.frame1.FBMSK);
  25. printf(" zbuf\n");
  26. printf(" ZBP: 0x%lx\n", env.zbuf1.ZBP);
  27. printf(" PSM: 0x%lx\n", env.zbuf1.PSM);
  28. printf(" ZMSK: 0x%lx\n", env.zbuf1.ZMSK);
  29. printf(" xyoffset\n");
  30. printf(" OFX: 0x%lx\n", env.xyoffset1.OFX);
  31. printf(" OFY: 0x%lx\n", env.xyoffset1.OFY);
  32. printf(" scissor\n");
  33. printf(" SCAX0: 0x%lx\n", env.scissor1.SCAX0);
  34. printf(" SCAX1: 0x%lx\n", env.scissor1.SCAX1);
  35. printf(" SCAY0: 0x%lx\n", env.scissor1.SCAY0);
  36. printf(" SCAY1: 0x%lx\n", env.scissor1.SCAY1);
  37. printf(" prmodecont\n");
  38. printf(" AC: 0x%lx\n", env.prmodecont.AC);
  39. printf(" colclamp\n");
  40. printf(" CLAMP: 0x%lx\n", env.colclamp.CLAMP);
  41. printf(" dthe\n");
  42. printf(" DTHE: 0x%lx\n", env.dthe.DTHE);
  43. printf(" test\n");
  44. printf(" ATE: 0x%lx\n", env.test1.ATE);
  45. printf(" ATST: 0x%lx\n", env.test1.ATST);
  46. printf(" AREF: 0x%lx\n", env.test1.AREF);
  47. printf(" AFAIL: 0x%lx\n", env.test1.AFAIL);
  48. printf(" DATE: 0x%lx\n", env.test1.DATE);
  49. printf(" DATM: 0x%lx\n", env.test1.DATM);
  50. printf(" ZTE: 0x%lx\n", env.test1.ZTE);
  51. printf(" ZTST: 0x%lx\n", env.test1.ZTST);
  52. }
  53.  
  54. struct SpriteDrawData {
  55. sceGifTag giftag;
  56. sceGifPackRgbaq rgba0;
  57. sceGifPackXyz xyz0;
  58. sceGifPackXyz xyz1;
  59. } __attribute__((aligned(16)));
  60.  
  61. SpriteDrawData sprite;
  62. sceDmaChan* gifChan;
  63. sceGsDispEnv disp_e;
  64. DrawSetup draw_setup;
  65.  
  66. void init_gs() {
  67. printf("GS Init!\n");
  68. sceGsResetPath();
  69. sceDmaReset(1);
  70. gifChan = sceDmaGetChan(SCE_DMA_GIF);
  71.  
  72. // Sony GS Setup Stuff
  73. sceGsResetGraph(0, SCE_GS_INTERLACE, SCE_GS_NTSC, SCE_GS_FRAME);
  74. // this will set up two draw and disp envs.
  75. //sceGsSetDefDBuff(&db, SCE_GS_PSMCT32, 640, 224, SCE_GS_ZGREATER, SCE_GS_PSMZ24, 1);
  76. sceGsSetDefDrawEnv(&draw_setup.de, SCE_GS_PSMCT32, 640, 240, 2, SCE_GS_PSMZ32);
  77. draw_setup.de.xyoffset1.OFX = 0;
  78. draw_setup.de.xyoffset1.OFY = 0;
  79. sceGsSetDefDispEnv(&disp_e, SCE_GS_PSMCT32, 640, 240, 0, 0);
  80. print_draw_env(draw_setup.de);
  81. sceGsPutDispEnv(&disp_e);
  82. SCE_GIF_CLEAR_TAG(&draw_setup.giftag);
  83. draw_setup.giftag.NLOOP = 8;
  84. draw_setup.giftag.EOP = 1;
  85. draw_setup.giftag.PRE = 0;
  86. draw_setup.giftag.FLG = 0;
  87. draw_setup.giftag.NREG = 1;
  88. draw_setup.giftag.REGS0 = 0xe; // A+D
  89. FlushCache(0);
  90. sceGsPutDrawEnv(&draw_setup.giftag);
  91. sceGsSyncPath(0,0);
  92. }
  93.  
  94. void build_column(SpriteDrawData& asprite, int r, int g, int b, int z, int i) {
  95. SCE_GIF_CLEAR_TAG(&asprite.giftag);
  96. asprite.giftag.NLOOP = 1;
  97. asprite.giftag.EOP = 1;
  98. asprite.giftag.PRE = 1;
  99. asprite.giftag.PRIM = 6;
  100. asprite.giftag.FLG = 0; // packed
  101. asprite.giftag.NREG = 3;
  102. asprite.giftag.REGS0 = 1; // rgbaq
  103. asprite.giftag.REGS1 = 5; // xyz2
  104. asprite.giftag.REGS2 = 5; // xyz2
  105.  
  106. asprite.rgba0.R = r;
  107. asprite.rgba0.G = g;
  108. asprite.rgba0.B = b;
  109. asprite.rgba0.A = (z == 0) ? 0 : 0x80;
  110.  
  111.  
  112. asprite.xyz0.X = 16 * 32 * i;
  113. asprite.xyz0.Y = 0;
  114. asprite.xyz0.Z = z;
  115. asprite.xyz0.ADC = 1;
  116.  
  117. asprite.xyz1.X = 16 * 32 * (i + 1);
  118. asprite.xyz1.Y = 0x1e8 << 4 ;
  119. asprite.xyz1.Z = z;
  120. asprite.xyz1.ADC = 0;
  121. }
  122.  
  123. void step_1() {
  124. printf("STEP 1: draw screen in 32 wide columns with Z = 0xffffffff\n");
  125. for(int i = 0; i < 20; i++) {
  126. build_column(sprite, i*2, i*4, i*8, 0xffffffff, i);
  127. FlushCache(0);
  128. sceDmaSendN(gifChan, &sprite, sizeof(SpriteDrawData) / 16);
  129. sceGsSyncPath(0,0);
  130. }
  131. }
  132.  
  133. void print_zbp_fb_zte(sceGsDrawEnv1& de) {
  134. printf("ZBP: 0x%lx\n", de.zbuf1.ZBP);
  135. printf("FBP: 0x%lx\n", de.frame1.FBP);
  136. printf("ZTE: 0x%lx\n", de.test1.ZTE);
  137. printf("ZTST: 0x%lx\n", de.test1.ZTST);
  138. printf("PSM: 0x%lx\n", de.frame1.PSM);
  139. }
  140.  
  141. void step_2() {
  142. printf("STEP 2: change settings\n");
  143. printf("Original settings:\n");
  144. print_zbp_fb_zte(draw_setup.de);
  145. printf("\n");
  146.  
  147. draw_setup.de.frame1.FBP = draw_setup.de.zbuf1.ZBP;
  148. draw_setup.de.test1.ZTE = 1;
  149. draw_setup.de.test1.ZTST = 1;
  150. draw_setup.de.frame1.PSM = 48;
  151. FlushCache(0);
  152. sceGsPutDrawEnv(&draw_setup.giftag);
  153. sceGsSyncPath(0,0);
  154. sceGsSyncV(0);
  155. printf("New settings:\n");
  156. print_zbp_fb_zte(draw_setup.de);
  157. printf("\n");
  158. print_draw_env(draw_setup.de);
  159. }
  160.  
  161. void step_3() {
  162. printf("STEP 3: repeat of step 1 draw, with all zeros\n");
  163. for(int i = 0; i < 20; i+=2) {
  164. build_column(sprite, 0, 0, 0, 0, i);
  165. FlushCache(0);
  166. sceDmaSendN(gifChan, &sprite, sizeof(SpriteDrawData) / 16);
  167. sceGsSyncPath(0,0);
  168. }
  169. }
  170.  
  171. void step_4() {
  172. printf("display the Z buffer.\n");
  173. disp_e.dispfb.FBP = draw_setup.de.zbuf1.ZBP;
  174. sceGsPutDispEnv(&disp_e);
  175. }
  176.  
  177.  
  178.  
  179. void draw_run() {
  180. step_1();
  181. step_2();
  182. step_3();
  183. step_4();
  184. }
  185.  
  186. int frame = 0;
  187. int odd_even = 0;
  188. void frame_end() {
  189. sceGsSyncPath(0,0);
  190. //sceGsSetHalfOffset((frame&1) ? &db.draw1 : &db.draw0, 2048, 2048, odd_even);
  191. frame++;
  192. odd_even = !sceGsSyncV(0);
  193.  
  194. if(!(frame % 128)) {
  195. printf("frame %d\n", frame);
  196. }
  197. }
  198.  
  199.  
  200.  
  201. int main() {
  202. init_gs();
  203. printf("GS init done\n");
  204. printf("starting loop!\n");
  205. FlushCache(0);
  206. //sceGsSwapDBuff(&db, frame);
  207. draw_run();
  208. frame_end();
  209. for(;;) { }
  210. return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement