diff --git a/plugins/GSdx/GSRendererDX.cpp b/plugins/GSdx/GSRendererDX.cpp index 51589e7313..48c90d2d93 100644 --- a/plugins/GSdx/GSRendererDX.cpp +++ b/plugins/GSdx/GSRendererDX.cpp @@ -314,6 +314,9 @@ void GSRendererDX::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sourc } } + // Upscaling hack to avoid various line/grid issues + MergeSprite(tex); + if(DATE) { if(dev->HasStencil()) diff --git a/plugins/GSdx/GSRendererHW.cpp b/plugins/GSdx/GSRendererHW.cpp index f51bb6dca0..74ac3c5f75 100644 --- a/plugins/GSdx/GSRendererHW.cpp +++ b/plugins/GSdx/GSRendererHW.cpp @@ -41,11 +41,13 @@ GSRendererHW::GSRendererHW(GSTextureCache* tc) m_userhacks_round_sprite_offset = theApp.GetConfigI("UserHacks_round_sprite_offset"); m_userhacks_disable_gs_mem_clear = theApp.GetConfigB("UserHacks_DisableGsMemClear"); m_userHacks_HPO = theApp.GetConfigI("UserHacks_HalfPixelOffset"); + m_userHacks_merge_sprite = theApp.GetConfigB("UserHacks_merge_pp_sprite"); } else { m_userhacks_align_sprite_X = false; m_userhacks_round_sprite_offset = 0; m_userhacks_disable_gs_mem_clear = false; m_userHacks_HPO = 0; + m_userHacks_merge_sprite = false; } if (!m_upscale_multiplier) { //Custom Resolution @@ -403,6 +405,58 @@ GSVector4 GSRendererHW::RealignTargetTextureCoordinate(const GSTextureCache::Sou return half_offset; } +void GSRendererHW::MergeSprite(GSTextureCache::Source* tex) +{ + // Upscaling hack to avoid various line/grid issues + if (m_userHacks_merge_sprite && tex && tex->m_target && (m_vt.m_primclass == GS_SPRITE_CLASS)) { + if (PRIM->FST && GSLocalMemory::m_psm[tex->m_TEX0.PSM].fmt < 2 && ((m_vt.m_eq.value & 0xCFFFF) == 0xCFFFF)) { + + // Ideally the hack ought to be enabled in a true paving mode only. I don't know how to do it accurately + // neither in a fast way. So instead let's just take the hypothesis that all sprites must have the same + // size. + // Tested on Tekken 5. + GSVertex* v = &m_vertex.buff[0]; + bool is_paving = true; + // SSE optimization: shuffle m[1] to have (4*32 bits) X, Y, U, V + int first_dpX = v[1].XYZ.X - v[0].XYZ.X; + int first_dpU = v[1].U - v[0].U; + for (size_t i = 0; i < m_vertex.next; i += 2) { + int dpX = v[i + 1].XYZ.X - v[i].XYZ.X; + int dpU = v[i + 1].U - v[i].U; + if (dpX != first_dpX || dpU != first_dpU) { + is_paving = false; + break; + } + } + +#if 0 + GSVector4 delta_p = m_vt.m_max.p - m_vt.m_min.p; + GSVector4 delta_t = m_vt.m_max.t - m_vt.m_min.t; + bool is_blit = PrimitiveOverlap() == PRIM_OVERLAP_NO; + GL_INS("PP SAMPLER: Dp %f %f Dt %f %f. Is blit %d, is paving %d, count %d", delta_p.x, delta_p.y, delta_t.x, delta_t.y, is_blit, is_paving, m_vertex.tail); +#endif + + if (is_paving) { + // Replace all sprite with a single fullscreen sprite. + GSVertex* s = &m_vertex.buff[0]; + + s[0].XYZ.X = static_cast((16.0f * m_vt.m_min.p.x) + m_context->XYOFFSET.OFX); + s[1].XYZ.X = static_cast((16.0f * m_vt.m_max.p.x) + m_context->XYOFFSET.OFX); + s[0].XYZ.Y = static_cast((16.0f * m_vt.m_min.p.y) + m_context->XYOFFSET.OFY); + s[1].XYZ.Y = static_cast((16.0f * m_vt.m_max.p.y) + m_context->XYOFFSET.OFY); + + s[0].U = static_cast(16.0f * m_vt.m_min.t.x); + s[0].V = static_cast(16.0f * m_vt.m_min.t.y); + s[1].U = static_cast(16.0f * m_vt.m_max.t.x); + s[1].V = static_cast(16.0f * m_vt.m_max.t.y); + + m_vertex.head = m_vertex.tail = m_vertex.next = 2; + m_index.tail = 2; + } + } + } +} + void GSRendererHW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) { // printf("[%d] InvalidateVideoMem %d,%d - %d,%d %05x (%d)\n", (int)m_perfmon.GetFrame(), r.left, r.top, r.right, r.bottom, (int)BITBLTBUF.DBP, (int)BITBLTBUF.DPSM); diff --git a/plugins/GSdx/GSRendererHW.h b/plugins/GSdx/GSRendererHW.h index 03053bbdcd..377dfb1683 100644 --- a/plugins/GSdx/GSRendererHW.h +++ b/plugins/GSdx/GSRendererHW.h @@ -40,6 +40,7 @@ private: bool m_large_framebuffer; bool m_userhacks_align_sprite_X; bool m_userhacks_disable_gs_mem_clear; + bool m_userHacks_merge_sprite; #pragma region hacks @@ -52,7 +53,6 @@ private: void OI_GsMemClear(); // always on void OI_DoubleHalfClear(GSTexture* rt, GSTexture* ds); // always on - bool OI_DoubleHalfClear_Vertical(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); bool OI_FFXII(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); bool OI_FFX(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); bool OI_MetalSlug6(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); @@ -67,7 +67,6 @@ private: bool OI_SuperManReturns(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); bool OI_ArTonelico2(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); bool OI_ItadakiStreet(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); - bool OI_FFVIIDoC(GSTexture* rt, GSTexture* ds, GSTextureCache::Source* t); void OO_DBZBT2(); void OO_MajokkoALaMode2(); @@ -166,8 +165,9 @@ public: int GetUpscaleMultiplier(); GSVector2i GetCustomResolution(); void SetScaling(); - GSVector4 RealignTargetTextureCoordinate(const GSTextureCache::Source* tex); void Lines2Sprites(); + GSVector4 RealignTargetTextureCoordinate(const GSTextureCache::Source* tex); + void MergeSprite(GSTextureCache::Source* tex); void Reset(); void VSync(int field); diff --git a/plugins/GSdx/GSRendererOGL.cpp b/plugins/GSdx/GSRendererOGL.cpp index fc3095b1df..6c05186182 100644 --- a/plugins/GSdx/GSRendererOGL.cpp +++ b/plugins/GSdx/GSRendererOGL.cpp @@ -37,7 +37,6 @@ GSRendererOGL::GSRendererOGL() UserHacks_TCOffset = theApp.GetConfigI("UserHacks_TCOffset"); UserHacks_TCO_x = (UserHacks_TCOffset & 0xFFFF) / -1000.0f; UserHacks_TCO_y = ((UserHacks_TCOffset >> 16) & 0xFFFF) / -1000.0f; - UserHacks_merge_sprite = theApp.GetConfigB("UserHacks_merge_pp_sprite"); UserHacks_unscale_pt_ln = theApp.GetConfigB("UserHacks_unscale_point_line"); UserHacks_HPO = theApp.GetConfigI("UserHacks_HalfPixelOffset"); UserHacks_tri_filter = static_cast(theApp.GetConfigI("UserHacks_TriFilter")); @@ -49,7 +48,6 @@ GSRendererOGL::GSRendererOGL() UserHacks_TCOffset = 0; UserHacks_TCO_x = 0; UserHacks_TCO_y = 0; - UserHacks_merge_sprite = false; UserHacks_unscale_pt_ln = false; UserHacks_HPO = 0; UserHacks_tri_filter = TriFiltering::None; @@ -1093,53 +1091,7 @@ void GSRendererOGL::DrawPrims(GSTexture* rt, GSTexture* ds, GSTextureCache::Sour EmulateChannelShuffle(&rt, tex); // Upscaling hack to avoid various line/grid issues - if (UserHacks_merge_sprite && tex && tex->m_target && (m_vt.m_primclass == GS_SPRITE_CLASS)) { - if (PRIM->FST && GSLocalMemory::m_psm[tex->m_TEX0.PSM].fmt < 2 && ((m_vt.m_eq.value & 0xCFFFF) == 0xCFFFF)) { - - // Ideally the hack ought to be enabled in a true paving mode only. I don't know how to do it accurately - // neither in a fast way. So instead let's just take the hypothesis that all sprites must have the same - // size. - // Tested on Tekken 5. - GSVertex* v = &m_vertex.buff[0]; - bool is_paving = true; - // SSE optimization: shuffle m[1] to have (4*32 bits) X, Y, U, V - int first_dpX = v[1].XYZ.X - v[0].XYZ.X; - int first_dpU = v[1].U - v[0].U; - for (size_t i = 0; i < m_vertex.next; i += 2) { - int dpX = v[i+1].XYZ.X - v[i].XYZ.X; - int dpU = v[i+1].U - v[i].U; - if (dpX != first_dpX || dpU != first_dpU) { - is_paving = false; - break; - } - } - -#if 0 - GSVector4 delta_p = m_vt.m_max.p - m_vt.m_min.p; - GSVector4 delta_t = m_vt.m_max.t - m_vt.m_min.t; - bool is_blit = PrimitiveOverlap() == PRIM_OVERLAP_NO; - GL_INS("PP SAMPLER: Dp %f %f Dt %f %f. Is blit %d, is paving %d, count %d", delta_p.x, delta_p.y, delta_t.x, delta_t.y, is_blit, is_paving, m_vertex.tail); -#endif - - if (is_paving) { - // Replace all sprite with a single fullscreen sprite. - GSVertex* s = &m_vertex.buff[0]; - - s[0].XYZ.X = static_cast((16.0f * m_vt.m_min.p.x) + m_context->XYOFFSET.OFX); - s[1].XYZ.X = static_cast((16.0f * m_vt.m_max.p.x) + m_context->XYOFFSET.OFX); - s[0].XYZ.Y = static_cast((16.0f * m_vt.m_min.p.y) + m_context->XYOFFSET.OFY); - s[1].XYZ.Y = static_cast((16.0f * m_vt.m_max.p.y) + m_context->XYOFFSET.OFY); - - s[0].U = static_cast(16.0f * m_vt.m_min.t.x); - s[0].V = static_cast(16.0f * m_vt.m_min.t.y); - s[1].U = static_cast(16.0f * m_vt.m_max.t.x); - s[1].V = static_cast(16.0f * m_vt.m_max.t.y); - - m_vertex.head = m_vertex.tail = m_vertex.next = 2; - m_index.tail = 2; - } - } - } + MergeSprite(tex); // Always check if primitive overlap. The function will return PRIM_OVERLAP_UNKNOW for non sprite primitive m_prim_overlap = PrimitiveOverlap(); diff --git a/plugins/GSdx/GSRendererOGL.h b/plugins/GSdx/GSRendererOGL.h index 39b2c109d0..96b1398ef8 100644 --- a/plugins/GSdx/GSRendererOGL.h +++ b/plugins/GSdx/GSRendererOGL.h @@ -52,7 +52,6 @@ class GSRendererOGL final : public GSRendererHW unsigned int UserHacks_TCOffset; float UserHacks_TCO_x, UserHacks_TCO_y; - bool UserHacks_merge_sprite; bool UserHacks_unscale_pt_ln; int UserHacks_HPO; TriFiltering UserHacks_tri_filter; diff --git a/plugins/GSdx/GSSetting.cpp b/plugins/GSdx/GSSetting.cpp index e882e1c6ed..3f09d6288b 100644 --- a/plugins/GSdx/GSSetting.cpp +++ b/plugins/GSdx/GSSetting.cpp @@ -147,6 +147,9 @@ const char* dialog_message(int ID, bool* updateText) { case IDC_MEMORY_WRAPPING: return "Emulates GS memory wrapping accurately. This fixes issues where part of the image is cut-off by block shaped sections such as the FMVs in Wallace & Gromit: The Curse of the Were-Rabbit and Thrillville.\n" "Note: This hack can have a small impact on performance."; + case IDC_MERGE_PP_SPRITE: + return "Replaces post-processing multiple paving sprites by a single fat sprite. It reduces various upscaling lines.\n" + "Note: This hack is a work in progress."; case IDC_GEOMETRY_SHADER_OVERRIDE: return "Allows the GPU instead of just the CPU to transform lines into sprites. This reduces CPU load and bandwidth requirement, but it is heavier on the GPU.\n" "Automatic detection is recommended.\nNote: This option is only supported by GPUs which support at least Direct3D 10."; diff --git a/plugins/GSdx/GSSetting.h b/plugins/GSdx/GSSetting.h index eaa7283298..bd68a687ec 100644 --- a/plugins/GSdx/GSSetting.h +++ b/plugins/GSdx/GSSetting.h @@ -80,6 +80,7 @@ enum { IDC_AUTO_FLUSH, IDC_UNSCALE_POINT_LINE, IDC_MEMORY_WRAPPING, + IDC_MERGE_PP_SPRITE, IDC_GEOMETRY_SHADER_OVERRIDE, IDC_IMAGE_LOAD_STORE, IDC_OSD_LOG, diff --git a/plugins/GSdx/GSSettingsDlg.cpp b/plugins/GSdx/GSSettingsDlg.cpp index 82ed512fbe..1e2f4a09c8 100644 --- a/plugins/GSdx/GSSettingsDlg.cpp +++ b/plugins/GSdx/GSSettingsDlg.cpp @@ -693,6 +693,7 @@ void GSHacksDlg::OnInit() CheckDlgButton(m_hWnd, IDC_AUTO_FLUSH, theApp.GetConfigB("UserHacks_AutoFlush")); CheckDlgButton(m_hWnd, IDC_UNSCALE_POINT_LINE, theApp.GetConfigB("UserHacks_unscale_point_line")); CheckDlgButton(m_hWnd, IDC_MEMORY_WRAPPING, theApp.GetConfigB("wrap_gs_mem")); + CheckDlgButton(m_hWnd, IDC_MERGE_PP_SPRITE, theApp.GetConfigB("UserHacks_merge_pp_sprite")); ComboBoxInit(IDC_TRI_FILTER, theApp.m_gs_trifilter, theApp.GetConfigI("UserHacks_TriFilter")); ComboBoxInit(IDC_OFFSETHACK, theApp.m_gs_offset_hack, theApp.GetConfigI("UserHacks_HalfPixelOffset")); @@ -731,6 +732,7 @@ void GSHacksDlg::OnInit() EnableWindow(GetDlgItem(m_hWnd, IDC_ROUND_SPRITE_TEXT), !native); EnableWindow(GetDlgItem(m_hWnd, IDC_OFFSETHACK_TEXT), !native); EnableWindow(GetDlgItem(m_hWnd, IDC_OFFSETHACK), !native); + EnableWindow(GetDlgItem(m_hWnd, IDC_MERGE_PP_SPRITE), !native); // OpenGL Very Advanced Custom Settings: EnableWindow(GetDlgItem(m_hWnd, IDC_GEOMETRY_SHADER_OVERRIDE), ogl); @@ -759,6 +761,7 @@ void GSHacksDlg::OnInit() AddTooltip(IDC_UNSCALE_POINT_LINE); AddTooltip(IDC_MEMORY_WRAPPING); AddTooltip(IDC_TRI_FILTER); + AddTooltip(IDC_MERGE_PP_SPRITE); AddTooltip(IDC_GEOMETRY_SHADER_OVERRIDE); AddTooltip(IDC_IMAGE_LOAD_STORE); } @@ -815,6 +818,7 @@ bool GSHacksDlg::OnMessage(UINT message, WPARAM wParam, LPARAM lParam) theApp.SetConfig("UserHacks_AutoFlush", (int)IsDlgButtonChecked(m_hWnd, IDC_AUTO_FLUSH)); theApp.SetConfig("UserHacks_unscale_point_line", (int)IsDlgButtonChecked(m_hWnd, IDC_UNSCALE_POINT_LINE)); theApp.SetConfig("wrap_gs_mem", (int)IsDlgButtonChecked(m_hWnd, IDC_MEMORY_WRAPPING)); + theApp.SetConfig("UserHacks_merge_pp_sprite", (int)IsDlgButtonChecked(m_hWnd, IDC_MERGE_PP_SPRITE)); unsigned int TCOFFSET = SendMessage(GetDlgItem(m_hWnd, IDC_TCOFFSETX), UDM_GETPOS, 0, 0) & 0xFFFF; TCOFFSET |= (SendMessage(GetDlgItem(m_hWnd, IDC_TCOFFSETY), UDM_GETPOS, 0, 0) & 0xFFFF) << 16; diff --git a/plugins/GSdx/GSdx.rc b/plugins/GSdx/GSdx.rc index 4283a09f16..d8c64c4941 100644 --- a/plugins/GSdx/GSdx.rc +++ b/plugins/GSdx/GSdx.rc @@ -111,13 +111,13 @@ IDB_PSX_NULL BITMAP "res\\psx-logo-null.bmp" // Dialog // -IDD_HACKS DIALOGEX 0, 0, 210, 286 +IDD_HACKS DIALOGEX 0, 0, 210, 299 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Advanced Settings & Hacks" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN // Hacks settings: - GROUPBOX "USE AT YOUR OWN RISK!",IDC_STATIC,7,7,196,202,0,WS_EX_TRANSPARENT + GROUPBOX "USE AT YOUR OWN RISK!",IDC_STATIC,7,7,196,215,0,WS_EX_TRANSPARENT CONTROL "Align Sprite",IDC_ALIGN_SPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,19,58,8 CONTROL "Wild Arms Offset",IDC_WILDHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,19,70,8 CONTROL "Fast Texture Invalidation",IDC_FAST_TC_INV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,32,92,8 @@ -125,37 +125,38 @@ BEGIN CONTROL "Auto Flush",IDC_AUTO_FLUSH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,45,55,8 CONTROL "Memory Wrapping",IDC_MEMORY_WRAPPING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,45,75,8 CONTROL "Unscale Point and Line",IDC_UNSCALE_POINT_LINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,58,90,8 - CONTROL "Disable Depth Emulation",IDC_TC_DEPTH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,58,92,8 + CONTROL "Merge Sprite",IDC_MERGE_PP_SPRITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,58,90,8 CONTROL "Alpha",IDC_ALPHAHACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,71,34,8 CONTROL "Alpha Stencil",IDC_ALPHASTENCIL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,71,57,8 - RTEXT "MSAA:",IDC_MSAA_TEXT,54,86,22,8 - COMBOBOX IDC_MSAACB,80,83,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Trilinear Filtering:",IDC_TRI_FILTER_TEXT,16,101,60,8 - COMBOBOX IDC_TRI_FILTER,80,98,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Half-pixel Offset:",IDC_OFFSETHACK_TEXT,14,116,62,8 - COMBOBOX IDC_OFFSETHACK,80,113,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Sprite:",IDC_SPRITEHACK_TEXT,54,131,22,8 - COMBOBOX IDC_SPRITEHACK,80,128,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Round Sprite:",IDC_ROUND_SPRITE_TEXT,31,146,45,8 - COMBOBOX IDC_ROUND_SPRITE,80,143,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Skipdraw:",IDC_STATIC,44,161,32,8 - EDITTEXT IDC_SKIPDRAWHACKEDIT,80,158,116,14,ES_RIGHT | ES_AUTOHSCROLL - CONTROL "",IDC_SKIPDRAWHACK,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,105,156,11,14 - RTEXT "TC Offset X:",IDC_STATIC,32,176,44,8 - EDITTEXT IDC_TCOFFSETX2,80,173,116,14,ES_RIGHT | ES_AUTOHSCROLL - CONTROL "",IDC_TCOFFSETX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,127,171,11,14 - RTEXT "TC Offset Y:",IDC_STATIC,32,191,44,8 - EDITTEXT IDC_TCOFFSETY2,80,188,116,14,ES_RIGHT | ES_AUTOHSCROLL - CONTROL "",IDC_TCOFFSETY,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,127,186,11,14 + CONTROL "Disable Depth Emulation",IDC_TC_DEPTH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,84,92,8 + RTEXT "MSAA:",IDC_MSAA_TEXT,54,99,22,8 + COMBOBOX IDC_MSAACB,80,96,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Trilinear Filtering:",IDC_TRI_FILTER_TEXT,16,114,60,8 + COMBOBOX IDC_TRI_FILTER,80,111,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Half-pixel Offset:",IDC_OFFSETHACK_TEXT,14,129,62,8 + COMBOBOX IDC_OFFSETHACK,80,126,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Sprite:",IDC_SPRITEHACK_TEXT,54,144,22,8 + COMBOBOX IDC_SPRITEHACK,80,141,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Round Sprite:",IDC_ROUND_SPRITE_TEXT,31,159,45,8 + COMBOBOX IDC_ROUND_SPRITE,80,156,116,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Skipdraw:",IDC_STATIC,44,174,32,8 + EDITTEXT IDC_SKIPDRAWHACKEDIT,80,171,116,14,ES_RIGHT | ES_AUTOHSCROLL + CONTROL "",IDC_SKIPDRAWHACK,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,105,169,11,14 + RTEXT "TC Offset X:",IDC_STATIC,32,189,44,8 + EDITTEXT IDC_TCOFFSETX2,80,186,116,14,ES_RIGHT | ES_AUTOHSCROLL + CONTROL "",IDC_TCOFFSETX,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,127,184,11,14 + RTEXT "TC Offset Y:",IDC_STATIC,32,204,44,8 + EDITTEXT IDC_TCOFFSETY2,80,201,116,14,ES_RIGHT | ES_AUTOHSCROLL + CONTROL "",IDC_TCOFFSETY,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,127,199,11,14 // OpenGL Advanced Settings: - GROUPBOX "OpenGL Very Advanced Custom Settings",IDC_STATIC,7,212,196,48,0,WS_EX_TRANSPARENT - RTEXT "Geometry Shader:",IDC_GEOMETRY_SHADER_TEXT,14,227,62,8 - COMBOBOX IDC_GEOMETRY_SHADER_OVERRIDE,80,224,97,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - RTEXT "Image Load Store:",IDC_IMAGE_LOAD_STORE_TEXT,14,242,62,8 - COMBOBOX IDC_IMAGE_LOAD_STORE,80,239,97,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "OpenGL Very Advanced Custom Settings",IDC_STATIC,7,225,196,48,0,WS_EX_TRANSPARENT + RTEXT "Geometry Shader:",IDC_GEOMETRY_SHADER_TEXT,14,240,62,8 + COMBOBOX IDC_GEOMETRY_SHADER_OVERRIDE,80,237,97,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Image Load Store:",IDC_IMAGE_LOAD_STORE_TEXT,14,255,62,8 + COMBOBOX IDC_IMAGE_LOAD_STORE,80,252,97,63,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP // General Settings: - DEFPUSHBUTTON "OK",IDOK,52,265,50,14 - DEFPUSHBUTTON "Cancel",IDCANCEL,108,265,50,14 + DEFPUSHBUTTON "OK",IDOK,52,278,50,14 + DEFPUSHBUTTON "Cancel",IDCANCEL,108,278,50,14 END IDD_SHADER DIALOGEX 0, 0, 248, 230 diff --git a/plugins/GSdx/resource.h b/plugins/GSdx/resource.h index 04e3f66f49..5c1a89b481 100644 --- a/plugins/GSdx/resource.h +++ b/plugins/GSdx/resource.h @@ -102,6 +102,7 @@ #define IDC_TRI_FILTER 2123 #define IDC_TRI_FILTER_TEXT 2124 #define IDC_UNSCALE_POINT_LINE 2125 +#define IDC_MERGE_PP_SPRITE 2126 // Shader: #define IDC_SHADEBOOST 2140 #define IDC_FXAA 2141