// These are GU commands that should always stay the same inline void MasterGuRenderer::guPreRender() { DEBUG_ENTER_FUNC(); #ifdef USE_DISPLAY_CALLBACK _renderSema.take(); // Take the semaphore to prevent writes // to the palette/screen before we're done _renderFinished = false; // set to synchronize with callback thread #endif #ifdef ENABLE_RENDER_MEASURE _lastRenderTime = g_system->getMillis(); #endif /* ENABLE_RENDER_MEASURE */ sceGuStart(0, _displayList); sceGuClearColor(0xFF000000); sceGuClear(GU_COLOR_BUFFER_BIT); sceGuAmbientColor(0xFFFFFFFF); sceGuColor(0xFFFFFFFF); sceGuTexOffset(0, 0); sceGuTexFilter(GU_LINEAR, GU_LINEAR); sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA); // Also good enough for all purposes sceGuAlphaFunc(GU_GREATER, 0, 0xFF); // Also good enough for all purposes }
void _gInit() { // Init & setup GU sceGuInit(); sceGuStart(GU_DIRECT,list); sceGuDrawBuffer(GU_PSM_8888,(void*)FRAMEBUFFER_SIZE,PSP_LINE_SIZE); sceGuDispBuffer(G_SCR_W,G_SCR_H,(void*)0,PSP_LINE_SIZE); sceGuDepthBuffer((void*)(FRAMEBUFFER_SIZE*2),PSP_LINE_SIZE); sceGuOffset(2048-(G_SCR_W/2),2048-(G_SCR_H/2)); sceGuViewport(2048,2048,G_SCR_W,G_SCR_H); gResetScissor(); sceGuDepthRange(65535,0); sceGuClearDepth(65535); sceGuAlphaFunc(GU_GREATER,0,0xff); sceGuDepthFunc(GU_LEQUAL); sceGuBlendFunc(GU_ADD,GU_SRC_ALPHA,GU_ONE_MINUS_SRC_ALPHA,0,0); sceGuTexFunc(GU_TFX_MODULATE,GU_TCC_RGBA); sceGuTexFilter(GU_LINEAR,GU_LINEAR); sceGuShadeModel(GU_FLAT); sceGuDisable(GU_CULL_FACE); sceGuDisable(GU_CLIP_PLANES); sceGuDisable(GU_DITHER); sceGuEnable(GU_ALPHA_TEST); sceGuEnable(GU_SCISSOR_TEST); sceGuFinish(); sceGuSync(0,0); sceDisplayWaitVblankStart(); sceGuDisplay(GU_TRUE); init = G_TRUE; }
void initGraphics() { dispBufferNumber = 0; sceGuInit(); guStart(); sceGuDrawBuffer(GU_PSM_8888, (void*)FRAMEBUFFER_SIZE, PSP_LINE_SIZE); sceGuDispBuffer(SCREEN_WIDTH, SCREEN_HEIGHT, (void*)0, PSP_LINE_SIZE); sceGuClear(GU_COLOR_BUFFER_BIT | GU_DEPTH_BUFFER_BIT); sceGuDepthBuffer((void*) (FRAMEBUFFER_SIZE*2), PSP_LINE_SIZE); sceGuOffset(2048 - (SCREEN_WIDTH / 2), 2048 - (SCREEN_HEIGHT / 2)); sceGuViewport(2048, 2048, SCREEN_WIDTH, SCREEN_HEIGHT); sceGuDepthRange(0xc350, 0x2710); sceGuScissor(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); sceGuEnable(GU_SCISSOR_TEST); sceGuAlphaFunc(GU_GREATER, 0, 0xff); sceGuEnable(GU_ALPHA_TEST); sceGuDepthFunc(GU_GEQUAL); sceGuEnable(GU_DEPTH_TEST); sceGuFrontFace(GU_CW); sceGuShadeModel(GU_SMOOTH); sceGuEnable(GU_CULL_FACE); sceGuEnable(GU_TEXTURE_2D); sceGuEnable(GU_CLIP_PLANES); sceGuTexMode(GU_PSM_8888, 0, 0, 0); sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA); sceGuTexFilter(GU_NEAREST, GU_NEAREST); sceGuAmbient(0xffffffff); sceGuEnable(GU_BLEND); sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0); sceGuFinish(); sceGuSync(0, 0); sceDisplayWaitVblankStart(); sceGuDisplay(GU_TRUE); initialized = 1; }
int dxpGraphicsSetup2DTex(DXPTEXTURE3 *texptr,int flag) { if(!texptr)return -1; //設定が同じなら変更処理をしない if(dxpGraphicsData.drawstate == DXP_DRAWSTATE_TEX2D && flag == dxpGraphicsData.flag && texptr == dxpGraphicsData.texture && !texptr->reloadflag && !dxpGraphicsData.forceupdate )return 0; GUSTART; if(dxpGraphicsData.drawstate != DXP_DRAWSTATE_TEX2D) {//2Dテクスチャ用の描画設定を行う。 dxpGraphicsData.drawstate = DXP_DRAWSTATE_TEX2D; dxpGraphicsData.forceupdate = 1; GUENABLE(GU_TEXTURE_2D); if(dxpGraphicsData.bilinear_enable) sceGuTexFilter(GU_LINEAR,GU_LINEAR); else sceGuTexFilter(GU_NEAREST,GU_NEAREST); if(dxpGraphicsData.usedepth) { GUENABLE(GU_DEPTH_TEST); sceGuDepthFunc(dxpGraphicsData.depthfunc); sceGuDepthBuffer(dxpGraphicsData.depthbuffer.texvram,512); //深度バッファを有効にするときでいい if(dxpGraphicsData.writedepth)sceGuDepthMask(0); else sceGuDepthMask(1); } else GUDISABLE(GU_DEPTH_TEST); } //テクスチャの設定開始 if(texptr != dxpGraphicsData.texture || texptr->reloadflag) {//GUにテクスチャの指定をする if(texptr->ppalette && (texptr->psm == GU_PSM_T8 || texptr->psm == GU_PSM_T4)) {//パレットの設定 sceGuClutMode(GU_PSM_8888,0,0xff,0); sceGuClutLoad(texptr->psm == GU_PSM_T4 ? 2 : 32,texptr->ppalette); } sceGuTexMode(texptr->psm,0,0,texptr->swizzledflag); sceGuTexImage(0,texptr->width,texptr->height,texptr->pitch,texptr->texvram ? texptr->texvram : texptr->texdata); dxpGraphicsData.texture = texptr; if(texptr != &dxpGraphicsData.displaybuffer[0] && texptr != &dxpGraphicsData.displaybuffer[1])texptr->reloadflag = 0; } u8 colorKey = 0,alphaEnable = 0; if(flag) { if(texptr->alphabit) alphaEnable = 1; else colorKey = 1; } if(colorKey) { GUENABLE(GU_COLOR_TEST); sceGuColorFunc(GU_NOTEQUAL,texptr->colorkey,0x00fefefe); } else { GUDISABLE(GU_COLOR_TEST); } int op; int src,dest; unsigned int srcfix; unsigned int destfix; switch(dxpGraphicsData.blendmode) { case DX_BLENDMODE_NOBLEND: op = GU_ADD; src = GU_FIX; dest = GU_FIX; srcfix = 0xffffffff; destfix = 0; if(!alphaEnable)break; case DX_BLENDMODE_ALPHA: op = GU_ADD; src = GU_SRC_ALPHA; dest = GU_ONE_MINUS_SRC_ALPHA; srcfix = 0; destfix = 0; break; case DX_BLENDMODE_ADD: op = GU_ADD; src = GU_SRC_ALPHA; dest = GU_FIX; srcfix = 0xffffffff; destfix = 0xffffffff; break; case DX_BLENDMODE_SUB: op = GU_REVERSE_SUBTRACT; src = GU_SRC_ALPHA; dest = GU_FIX; srcfix = 0xffffffff; destfix = 0xffffffff; break; case DX_BLENDMODE_MUL: op = GU_ADD; src = GU_DST_COLOR; dest = GU_FIX; srcfix = 0xffffffff; destfix = 0; break; case DX_BLENDMODE_DESTCOLOR: op = GU_ADD; src = GU_FIX; dest = GU_FIX; srcfix = 0; destfix = 0xffffffff; break; case DX_BLENDMODE_INVDESTCOLOR: op = GU_ADD; src = GU_ONE_MINUS_DST_COLOR; dest = GU_FIX; srcfix = 0; destfix = 0; break; case DX_BLENDMODE_INVSRC: op = GU_ADD; src = GU_SRC_ALPHA; dest = GU_ONE_MINUS_SRC_ALPHA; srcfix = 0; destfix = 0; break; default: return -1; } if(dxpGraphicsData.blendmode == DX_BLENDMODE_NOBLEND && !alphaEnable) { GUDISABLE(GU_BLEND); } else { GUENABLE(GU_BLEND); if(dxpGraphicsData.forceupdate || dxpGraphicsData.op != op || dxpGraphicsData.src != src || dxpGraphicsData.dest != dest || dxpGraphicsData.srcfix != srcfix || dxpGraphicsData.destfix != destfix ){ sceGuBlendFunc(op,src,dest,srcfix,destfix); dxpGraphicsData.op = op; dxpGraphicsData.src = src; dxpGraphicsData.dest = dest; dxpGraphicsData.srcfix = srcfix; dxpGraphicsData.destfix = destfix; } } if(dxpGraphicsData.forceupdate || dxpGraphicsData.color != dxpGraphicsData.gucolor) {//色を設定 sceGuColor(dxpGraphicsData.color); dxpGraphicsData.gucolor = dxpGraphicsData.color; } int tfx,tcc; switch(dxpGraphicsData.blendmode) { case DX_BLENDMODE_NOBLEND: case DX_BLENDMODE_MUL: case DX_BLENDMODE_DESTCOLOR: tcc = GU_TCC_RGB; tfx = GU_TFX_MODULATE; if(!alphaEnable) { GUDISABLE(GU_ALPHA_TEST); break; } case DX_BLENDMODE_ALPHA: case DX_BLENDMODE_ADD: case DX_BLENDMODE_SUB: case DX_BLENDMODE_INVDESTCOLOR: tcc = GU_TCC_RGBA; tfx = GU_TFX_MODULATE; GUENABLE(GU_ALPHA_TEST); sceGuAlphaFunc(GU_NOTEQUAL,0x00,0xff); break; case DX_BLENDMODE_INVSRC: sceGuTexEnvColor(0x00000000); tcc = GU_TCC_RGBA; tfx = GU_TFX_BLEND; GUDISABLE(GU_ALPHA_TEST); break; default: return -1; } if(dxpGraphicsData.forceupdate || dxpGraphicsData.tfx != tfx || dxpGraphicsData.tcc != tcc) { sceGuTexFunc(tfx,tcc); dxpGraphicsData.tfx = tfx; dxpGraphicsData.tcc = tcc; } dxpGraphicsData.forceupdate = 0; dxpGraphicsData.flag = flag; return 0; }
void app() { setupCallbacks(); #ifdef DEBUG pspDebugScreenInit(); #endif sceGuInit(); void* fbp0 = getStaticVramBuffer(BUF_WIDTH,SCR_HEIGHT,GU_PSM_8888); void* fbp1 = getStaticVramBuffer(BUF_WIDTH,SCR_HEIGHT,GU_PSM_8888); void* zbp = getStaticVramBuffer(BUF_WIDTH,SCR_HEIGHT,GU_PSM_4444); sceGuStart(GU_DIRECT, list); sceGuDrawBuffer(GU_PSM_8888, fbp0, BUF_WIDTH); sceGuDispBuffer(SCR_WIDTH, SCR_HEIGHT, fbp1, BUF_WIDTH); sceGuDepthBuffer(zbp, BUF_WIDTH); sceGuOffset(2048 - (SCR_WIDTH / 2), 2048 - (SCR_HEIGHT / 2)); sceGuViewport(2048, 2048, SCR_WIDTH, SCR_HEIGHT); sceGuDepthRange(65535, 0); sceGuClearDepth(65535); sceGuDepthFunc(GU_LEQUAL); sceGuAlphaFunc(GU_GREATER, 0, 255); sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0); sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA); sceGuTexFilter(GU_LINEAR, GU_LINEAR); sceGuShadeModel(GU_SMOOTH); sceGuEnable(GU_DEPTH_TEST); sceGuEnable(GU_ALPHA_TEST); sceGuEnable(GU_SCISSOR_TEST); sceGuEnable(GU_BLEND); sceGuDisable(GU_CULL_FACE); sceGuDisable(GU_CLIP_PLANES); sceGuDisable(GU_DITHER); sceGuScissor(0, 0, SCR_WIDTH, SCR_HEIGHT); sceGuFinish(); sceGuSync(0, 0); sceDisplayWaitVblankStart(); sceGuDisplay(GU_TRUE); //g2dInit(); /*tileset_tex = g2dTexLoad((char *) "resources/tilemap.png", G2D_SWIZZLE); outline_tex = g2dTexLoad((char *) "resources/tilemap2.png", G2D_SWIZZLE); text_tex = g2dTexLoad((char *) "resources/ui-font.png", G2D_SWIZZLE); frame_tex = g2dTexLoad((char *) "resources/frame.png", G2D_SWIZZLE);*/ while (running()) { sceGuStart(GU_DIRECT,list); // Clear screen sceGuClearColor(0xff554433); // TODO change to black when everything works sceGuClearDepth(0); sceGuClear(GU_COLOR_BUFFER_BIT | GU_DEPTH_BUFFER_BIT); // Process and draw a frame //menu.update(); //background.draw(); //menu.draw(); sceGuFinish(); sceGuSync(0,0); // Swap buffers and wait for VSYNC sceDisplayWaitVblankStart(); sceGuSwapBuffers(); } sceGuDisplay(GU_FALSE); sceGuTerm(); sceKernelExitGame(); }
int main(int argc, char* argv[]) { unsigned int i,j; pspDebugScreenInit(); SetupCallbacks(); #ifdef ENABLE_PROFILER // Enable profiling pspDebugProfilerClear(); pspDebugProfilerEnable(); #endif // initialize global context g_context.iterationCount = NUM_VERTEX_BUFFERS * NUM_ITERATIONS; g_context.t = 0; g_context.sint = 0; // initialize torus for (i = 0; i < NUM_SLICES; ++i) { for (j = 0; j < NUM_ROWS; ++j) { float s = i + 0.5f, t = j; float x,y,z; x = (RING_SIZE + RING_RADIUS * cosf(s * ((GU_PI*2)/NUM_SLICES))) * cosf(t * ((GU_PI*2)/NUM_ROWS)); y = (RING_SIZE + RING_RADIUS * cosf(s * ((GU_PI*2)/NUM_SLICES))) * sinf(t * ((GU_PI*2)/NUM_ROWS)); z = RING_RADIUS * sinf(s * ((GU_PI*2)/NUM_SLICES)); torus_vertices[j + i * NUM_ROWS].x = x; torus_vertices[j + i * NUM_ROWS].y = y; torus_vertices[j + i * NUM_ROWS].z = z; } } // initialize torus modifiers for (j = 0; j < NUM_ROWS; ++j) { float t = j; torus_modifiers[j].x = 0; torus_modifiers[j].y = 0; torus_modifiers[j].z = 0.3*cosf( t * 8.0f *((GU_PI*2)/NUM_ROWS) ); } // init GU and set callbacks sceGuInit(); // 0x01 - user callback // 0x04 - 'rendering finished' callback sceGuSetCallback(1, &mySignalHandler); sceGuSetCallback(4, &myFinishHandler); // setup GU sceGuStart(GU_DIRECT,list); sceGuDrawBuffer(GU_PSM_8888,(void*)0,BUF_WIDTH); sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,(void*)0x88000,BUF_WIDTH); sceGuDepthBuffer((void*)0x110000,BUF_WIDTH); sceGuOffset(2048 - (SCR_WIDTH/2),2048 - (SCR_HEIGHT/2)); sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT); sceGuDepthRange(0xc350,0x2710); sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT); sceGuEnable(GU_SCISSOR_TEST); sceGuAlphaFunc(GU_GREATER,0,0xff); sceGuEnable(GU_ALPHA_TEST); sceGuDepthFunc(GU_GEQUAL); sceGuEnable(GU_DEPTH_TEST); sceGuFrontFace(GU_CW); sceGuShadeModel(GU_SMOOTH); sceGuEnable(GU_CULL_FACE); sceGuEnable(GU_TEXTURE_2D); sceGuFinish(); sceGuSync(0,0); sceDisplayWaitVblankStart(); sceGuDisplay(GU_TRUE); // run sample #ifdef USING_SIGNALS sceGuCallMode(1); #endif // generate callable command-list with texture setup { sceGuStart(GU_CALL, smallList1); // setup texture sceGuTexMode(GU_PSM_5551,0,0,0); sceGuTexImage(0,32,32,32,ball_start); // width, height, buffer width, tbp sceGuTexFunc(GU_TFX_MODULATE,GU_TCC_RGBA); // NOTE: this enables reads of the alpha-component from the texture, otherwise blend/test won't work sceGuTexFilter(GU_NEAREST,GU_NEAREST); sceGuTexWrap(GU_CLAMP,GU_CLAMP); sceGuTexScale(1,1); sceGuTexOffset(0,0); sceGuAmbientColor(0xffffffff); sceGuFinish(); sceGuSync(0,0); } // generate callable command-list for cube rendering { sceGuStart(GU_CALL, smallList2); // draw cube sceGuDrawArray(GU_TRIANGLES,GU_TEXTURE_32BITF|GU_COLOR_8888|GU_VERTEX_32BITF|GU_TRANSFORM_3D,12*3,0,cubeVertices); sceGuFinish(); sceGuSync(0,0); } for(;;) { sceGuStart(GU_DIRECT,list); unsigned int i = 0; for( ; i < NUM_VERTEX_BUFFERS; i++ ) g_context.vbuffer[i] = sceGuGetMemory((NUM_SLICES/g_context.iterationCount) * 2 * NUM_ROWS * sizeof(Vertex)); g_context.vertsRendered = 0; // clear screen sceGuClearColor(0x00334455); sceGuClearDepth(0); sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT); // setup matrices sceGumMatrixMode(GU_PROJECTION); sceGumLoadIdentity(); sceGumPerspective(75.0f,16.0f/9.0f,0.5f,1000.0f); sceGumMatrixMode(GU_VIEW); sceGumLoadIdentity(); sceGumMatrixMode(GU_MODEL); { ScePspFVector3 pos = {0.0f,0.0f,-3.5f}; ScePspFVector3 rot = {g_context.t * 0.3f * (GU_PI/180.0f), g_context.t * 0.7f * (GU_PI/180.0f), g_context.t * 1.3f * (GU_PI/180.0f)}; sceGumLoadIdentity(); sceGumTranslate(&pos); sceGumRotateXYZ(&rot); } sceGumStoreMatrix(&g_context.world); // call pregenerated command-list to setup texture sceGuCallList(smallList1); // start billboard rendering render_billboards(0); // call pregenerated command-list to render cube { ScePspFVector3 scale = {0.3f, 0.3f, 0.3f}; sceGumScale(&scale); } sceGumUpdateMatrix(); sceGuCallList(smallList2); #ifndef USING_SIGNALS // HACK: sceGuFinish() is called inside the signal interupt handler when all rendering job is done // this is done in order to stall GPU if it is ahead of CPU sceGuFinish(); #endif sceGuSync(0,0); #ifndef ENABLE_FRAMERATE // wait for next frame sceDisplayWaitVblankStart(); #endif sceGuSwapBuffers(); pspDebugScreenSetXY(0,0); #ifdef ENABLE_PROFILER // Print profile information to the screen pspDebugProfilerPrint(); #endif #ifdef ENABLE_FRAMERATE // simple frame rate counter static float curr_ms = 1.0f; static struct timeval time_slices[16]; static int t = 0; float curr_fps = 1.0f / curr_ms; t++; float vertsPerSec = g_context.vertsRendered*curr_fps; float kbPerSec = vertsPerSec * sizeof(Vertex) / 1024.0f; gettimeofday(&time_slices[t & 15],0); pspDebugScreenPrintf("fps: %d.%03d ms: %d vert/s: %dK MB/s: %d.%03d",(int)curr_fps, ((int)(curr_fps*1000.0f)%1000), (int)(curr_ms*1000.0f), (int)(vertsPerSec/1000.0f), (int)(kbPerSec/1024.0f), (int)((1000.0f/1024.0f)*((int)kbPerSec%1024)) ); if (!(t & 15)) { struct timeval last_time = time_slices[0]; unsigned int i; curr_ms = 0; for (i = 1; i < 16; ++i) { struct timeval curr_time = time_slices[i]; int curr_time_usec = curr_time.tv_usec + curr_time.tv_sec * 1000000; int last_time_usec = last_time.tv_usec + last_time.tv_sec * 1000000; if( last_time_usec < curr_time_usec ) curr_ms += (( curr_time_usec - last_time_usec ) * (1.0f/1000000.0f)); last_time = time_slices[i]; } curr_ms /= 15.0f; } #endif } sceGuTerm(); sceKernelExitGame(); return 0; }