Ejemplo n.º 1
0
HRESULT d3d9_init_font(const char *font_path)
{
   xdk_d3d_video_t *vid = (xdk_d3d_video_t*)driver.video_data;
   D3DDevice *m_pd3dDevice = vid->d3d_render_device;

   video_console.m_Buffer = NULL;
   video_console.m_Lines = NULL;
   video_console.m_nScrollOffset = 0;

   // Calculate the safe area
   unsigned int uiSafeAreaPct = vid->video_mode.fIsHiDef ? SAFE_AREA_PCT_HDTV
      : SAFE_AREA_PCT_4x3;

   video_console.m_cxSafeArea = ( vid->d3dpp.BackBufferWidth * uiSafeAreaPct ) / 100;
   video_console.m_cySafeArea = ( vid->d3dpp.BackBufferHeight * uiSafeAreaPct ) / 100;

   video_console.m_cxSafeAreaOffset = ( vid->d3dpp.BackBufferWidth - video_console.m_cxSafeArea ) / 2;
   video_console.m_cySafeAreaOffset = ( vid->d3dpp.BackBufferHeight - video_console.m_cySafeArea ) / 2;

   // Create the font
   HRESULT hr = xdk360_video_font_init(&m_Font, font_path);
   if (hr < 0)
   {
      RARCH_ERR( "Could not create font.\n" );
      return -1;
   }

   // Calculate the number of lines on the screen
   float fCharWidth, fCharHeight;
   xdk360_video_font_get_text_width(&m_Font, L"i", &fCharWidth, &fCharHeight);

   video_console.m_cScreenHeight = (unsigned int)( video_console.m_cySafeArea / fCharHeight );
   video_console.m_cScreenWidth = (unsigned int)( video_console.m_cxSafeArea / fCharWidth );

   video_console.m_cScreenHeightVirtual = video_console.m_cScreenHeight;

   video_console.m_fLineHeight = fCharHeight;

   // Allocate memory to hold the lines
   video_console.m_Buffer = (wchar_t*)malloc(sizeof(wchar_t*) * video_console.m_cScreenHeightVirtual * ( video_console.m_cScreenWidth + 1 ));
   video_console.m_Lines = new wchar_t *[ video_console.m_cScreenHeightVirtual ];

   // Set the line pointers as indexes into the buffer
   for( unsigned int i = 0; i < video_console.m_cScreenHeightVirtual; i++ )
      video_console.m_Lines[ i ] = video_console.m_Buffer + ( video_console.m_cScreenWidth + 1 ) * i;

   video_console.m_nCurLine = 0;
   video_console.m_cCurLineLength = 0;
   memset( video_console.m_Buffer, 0, video_console.m_cScreenHeightVirtual * ( video_console.m_cScreenWidth + 1 ) * sizeof( wchar_t ) );
   xdk360_console_draw();

   return hr;
}
Ejemplo n.º 2
0
static bool xdk_d3d_frame(void *data, const void *frame,
      unsigned width, unsigned height, unsigned pitch, const char *msg)
{
   if (!frame)
      return true;

   xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data;
#ifdef HAVE_FBO
   D3DSurface* pRenderTarget0;
#endif
   bool menu_enabled = g_console.menu_enable;

   if (d3d->last_width != width || d3d->last_height != height)
   {
      D3DLOCKED_RECT d3dlr;

      d3d->lpTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);
      memset(d3dlr.pBits, 0, 512 * d3dlr.Pitch);
      d3d->lpTexture->UnlockRect(0);

      float tex_w = width / 512.0f;
      float tex_h = height / 512.0f;

      DrawVerticeFormats verts[] = {
         { -1.0f, -1.0f, 0.0f,  tex_h },
         {  1.0f, -1.0f, tex_w, tex_h },
         { -1.0f,  1.0f, 0.0f,  0.0f },
         {  1.0f,  1.0f, tex_w, 0.0f },
      };

      // Align texels and vertices (D3D9 quirk).
      for (unsigned i = 0; i < 4; i++)
      {
         verts[i].x -= 0.5f / 512.0f;
         verts[i].y += 0.5f / 512.0f;
      }

      void *verts_ptr;
      d3d->vertex_buf->Lock(0, 0, &verts_ptr, 0);
      memcpy(verts_ptr, verts, sizeof(verts));
      d3d->vertex_buf->Unlock();

      d3d->last_width = width;
      d3d->last_height = height;
   }

#ifdef HAVE_FBO
   if (d3d->fbo_enabled)
   {
      d3d->d3d_render_device->GetRenderTarget(0, &pRenderTarget0);
      d3d->d3d_render_device->SetRenderTarget(0, d3d->lpSurface);
   }
#endif

   if (d3d->should_resize)
      xdk_d3d_set_viewport(false);

   d3d->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET,
         0xff000000, 1.0f, 0);
   d3d->frame_count++;

   d3d->d3d_render_device->SetTexture(0, d3d->lpTexture);

#ifdef HAVE_HLSL
   hlsl_use(1);
#endif

#ifdef HAVE_FBO
   if(d3d->fbo_enabled)
   {
#ifdef HAVE_HLSL
      hlsl_set_params(width, height, 512, 512, g_settings.video.fbo_scale_x * width,
            g_settings.video.fbo_scale_y * height, d3d->frame_count);
#endif
      D3DVIEWPORT vp = {0};
      vp.Width  = g_settings.video.fbo_scale_x * width;
      vp.Height = g_settings.video.fbo_scale_y * height;
      vp.X      = 0;
      vp.Y      = 0;
      vp.MinZ   = 0.0f;
      vp.MaxZ   = 1.0f;
      d3d->d3d_render_device->SetViewport(&vp);
   }
   else
#endif
   {
#ifdef HAVE_HLSL
      hlsl_set_params(width, height, 512, 512, d3d->d3dpp.BackBufferWidth,
            d3d->d3dpp.BackBufferHeight, d3d->frame_count);
#endif
   }

   D3DLOCKED_RECT d3dlr;
   d3d->lpTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);
   for (unsigned y = 0; y < height; y++)
   {
      const uint8_t *in = (const uint8_t*)frame + y * pitch;
      uint8_t *out = (uint8_t*)d3dlr.pBits + y * d3dlr.Pitch;
      memcpy(out, in, width * sizeof(uint16_t));
   }
   d3d->lpTexture->UnlockRect(0);

   d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_MINFILTER, g_settings.video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT);
   d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_MAGFILTER, g_settings.video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT);
   d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
   d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);

   d3d->d3d_render_device->SetVertexDeclaration(d3d->v_decl);
   d3d->d3d_render_device->SetStreamSource(0, d3d->vertex_buf,
	   0,
	   sizeof(DrawVerticeFormats));

   d3d->d3d_render_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

#ifdef HAVE_FBO
   if(d3d->fbo_enabled)
   {
      d3d->d3d_render_device->Resolve(D3DRESOLVE_RENDERTARGET0, NULL, d3d->lpTexture_ot,
         NULL, 0, 0, NULL, 0, 0, NULL);

      d3d->d3d_render_device->SetRenderTarget(0, pRenderTarget0);
      pRenderTarget0->Release();
      d3d->d3d_render_device->SetTexture(0, &d3d->lpTexture_ot_as16srgb);

#ifdef HAVE_HLSL
      hlsl_use(2);
      hlsl_set_params(g_settings.video.fbo_scale_x * width, g_settings.video.fbo_scale_y * height, g_settings.video.fbo_scale_x * 512, g_settings.video.fbo_scale_y * 512, d3d->d3dpp.BackBufferWidth,
            d3d->d3dpp.BackBufferHeight, d3d->frame_count);
#endif
      xdk_d3d_set_viewport(false);

      d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_MINFILTER, g_settings.video.second_pass_smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT);
      d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_MAGFILTER, g_settings.video.second_pass_smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT);
      d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
      d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
      d3d->d3d_render_device->SetVertexDeclaration(d3d->v_decl);
      d3d->d3d_render_device->SetStreamSource(0, d3d->vertex_buf,
		  0,
		  sizeof(DrawVerticeFormats));
      d3d->d3d_render_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
   }
#endif

   /* XBox 360 specific font code */
   if (msg && !menu_enabled)
   {
      if(IS_TIMER_EXPIRED(d3d))
      {
         xdk360_console_format(msg);
         SET_TIMER_EXPIRATION(d3d, 30);
      }

      xdk360_console_draw();
   }

   if(!d3d->block_swap)
      gfx_ctx_swap_buffers();

   return true;
}
Ejemplo n.º 3
0
void menu_loop(void)
{
   HRESULT hr;
   xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data;

   g_extern.console.rmenu.state.rmenu.enable = true;

   d3d->block_swap = true;

   g_extern.console.rmenu.input_loop = INPUT_LOOP_MENU;

   do
   {
      if(g_extern.console.emulator_initialized)
         rarch_render_cached_frame();
      else
      {
         d3d->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
         d3d->frame_count++;
      }

      XINPUT_STATE state;
      XInputGetState(0, &state);

      g_extern.console.rmenu.state.rmenu.enable = !((state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) 
      && (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) && (g_extern.console.emulator_initialized)
      && IS_TIMER_EXPIRED(d3d));

      g_extern.console.rmenu.mode = g_extern.console.rmenu.state.rmenu.enable ? MODE_MENU : MODE_EMULATION;

      switch(g_extern.console.rmenu.input_loop)
      {
     	  case INPUT_LOOP_FILEBROWSER:
			  /*
			  if(((state.Gamepad.wButtons & XINPUT_GAMEPAD_Y) && hCur != app.hMainScene))
			  {
				uint64_t action = (1 << RMENU_DEVICE_NAV_A);
				browser_update(browser, action, rarch_console_get_rom_ext());
				SET_TIMER_EXPIRATION(d3d, 15);
			  }
			  */
         case INPUT_LOOP_MENU:
            app.RunFrame(); /* Update XUI */
            if((state.Gamepad.wButtons & XINPUT_GAMEPAD_B) && hCur != app.hMainScene)
               XuiSceneNavigateBack(hCur, app.hMainScene, XUSER_INDEX_ANY);
            break;
         case INPUT_LOOP_RESIZE_MODE:
            ingame_menu_resize();
            break;
         default:
            break;
      }

      hr = app.Render();   /* Render XUI */
      hr = XuiTimersRun(); /* Update XUI timers */

      if(g_extern.console.rmenu.mode == MODE_EMULATION && !g_extern.console.screen.state.frame_advance.enable)
      {
         SET_TIMER_EXPIRATION(d3d, 30);
      }

      const char *message = msg_queue_pull(g_extern.msg_queue);

      if (message)
      {
		  xdk360_console_format(message);
         xdk360_console_draw();
      }

      context->swap_buffers();
   }while(g_extern.console.rmenu.state.rmenu.enable);

   d3d->block_swap = false;

   g_extern.console.rmenu.state.ingame_menu.enable = false;
}
Ejemplo n.º 4
0
void menu_loop(void)
{
   HRESULT hr;
   xdk360_video_t *d3d9 = (xdk360_video_t*)driver.video_data;

   g_console.menu_enable = true;

   d3d9->block_swap = true;

   g_console.input_loop = INPUT_LOOP_MENU;

   do
   {
      if(g_console.emulator_initialized)
	  {
         rarch_render_cached_frame();
	  }
	  else
	  {
         d3d9->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 0, 0, 0), 1.0f, 0);
         d3d9->frame_count++;
	  }

      XINPUT_STATE state;
      XInputGetState(0, &state);

      g_console.menu_enable = !((state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) 
      && (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) && (g_console.emulator_initialized)
      && IS_TIMER_EXPIRED(d3d9));

      g_console.mode_switch = g_console.menu_enable ? MODE_MENU : MODE_EMULATION;

      switch(g_console.input_loop)
      {
         case INPUT_LOOP_MENU:
            app.RunFrame();			/* Update XUI */
            if(state.Gamepad.wButtons & XINPUT_GAMEPAD_B && hCur != app.hMainScene)
               XuiSceneNavigateBack(hCur, app.hMainScene, XUSER_INDEX_ANY);
            break;
         case INPUT_LOOP_RESIZE_MODE:
            ingame_menu_resize();
            break;
         default:
            break;
      }

      hr = app.Render();		/* Render XUI */
      hr = XuiTimersRun();	/* Update XUI timers */

      if(g_console.mode_switch == MODE_EMULATION && !g_console.frame_advance_enable)
      {
         SET_TIMER_EXPIRATION(d3d9, 30);
      }

      const char *message = msg_queue_pull(g_extern.msg_queue);

      if (message)
      {
         if(IS_TIMER_EXPIRED(d3d9))
         {
            xdk360_console_format(message);
            SET_TIMER_EXPIRATION(d3d9, 30);
         }
         xdk360_console_draw();
      }

      gfx_ctx_swap_buffers();
   }while(g_console.menu_enable);

   d3d9->block_swap = false;

   g_console.ingame_menu_enable = false;
}