From 9d6ef702d677c78e208dfaec092cc72e7db1a79a Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Wed, 5 Mar 2014 02:31:29 +0100
Subject: [PATCH] (XDK D3D) Cleanups

---
 xdk/xdk_d3d.cpp | 120 ++++++++++++++++++++++++------------------------
 1 file changed, 61 insertions(+), 59 deletions(-)

diff --git a/xdk/xdk_d3d.cpp b/xdk/xdk_d3d.cpp
index aa1a393963..83e256f7ed 100644
--- a/xdk/xdk_d3d.cpp
+++ b/xdk/xdk_d3d.cpp
@@ -109,21 +109,6 @@ const DWORD g_MapLinearToSrgbGpuFormat[] =
 };
 #endif
 
-static void check_window(void *data)
-{
-   xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data;
-
-   bool quit, resize;
-
-   d3d->ctx_driver->check_window(&quit,
-         &resize, NULL, NULL, g_extern.frame_count);
-
-   if (quit)
-      d3d->quitting = true;
-   else if (resize)
-      d3d->should_resize = true;
-}
-
 static bool d3d_init_shader(void *data)
 {
    xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data;
@@ -677,7 +662,6 @@ static void blit_to_texture(void *data, const void *frame,
    if (d3d->last_width != width || d3d->last_height != height)
       clear_texture(data);
 
-      unsigned base_size = d3d->base_size;
    D3DLOCKED_RECT d3dlr;
    D3DTexture_LockRect(d3d->lpTexture, 0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);
 
@@ -685,34 +669,13 @@ static void blit_to_texture(void *data, const void *frame,
    {
       const uint8_t *in = (const uint8_t*)frame + y * pitch;
       uint8_t *out = (uint8_t*)d3dlr.pBits + y * d3dlr.Pitch;
-      memcpy(out, in, width * base_size);
+      memcpy(out, in, width * d3d->base_size);
    }
 }
 
-static bool xdk_d3d_frame(void *data, const void *frame,
-      unsigned width, unsigned height, unsigned pitch, const char *msg)
+static void set_vertices(void *d3d, unsigned pass, unsigned width, unsigned height)
 {
-#ifndef _XBOX1
-   DWORD fetchConstant;
-   UINT64 pendingMask3;
-#endif
    xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data;
-   LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->d3d_render_device;
-
-   if (!frame)
-      return true;
-
-   if (d3d->should_resize)
-   {
-#ifdef _XBOX1
-      d3dr->SetFlickerFilter(g_extern.console.screen.flicker_filter_index);
-      d3dr->SetSoftDisplayFilter(g_extern.lifecycle_state & (1ULL << MODE_VIDEO_SOFT_FILTER_ENABLE));
-#endif
-      xdk_d3d_calculate_rect(d3d, d3d->win_width, d3d->win_height, d3d->video_info.force_aspect, g_extern.system.aspect_ratio);
-      d3d->should_resize = false;
-   }
-
-   blit_to_texture(d3d, frame, width, height, pitch);
 
    if (d3d->last_width != width || d3d->last_height != height)
    {
@@ -758,32 +721,31 @@ static bool xdk_d3d_frame(void *data, const void *frame,
       d3d->last_height = height;
    }
 
-   if (d3d->shader && d3d->shader->set_mvp)
-      d3d->shader->set_mvp(NULL);
-
-   // Insert black frame first, so we can screenshot, etc.
-   if (g_settings.video.black_frame_insertion)
+   if (d3d->shader)
    {
-      d3dr->Present(NULL, NULL, NULL, NULL);
-      d3dr->Clear(0, 0, D3DCLEAR_TARGET, 0, 1, 0);
-   }
-
-   RD3DDevice_SetTexture(d3dr, 0, d3d->lpTexture);
-
-   if (d3d->shader && d3d->shader->use)
-      d3d->shader->use(1);
-
-   {
-      if (d3d->shader && d3d->shader->set_params)
+      if (d3d->shader->set_mvp)
+         d3d->shader->set_mvp(NULL);
+      if (d3d->shader->use)
+         d3d->shader->use(pass);
+      if (d3d->shader->set_params)
          d3d->shader->set_params(width, height, d3d->tex_w, d3d->tex_h, d3d->win_width,
                d3d->win_height, g_extern.frame_count,
                NULL, NULL, NULL, 0);
    }
+}
 
-   unsigned filter = g_settings.video.smooth ? D3DTEXF_LINEAR : D3DTEXF_POINT;
+static void render_pass(void *data, unsigned pass_index)
+{
+   xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data;
+   LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->d3d_render_device;
+#ifndef _XBOX1
+   DWORD fetchConstant;
+   UINT64 pendingMask3;
+#endif
 
-   RD3DDevice_SetSamplerState_MinFilter(d3dr, 0, filter);
-   RD3DDevice_SetSamplerState_MagFilter(d3dr, 0, filter);
+   RD3DDevice_SetTexture(d3dr, 0, d3d->lpTexture);
+   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);
 
@@ -795,6 +757,38 @@ static bool xdk_d3d_frame(void *data, const void *frame,
    D3DDevice_SetStreamSource_Inline(d3dr, 0, d3d->vertex_buf, 0, sizeof(DrawVerticeFormats));
 #endif
    RD3DDevice_DrawPrimitive(d3dr, D3DPT_TRIANGLESTRIP, 0, 2);
+}
+
+static bool xdk_d3d_frame(void *data, const void *frame,
+      unsigned width, unsigned height, unsigned pitch, const char *msg)
+{
+   xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data;
+   LPDIRECT3DDEVICE d3dr = (LPDIRECT3DDEVICE)d3d->d3d_render_device;
+
+   if (!frame)
+      return true;
+
+   if (d3d->should_resize)
+   {
+#ifdef _XBOX1
+      d3dr->SetFlickerFilter(g_extern.console.screen.flicker_filter_index);
+      d3dr->SetSoftDisplayFilter(g_extern.lifecycle_state & (1ULL << MODE_VIDEO_SOFT_FILTER_ENABLE));
+#endif
+      xdk_d3d_calculate_rect(d3d, d3d->win_width, d3d->win_height, d3d->video_info.force_aspect, g_extern.system.aspect_ratio);
+      d3d->should_resize = false;
+   }
+
+   blit_to_texture(d3d, frame, width, height, pitch);
+   set_vertices(d3d, 1, width, height);
+
+   // Insert black frame first, so we can screenshot, etc.
+   if (g_settings.video.black_frame_insertion)
+   {
+      d3dr->Present(NULL, NULL, NULL, NULL);
+      d3dr->Clear(0, 0, D3DCLEAR_TARGET, 0, 1, 0);
+   }
+
+   render_pass(d3d, 1);
 
 #ifdef HAVE_MENU
    if (d3d && d3d->rgui_texture_enable)
@@ -841,7 +835,15 @@ static void xdk_d3d_set_nonblock_state(void *data, bool state)
 static bool xdk_d3d_alive(void *data)
 {
    xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data;
-   check_window(d3d);
+   bool quit, resize;
+
+   d3d->ctx_driver->check_window(&quit,
+         &resize, NULL, NULL, g_extern.frame_count);
+
+   if (quit)
+      d3d->quitting = true;
+   else if (resize)
+      d3d->should_resize = true;
    return !d3d->quitting;
 }