Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <eekernel.h>
- #include <stdio.h>
- #include <libdev.h>
- #include <eeregs.h>
- #include <libgraph.h>
- #include <libdma.h>
- #include <math.h>
- struct DrawSetup {
- sceGifTag giftag;
- sceGsDrawEnv1 de;
- } __attribute__((aligned(16)));
- void print_draw_env(sceGsDrawEnv1& env) {
- printf("DRAW ENV\n");
- printf(" frame\n");
- printf(" FBP: 0x%lx\n", env.frame1.FBP);
- printf(" FBW: 0x%lx\n", env.frame1.FBW);
- printf(" PSM: 0x%lx\n", env.frame1.PSM);
- printf(" FBMSK: 0x%lx\n", env.frame1.FBMSK);
- printf(" zbuf\n");
- printf(" ZBP: 0x%lx\n", env.zbuf1.ZBP);
- printf(" PSM: 0x%lx\n", env.zbuf1.PSM);
- printf(" ZMSK: 0x%lx\n", env.zbuf1.ZMSK);
- printf(" xyoffset\n");
- printf(" OFX: 0x%lx\n", env.xyoffset1.OFX);
- printf(" OFY: 0x%lx\n", env.xyoffset1.OFY);
- printf(" scissor\n");
- printf(" SCAX0: 0x%lx\n", env.scissor1.SCAX0);
- printf(" SCAX1: 0x%lx\n", env.scissor1.SCAX1);
- printf(" SCAY0: 0x%lx\n", env.scissor1.SCAY0);
- printf(" SCAY1: 0x%lx\n", env.scissor1.SCAY1);
- printf(" prmodecont\n");
- printf(" AC: 0x%lx\n", env.prmodecont.AC);
- printf(" colclamp\n");
- printf(" CLAMP: 0x%lx\n", env.colclamp.CLAMP);
- printf(" dthe\n");
- printf(" DTHE: 0x%lx\n", env.dthe.DTHE);
- printf(" test\n");
- printf(" ATE: 0x%lx\n", env.test1.ATE);
- printf(" ATST: 0x%lx\n", env.test1.ATST);
- printf(" AREF: 0x%lx\n", env.test1.AREF);
- printf(" AFAIL: 0x%lx\n", env.test1.AFAIL);
- printf(" DATE: 0x%lx\n", env.test1.DATE);
- printf(" DATM: 0x%lx\n", env.test1.DATM);
- printf(" ZTE: 0x%lx\n", env.test1.ZTE);
- printf(" ZTST: 0x%lx\n", env.test1.ZTST);
- }
- struct SpriteDrawData {
- sceGifTag giftag;
- sceGifPackRgbaq rgba0;
- sceGifPackXyz xyz0;
- sceGifPackXyz xyz1;
- } __attribute__((aligned(16)));
- SpriteDrawData sprite;
- sceDmaChan* gifChan;
- sceGsDispEnv disp_e;
- DrawSetup draw_setup;
- void init_gs() {
- printf("GS Init!\n");
- sceGsResetPath();
- sceDmaReset(1);
- gifChan = sceDmaGetChan(SCE_DMA_GIF);
- // Sony GS Setup Stuff
- sceGsResetGraph(0, SCE_GS_INTERLACE, SCE_GS_NTSC, SCE_GS_FRAME);
- // this will set up two draw and disp envs.
- //sceGsSetDefDBuff(&db, SCE_GS_PSMCT32, 640, 224, SCE_GS_ZGREATER, SCE_GS_PSMZ24, 1);
- sceGsSetDefDrawEnv(&draw_setup.de, SCE_GS_PSMCT32, 640, 240, 2, SCE_GS_PSMZ32);
- draw_setup.de.xyoffset1.OFX = 0;
- draw_setup.de.xyoffset1.OFY = 0;
- sceGsSetDefDispEnv(&disp_e, SCE_GS_PSMCT32, 640, 240, 0, 0);
- print_draw_env(draw_setup.de);
- sceGsPutDispEnv(&disp_e);
- SCE_GIF_CLEAR_TAG(&draw_setup.giftag);
- draw_setup.giftag.NLOOP = 8;
- draw_setup.giftag.EOP = 1;
- draw_setup.giftag.PRE = 0;
- draw_setup.giftag.FLG = 0;
- draw_setup.giftag.NREG = 1;
- draw_setup.giftag.REGS0 = 0xe; // A+D
- FlushCache(0);
- sceGsPutDrawEnv(&draw_setup.giftag);
- sceGsSyncPath(0,0);
- }
- void build_column(SpriteDrawData& asprite, int r, int g, int b, int z, int i) {
- SCE_GIF_CLEAR_TAG(&asprite.giftag);
- asprite.giftag.NLOOP = 1;
- asprite.giftag.EOP = 1;
- asprite.giftag.PRE = 1;
- asprite.giftag.PRIM = 6;
- asprite.giftag.FLG = 0; // packed
- asprite.giftag.NREG = 3;
- asprite.giftag.REGS0 = 1; // rgbaq
- asprite.giftag.REGS1 = 5; // xyz2
- asprite.giftag.REGS2 = 5; // xyz2
- asprite.rgba0.R = r;
- asprite.rgba0.G = g;
- asprite.rgba0.B = b;
- asprite.rgba0.A = (z == 0) ? 0 : 0x80;
- asprite.xyz0.X = 16 * 32 * i;
- asprite.xyz0.Y = 0;
- asprite.xyz0.Z = z;
- asprite.xyz0.ADC = 1;
- asprite.xyz1.X = 16 * 32 * (i + 1);
- asprite.xyz1.Y = 0x1e8 << 4 ;
- asprite.xyz1.Z = z;
- asprite.xyz1.ADC = 0;
- }
- void step_1() {
- printf("STEP 1: draw screen in 32 wide columns with Z = 0xffffffff\n");
- for(int i = 0; i < 20; i++) {
- build_column(sprite, i*2, i*4, i*8, 0xffffffff, i);
- FlushCache(0);
- sceDmaSendN(gifChan, &sprite, sizeof(SpriteDrawData) / 16);
- sceGsSyncPath(0,0);
- }
- }
- void print_zbp_fb_zte(sceGsDrawEnv1& de) {
- printf("ZBP: 0x%lx\n", de.zbuf1.ZBP);
- printf("FBP: 0x%lx\n", de.frame1.FBP);
- printf("ZTE: 0x%lx\n", de.test1.ZTE);
- printf("ZTST: 0x%lx\n", de.test1.ZTST);
- printf("PSM: 0x%lx\n", de.frame1.PSM);
- }
- void step_2() {
- printf("STEP 2: change settings\n");
- printf("Original settings:\n");
- print_zbp_fb_zte(draw_setup.de);
- printf("\n");
- draw_setup.de.frame1.FBP = draw_setup.de.zbuf1.ZBP;
- draw_setup.de.test1.ZTE = 1;
- draw_setup.de.test1.ZTST = 1;
- draw_setup.de.frame1.PSM = 48;
- FlushCache(0);
- sceGsPutDrawEnv(&draw_setup.giftag);
- sceGsSyncPath(0,0);
- sceGsSyncV(0);
- printf("New settings:\n");
- print_zbp_fb_zte(draw_setup.de);
- printf("\n");
- print_draw_env(draw_setup.de);
- }
- void step_3() {
- printf("STEP 3: repeat of step 1 draw, with all zeros\n");
- for(int i = 0; i < 20; i+=2) {
- build_column(sprite, 0, 0, 0, 0, i);
- FlushCache(0);
- sceDmaSendN(gifChan, &sprite, sizeof(SpriteDrawData) / 16);
- sceGsSyncPath(0,0);
- }
- }
- void step_4() {
- printf("display the Z buffer.\n");
- disp_e.dispfb.FBP = draw_setup.de.zbuf1.ZBP;
- sceGsPutDispEnv(&disp_e);
- }
- void draw_run() {
- step_1();
- step_2();
- step_3();
- step_4();
- }
- int frame = 0;
- int odd_even = 0;
- void frame_end() {
- sceGsSyncPath(0,0);
- //sceGsSetHalfOffset((frame&1) ? &db.draw1 : &db.draw0, 2048, 2048, odd_even);
- frame++;
- odd_even = !sceGsSyncV(0);
- if(!(frame % 128)) {
- printf("frame %d\n", frame);
- }
- }
- int main() {
- init_gs();
- printf("GS init done\n");
- printf("starting loop!\n");
- FlushCache(0);
- //sceGsSwapDBuff(&db, frame);
- draw_run();
- frame_end();
- for(;;) { }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement