void GSDevice9::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel) { if(cb->WH.z > 0 && cb->WH.w > 0 && (sel.wms == 3 || sel.wmt == 3)) { GSVector4i size(cb->WH); if(sel.wms == 3) { if(GSTexture* t = CreateMskFix(size.z, cb->MskFix.x, cb->MskFix.z)) { m_dev->SetTexture(3, *(GSTexture9*)t); } } if(sel.wmt == 3) { if(GSTexture* t = CreateMskFix(size.w, cb->MskFix.y, cb->MskFix.w)) { m_dev->SetTexture(4, *(GSTexture9*)t); } } } hash_map<uint64, CComPtr<IDirect3DPixelShader9> >::const_iterator i = m_ps.find(sel); if(i == m_ps.end()) { string str[18]; str[0] = format("%d", sel.fst); str[1] = format("%d", sel.wms); str[2] = format("%d", sel.wmt); str[3] = format("%d", sel.fmt); str[4] = format("%d", sel.aem); str[5] = format("%d", sel.tfx); str[6] = format("%d", sel.tcc); str[7] = format("%d", sel.atst); str[8] = format("%d", sel.fog); str[9] = format("%d", sel.clr1); str[10] = format("%d", sel.rt); str[11] = format("%d", sel.ltf); str[12] = format("%d", sel.colclip); str[13] = format("%d", sel.date); str[14] = format("%d", sel.spritehack); str[15] = format("%d", sel.tcoffsethack); str[16] = format("%d", sel.point_sampler); str[17] = format("%d", sel.fmt >> 2); D3D_SHADER_MACRO macro[] = { {"PS_FST", str[0].c_str()}, {"PS_WMS", str[1].c_str()}, {"PS_WMT", str[2].c_str()}, {"PS_FMT", str[3].c_str()}, {"PS_AEM", str[4].c_str()}, {"PS_TFX", str[5].c_str()}, {"PS_TCC", str[6].c_str()}, {"PS_ATST", str[7].c_str()}, {"PS_FOG", str[8].c_str()}, {"PS_CLR1", str[9].c_str()}, {"PS_RT", str[10].c_str()}, {"PS_LTF", str[11].c_str()}, {"PS_COLCLIP", str[12].c_str()}, {"PS_DATE", str[13].c_str()}, {"PS_SPRITEHACK", str[14].c_str()}, {"PS_TCOFFSETHACK", str[15].c_str()}, {"PS_POINT_SAMPLER", str[16].c_str()}, {"PS_PAL_FMT", str[17].c_str()}, {NULL, NULL}, }; CComPtr<IDirect3DPixelShader9> ps; std::vector<char> shader; theApp.LoadResource(IDR_TFX_FX, shader); CompileShader(shader.data(), shader.size(), "tfx.fx", "ps_main", macro, &ps); m_ps[sel] = ps; i = m_ps.find(sel); }
void GSDevice9::SetupPS(PSSelector sel, const PSConstantBuffer* cb, PSSamplerSelector ssel) { if(cb->WH.z > 0 && cb->WH.w > 0 && (sel.wms == 3 || sel.wmt == 3)) { GSVector4i size(cb->WH); if(sel.wms == 3) { if(GSTexture* t = CreateMskFix(size.z, cb->MskFix.x, cb->MskFix.z)) { m_dev->SetTexture(3, *(GSTexture9*)t); } } if(sel.wmt == 3) { if(GSTexture* t = CreateMskFix(size.w, cb->MskFix.y, cb->MskFix.w)) { m_dev->SetTexture(4, *(GSTexture9*)t); } } } hash_map<uint32, CComPtr<IDirect3DPixelShader9> >::const_iterator i = m_ps.find(sel); if(i == m_ps.end()) { string str[17]; str[0] = format("%d", sel.fst); str[1] = format("%d", sel.wms); str[2] = format("%d", sel.wmt); str[3] = format("%d", sel.fmt); str[4] = format("%d", sel.aem); str[5] = format("%d", sel.tfx); str[6] = format("%d", sel.tcc); str[7] = format("%d", sel.atst); str[8] = format("%d", sel.fog); str[9] = format("%d", sel.clr1); str[10] = format("%d", sel.rt); str[11] = format("%d", sel.ltf); str[12] = format("%d", sel.colclip); str[13] = format("%d", sel.date); str[14] = format("%d", sel.spritehack); str[15] = format("%d", sel.tcoffsethack); str[16] = format("%d", sel.point_sampler); D3DXMACRO macro[] = { {"PS_FST", str[0].c_str()}, {"PS_WMS", str[1].c_str()}, {"PS_WMT", str[2].c_str()}, {"PS_FMT", str[3].c_str()}, {"PS_AEM", str[4].c_str()}, {"PS_TFX", str[5].c_str()}, {"PS_TCC", str[6].c_str()}, {"PS_ATST", str[7].c_str()}, {"PS_FOG", str[8].c_str()}, {"PS_CLR1", str[9].c_str()}, {"PS_RT", str[10].c_str()}, {"PS_LTF", str[11].c_str()}, {"PS_COLCLIP", str[12].c_str()}, {"PS_DATE", str[13].c_str()}, {"PS_SPRITEHACK", str[14].c_str()}, {"PS_TCOFFSETHACK", str[15].c_str()}, {"PS_POINT_SAMPLER", str[16].c_str()}, {NULL, NULL}, }; CComPtr<IDirect3DPixelShader9> ps; CompileShader(IDR_TFX_FX, "ps_main", macro, &ps); m_ps[sel] = ps; i = m_ps.find(sel); } PSSetShader(i->second, (const float*)cb, sizeof(*cb) / sizeof(GSVector4)); Direct3DSamplerState9* ss = NULL; if(sel.tfx != 4) { if(!(sel.fmt < 3 && sel.wms < 3 && sel.wmt < 3)) { ssel.ltf = 0; } hash_map<uint32, Direct3DSamplerState9* >::const_iterator i = m_ps_ss.find(ssel); if(i != m_ps_ss.end()) { ss = i->second; } else { ss = new Direct3DSamplerState9(); memset(ss, 0, sizeof(*ss)); ss->Anisotropic[0] = !!theApp.GetConfig("AnisotropicFiltering", 0) && !theApp.GetConfig("paltex", 0) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR; ss->Anisotropic[1] = !!theApp.GetConfig("AnisotropicFiltering", 0) && !theApp.GetConfig("paltex", 0) ? D3DTEXF_ANISOTROPIC : D3DTEXF_POINT; ss->FilterMin[0] = ssel.ltf ? ss->Anisotropic[0] : D3DTEXF_POINT; ss->FilterMag[0] = ssel.ltf ? ss->Anisotropic[0] : D3DTEXF_POINT; ss->FilterMip[0] = ssel.ltf ? ss->Anisotropic[0] : D3DTEXF_POINT; ss->FilterMin[1] = ss->Anisotropic[1]; ss->FilterMag[1] = ss->Anisotropic[1]; ss->FilterMip[1] = ss->Anisotropic[1]; ss->AddressU = ssel.tau ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP; ss->AddressV = ssel.tav ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP; ss->MaxAnisotropy = theApp.GetConfig("MaxAnisotropy", 0); ss->MaxLOD = FLT_MAX; m_ps_ss[ssel] = ss; } } PSSetSamplerState(ss); }