Esempio n. 1
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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();
}
Esempio n. 5
0
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);
   }
}
Esempio n. 6
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;
}