static void render_pass(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, unsigned rotation) { d3d_video_t *d3d = (d3d_video_t*)data; LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->dev; #ifndef _XBOX1 DWORD fetchConstant; UINT64 pendingMask3; #endif #ifdef _XBOX1 d3dr->SetFlickerFilter(g_extern.console.screen.flicker_filter_index); d3dr->SetSoftDisplayFilter(g_extern.lifecycle_state & (1ULL << MODE_VIDEO_SOFT_FILTER_ENABLE)); #endif blit_to_texture(d3d, frame, width, height, pitch); set_vertices(d3d, 1, width, height); #ifdef _XBOX if (g_extern.frame_count) { #ifdef _XBOX1 d3dr->SwitchTexture(0, d3d->tex); #elif defined _XBOX360 d3dr->SetTextureFetchConstant(0, d3d->tex); #endif } else if (d3d->tex) #endif RD3DDevice_SetTexture(d3dr, 0, d3d->tex); RD3DDevice_SetViewport(d3d->dev, &d3d->final_viewport); RD3DDevice_SetSamplerState_MinFilter(d3dr, 0, g_settings.video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); RD3DDevice_SetSamplerState_MagFilter(d3dr, 0, g_settings.video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT); RD3DDevice_SetSamplerState_AddressU(d3dr, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER); RD3DDevice_SetSamplerState_AddressV(d3dr, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER); #if defined(_XBOX1) RD3DDevice_SetVertexShader(d3dr, D3DFVF_XYZ | D3DFVF_TEX1); IDirect3DDevice8_SetStreamSource(d3dr, 0, d3d->vertex_buf, sizeof(DrawVerticeFormats)); #elif defined(_XBOX360) D3DDevice_SetVertexDeclaration(d3dr, d3d->vertex_decl); D3DDevice_SetStreamSource_Inline(d3dr, 0, d3d->vertex_buf, 0, sizeof(DrawVerticeFormats)); #endif #ifdef _XBOX d3dr->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); #else if (SUCCEEDED(d3dr->BeginScene())) { d3dr->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); d3dr->EndScene(); } #endif g_extern.frame_count++; set_mvp(d3d, d3d->screen_width, d3d->screen_height, d3d->dev_rotation); }
// Primary function that sets up v3dfx-base int init_view() { int matrixLocation; deviceClass = new TISGXStreamIMGSTREAMDevice(); texClass = new TISGXStreamTexIMGSTREAM(); deviceClass->init(&initAttrib, lastDeviceClass, paArray); texClass->init(lastDeviceClass); texClass->load_v_shader(NULL); texClass->load_f_shader(NULL); texClass->load_program(); matrixLocation = texClass->get_uniform_location("MVPMatrix"); set_mvp(matrixLocation); return 1; }
int bind3d( uint32_t *fifo, uint32_t *fbmem, uint8_t *xdrmem, uint32_t obj, uint32_t jmp ) { uint32_t *ptr = fifo; xdrmem = xdrmem; mvp.init( "../../data/particle.vertex", xdr_pool ); memory_pool gfx_pool( (uint8_t *)fbmem, 252 * 1024 * 1024, 1024 * 1024 ); gfx_pool.alloc( 1024 * 1024 * 32 ); fp_pool = gfx_pool.sub_pool( 1024 * 1024, 128 ); custom.init( "../../data/particle.pixel", xdr_pool, fp_pool ); tx_pool = gfx_pool.sub_pool( 1024 * 1024, 1024 ); troll_texture.init( "../../data/troll.dxt3", xdr_pool, tx_pool ); particle_texture.init( "../../data/spell.dxt3", xdr_pool, tx_pool ); vr_pool = gfx_pool.sub_pool( 1024 * 1024 * 16, 1024 ); raw_data_t vb; raw_data_t ib; vb.init( "../../data/troll.0.vb", vr_pool ); ib.init( "../../data/troll.0.ib", vr_pool ); troll.init( "../../data/troll.0.model", xdr_pool, vb.get_offset(), ib.get_offset() ); fx.init( "../../data/spell", xdr_pool ); atlas.init( "../../data/spell.dxt3.atlas", xdr_pool ); particles.init( xdr_pool, vr_pool.get_offset() ); dynamic = vr_pool.alloc( 1024 * 1024 ); ptr += setup_and_voodoo( 0x66604200, 0xfeed0000, obj, ptr, Nv3D ); ptr += setup_surfaces_with_offset( ptr, 1 ); ptr += troll_texture.set( ptr ); ptr += mvp.set( ptr ); ptr += set_mvp( ptr, 180.0f ); ptr += set_cnst( ptr ); ptr += custom.set( ptr ); ptr += set_geometry_pipe( 0xfeed0000, 0xfeed0001, ptr, Nv3D ); ptr += troll.set( ptr ); ptr += jump_to_address( ptr, jmp ); return ptr - fifo; }
void test21_eglimagekhr() { int matrixLocation; deviceClass = new TISGXStreamEGLIMAGEDevice(); texClass = new TISGXStreamTexEGLIMAGE(); test_eglimagekhr_init_texture_streaming(); paArray[0] = physicalAddress; deviceClass->init(&tempAttrib, lastDeviceClass, paArray); texClass->init(lastDeviceClass); texClass->load_v_shader(NULL); texClass->load_f_shader(NULL); texClass->load_program(); matrixLocation = texClass->get_uniform_location("MVPMatrix"); set_mvp(matrixLocation); //initialise gl vertices float *pVertexArray, *pTexCoordArray; common_init_gl_vertices(inNumberOfObjectsPerSide, &pVertexArray); common_init_gl_texcoords(inNumberOfObjectsPerSide, &pTexCoordArray); //Rendering loop glClear(GL_COLOR_BUFFER_BIT); deviceClass->qTexImage2DBuf(&paArray); common_gl_draw(inNumberOfObjectsPerSide); common_eglswapbuffers (eglDisplay, eglSurface); deviceClass->signal_draw(0); //only 1 buffer deviceClass->dqTexImage2DBuf(&freeArray); deviceClass->destroy(); test_eglimagekhr_deinit_texture_streaming(); }
static void set_vertices(void *data, unsigned pass, unsigned width, unsigned height) { d3d_video_t *d3d = (d3d_video_t*)data; if (d3d->last_width != width || d3d->last_height != height) { d3d->last_width = width; d3d->last_height = height; DrawVerticeFormats vert[4]; float tex_w = width; float tex_h = height; #ifdef _XBOX360 tex_w /= ((float)d3d->tex_w); tex_h /= ((float)d3d->tex_h); #endif vert[0].x = -1.0f; vert[1].x = 1.0f; vert[2].x = -1.0f; vert[3].x = 1.0f; vert[0].y = -1.0f; vert[1].y = -1.0f; vert[2].y = 1.0f; vert[3].y = 1.0f; #if defined(_XBOX1) vert[0].z = 1.0f; vert[1].z = 1.0f; vert[2].z = 1.0f; vert[3].z = 1.0f; vert[0].rhw = 0.0f; vert[1].rhw = tex_w; vert[2].rhw = 0.0f; vert[3].rhw = tex_w; vert[0].u = tex_h; vert[1].u = tex_h; vert[2].u = 0.0f; vert[3].u = 0.0f; vert[0].v = 0.0f; vert[1].v = 0.0f; vert[2].v = 0.0f; vert[3].v = 0.0f; #elif defined(_XBOX360) vert[0].u = 0.0f; vert[1].u = tex_w; vert[2].u = 0.0f; vert[3].u = tex_w; vert[0].v = tex_h; vert[1].v = tex_h; vert[2].v = 0.0f; vert[3].v = 0.0f; #endif // Align texels and vertices. for (unsigned i = 0; i < 4; i++) { vert[i].x -= 0.5f / ((float)d3d->tex_w); vert[i].y += 0.5f / ((float)d3d->tex_h); } #if defined(_XBOX1) BYTE *verts; #elif defined(_XBOX360) void *verts; #endif RD3DVertexBuffer_Lock(d3d->vertex_buf, 0, 0, &verts, 0); memcpy(verts, vert, sizeof(vert)); RD3DVertexBuffer_Unlock(d3d->vertex_buf); } if (d3d->shader) { set_mvp(d3d, d3d->screen_width, d3d->screen_height, d3d->dev_rotation); if (d3d->shader->use) d3d->shader->use(d3d, pass); if (d3d->shader->set_params) d3d->shader->set_params(d3d, width, height, d3d->tex_w, d3d->tex_h, d3d->screen_width, d3d->screen_height, g_extern.frame_count, NULL, NULL, NULL, 0); } }
int gfx_step( uint32_t *fifo, uint32_t jmp, int off ) { static bool init_particles = false; if( !init_particles ) { init_particles = true; for( size_t i = 0; i < INUMBER; ++i ) { dt[i] = ( rand() & 63 ) + 32; rnds[i][0] = 360.0f * i / (float)( INUMBER );//rnd( 0.0f, 360.0f ); rnds[i][1] = rnd( -0.2f, +0.2f ); rnds[i][2] = rnd( -0.8f, +0.3f ); rnds[i][3] = rnd( 0.3f, 1.0f ); insts[i].time = rand(); insts[i].col[0] = rnd( 0.8f, 1.0f ); insts[i].col[1] = rnd( 0.8f, 1.0f ); insts[i].col[2] = rnd( 0.8f, 1.0f ); insts[i].col[3] = 1.0f; } } for( size_t i = 0; i < INUMBER; ++i ) { insts[i].time += dt[i]; identity( insts[i].mat ); rotatef( 80.0f, 1.0f, 0.0f, 0.0f, insts[i].mat ); rotatef( off * 0.5f + rnds[i][0], 0.0f, 0.0f, 1.0f, insts[i].mat ); translatef( 1.6f, rnds[i][1], rnds[i][2], insts[i].mat ); scalef( rnds[i][3], insts[i].mat ); float d = insts[i].mat[11]; d = ( 1.0f - 0.6f * d ); insts[i].scale = rnds[i][3]; insts[i].col[0] = d; insts[i].col[1] = 0.5f + d; insts[i].col[2] = d; //translatef( 1.0f * sin( t * rnds[i][0] ), 1.0f * cos( t * rnds[i][0] ), 1.0f * sin( t * rnds[i][2] ), insts[i].mat ); } clear_buffer_t clear; clear.clearR = clear.clearG = clear.clearB = clear.clearA = clear.clearD = 1; clear.rgba = 50 + ( 10 << 8 ) + ( 5 << 16 ); clear.depth = 0xffff; static job_t job; static size_t curr = 0x0; job.pd.insts = (uint32_t)insts; job.pd.isize = INUMBER; job.pd.dynamic = (uint32_t)( dynamic ) + curr * 24; job.pd.fx = (uint32_t)fx.get_data(); job.pd.atlas = (uint32_t)atlas.get_data(); job.pd.asize = atlas.get_size(); job.kick_job( ); job.join(); uint32_t *ptr = fifo; static float angle = 180.0f; ptr += setup_surfaces_with_offset( ptr, off % 3 ); ptr += clear_buffers( &clear, ptr, Nv3D ); ptr += set_mvp( ptr, angle ); ptr += set_cnst( ptr ); //ptr += troll_texture.set( ptr ); //ptr += troll.set( ptr ); //ptr += custom.set( ptr ); ptr += particles.set( ptr ); ptr += particle_texture.set( ptr ); ptr += draw_primitives( 0, QUADS, curr, job.pd.quads * 4, ptr, Nv3D ); curr += job.pd.quads * 4;// + 128; curr = ( curr + 16 ) & 2047; //printf( "%d \n", job.pd.quads ); ptr += jump_to_address( ptr, jmp ); return ptr - fifo; }