void CubeRenderer::beginShadow() { ZENIC_ASSERT(m_shadowModel); if (!m_shadowModel) return; //m_renderer.beginRenderModels(); // Override the default gifchain with alpha enabled. m_dmaChain.addSrcCntTag(VIF_STCYCL(1, 1), VIF_UNPACK(zenic::ps2::vif::V4_32, 1, 20)); m_dmaChain.add64(GIFTAG(0, 0, 1, GS_PRIM(gs::Tristrip, gs::Gouraud, gs::Texturing, 0, gs::Blend, 0, gs::Stq, gs::Context1, 0), gif::Packed, 3)); m_dmaChain.add64(0x512); m_dmaChain.endPacket(); // Set alpha m_dmaChain.addSrcCntTag(0, VIF_DIRECT(2)); m_dmaChain.add128(GIFTAG(1, gif::Eop, 0, 0, gif::Packed, 1),gif::A_D); m_dmaChain.add128(GS_ALPHA(1, 0, 2, 2, 0x80),GS_REG(ALPHA_1)); m_dmaChain.endPacket(); }
//--------------------------------------------------------------------------- int g2_init(g2_video_mode mode) { vmode_t *v; v = &(vmodes[mode]); cur_mode = v; g2_max_x = v->width - 1; g2_max_y = v->height - 1; g2_view_x0 = 0; g2_view_y0 = 0; g2_view_x1 = g2_max_x; g2_view_y1 = g2_max_y; gs_origin_x = 1024; gs_origin_y = 1024; gs_mem_current = 0; // nothing allocated yet g2_visible_frame = 0; // display frame 0 g2_active_frame = 0; // draw to frame 0 // - Initialize the DMA. // - Writes a 0 to most of the DMA registers. dma_reset(); // - Sets the RESET bit if the GS CSR register. GS_RESET(); #ifndef FLASH // - Can someone please tell me what the sync.p // instruction does. Synchronizes something :-) __asm__(" sync.p nop "); #endif // - Sets up the GS IMR register (i guess). // - The IMR register is used to mask and unmask certain interrupts, // for example VSync and HSync. We'll use this properly in Tutorial 2. // - Does anyone have code to do this without using the 0x71 syscall? // - I havn't gotten around to looking at any PS2 bios code yet. gs_set_imr(); // - Use syscall 0x02 to setup some video mode stuff. // - Pretty self explanatory I think. // - Does anyone have code to do this without using the syscall? It looks // like it should only set the SMODE2 register, but if I remove this syscall // and set the SMODE2 register myself, it donesn't work. What else does // syscall 0x02 do? gs_set_crtc(NON_INTERLACED, v->ntsc_pal, FRAME); // - I havn't attempted to understand what the Alpha parameters can do. They // have been blindly copied from the 3stars demo (although they don't seem // do have any impact in this simple 2D code. GS_SET_PMODE( 0, // ReadCircuit1 OFF 1, // ReadCircuit2 ON 1, // Use ALP register for Alpha Blending 1, // Alpha Value of ReadCircuit2 for output selection 0, // Blend Alpha with the output of ReadCircuit2 0xFF // Alpha Value = 1.0 ); /* // - Non needed if we use gs_set_crt() GS_SET_SMODE2( 0, // Non-Interlaced mode 1, // FRAME mode (read every line) 0 // VESA DPMS Mode = ON ??? please explain ??? ); */ GS_SET_DISPFB2( 0, // Frame Buffer base pointer = 0 (Address/8192) v->width/64, // Buffer Width (Pixels/64) v->psm, // Pixel Storage Format 0, // Upper Left X in Buffer = 0 0 // Upper Left Y in Buffer = 0 ); // Why doesn't (0, 0) equal the very top-left of the TV? GS_SET_DISPLAY2( 656, // X position in the display area (in VCK units) 36, // Y position in the display area (in Raster units) v->magh-1, // Horizontal Magnification - 1 0, // Vertical Magnification = 1x v->width*v->magh-1, // Display area width - 1 (in VCK units) (Width*HMag-1) v->height-1 // Display area height - 1 (in pixels) (Height-1) ); GS_SET_BGCOLOR( 0, // RED 0, // GREEN 0 // BLUE ); BEGIN_GS_PACKET(gs_dma_buf); GIF_TAG_AD(gs_dma_buf, 6, 1, 0, 0, 0); // Use drawing parameters from PRIM register GIF_DATA_AD(gs_dma_buf, prmodecont, 1); // Setup frame buffers. Point to 0 initially. GIF_DATA_AD(gs_dma_buf, frame_1, GS_FRAME( 0, // FrameBuffer base pointer = 0 (Address/8192) v->width/64, // Frame buffer width (Pixels/64) v->psm, // Pixel Storage Format 0)); // Save address and advance GS memory pointer by buffer size (in bytes) // Do this for both frame buffers. g2_frame_addr[0] = gs_mem_current; gs_mem_current += v->width * v->height * (v->bpp/8); g2_frame_addr[1] = gs_mem_current; gs_mem_current += v->width * v->height * (v->bpp/8); // Displacement between Primitive and Window coordinate systems. GIF_DATA_AD(gs_dma_buf, xyoffset_1, GS_XYOFFSET( gs_origin_x<<4, gs_origin_y<<4)); // Clip to frame buffer. GIF_DATA_AD(gs_dma_buf, scissor_1, GS_SCISSOR( 0, g2_max_x, 0, g2_max_y)); // Create a single 256x128 font buffer g2_fontbuf_addr = gs_mem_current; gs_mem_current += g2_fontbuf_w * g2_fontbuf_h * (v->bpp/8); // Create a texture buffer as big as the screen. // Just save the address advance GS memory pointer by buffer size (in bytes) // The TEX registers are set later, when drawing. g2_texbuf_addr = gs_mem_current; gs_mem_current += v->width * v->height * (v->bpp/8); // Setup test_1 register to allow transparent texture regions where A=0 GIF_DATA_AD(gs_dma_buf, test_1, GS_TEST( 1, // Alpha Test ON ATST_NOTEQUAL, 0x00, // Reject pixels with A=0 AFAIL_KEEP, // Don't update frame or Z buffers 0, 0, 0, 0)); // No Destination Alpha or Z-Buffer Tests // Setup the ALPHA_1 register to correctly blend edges of // pre-antialiased fonts using Alpha Blending stage. // The blending formula is // PIXEL=(SRC-FRAME)*SRC_ALPHA>>7+FRAME GIF_DATA_AD(gs_dma_buf, alpha_1, GS_ALPHA( 0, // A - source 1, // B - frame buffer 0, // C - alpha from source 1, // D - frame buffer 0)); // FIX - not needed SEND_GS_PACKET(gs_dma_buf); return(1); }