/[pcsx2_0.9.7]/trunk/plugins/zzogl-pg/opengl/ZZoglFlush.cpp
ViewVC logotype

Diff of /trunk/plugins/zzogl-pg/opengl/ZZoglFlush.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 133 by william, Fri Sep 10 12:49:21 2010 UTC revision 163 by william, Mon Sep 13 15:40:50 2010 UTC
# Line 25  Line 25 
25  #include "Mem.h"  #include "Mem.h"
26  #include "zerogs.h"  #include "zerogs.h"
27  #include "targets.h"  #include "targets.h"
28    #include "ZZoglFlushHack.h"
29    #include "ZZoglShaders.h"
30    
31  using namespace ZeroGS;  using namespace ZeroGS;
32    
# Line 118  void Draw(const VB& curvb) Line 120  void Draw(const VB& curvb)
120  //------------------ variables  //------------------ variables
121    
122  extern int g_nDepthBias;  extern int g_nDepthBias;
123  extern float g_fBlockMult;  extern float g_fBlockMult; // used for old cards, that do not support Alpha-32float textures. We store block data in u16 and use it.
124  bool g_bUpdateStencil = 1;  bool g_bUpdateStencil = 1;
125  //u32 g_SaveFrameNum = 0;                                                                       // ZZ  //u32 g_SaveFrameNum = 0;                                                                       // ZZ
126    
127  int GPU_TEXWIDTH = 512;  extern ZZshProgram g_psprog;                                                    // 2 -- ZZ
 float g_fiGPU_TEXWIDTH = 1 / 512.0f;  
   
 extern CGprogram g_psprog;                                                      // 2 -- ZZ  
128    
129  // local alpha blending settings  // local alpha blending settings
130  static GLenum s_rgbeq, s_alphaeq; // set by zgsBlendEquationSeparateEXT                 // ZZ  static GLenum s_rgbeq, s_alphaeq; // set by zgsBlendEquationSeparateEXT                 // ZZ
# Line 200  namespace ZeroGS Line 199  namespace ZeroGS
199  VB vb[2];  VB vb[2];
200  float fiTexWidth[2], fiTexHeight[2];    // current tex width and height  float fiTexWidth[2], fiTexHeight[2];    // current tex width and height
201    
202  u8 s_AAx = 0, s_AAy = 0; // if AAy is set, then AAx has to be set  //u8 s_AAx = 0, s_AAy = 0; // if AAy is set, then AAx has to be set
203  u8 s_AAz = 0, s_AAw = 0; // if AAy is set, then AAx has to be set  Point AA = {0,0};
204    
205  int icurctx = -1;  int icurctx = -1;
206    
# Line 218  void ResetAlphaVariables(); Line 217  void ResetAlphaVariables();
217    
218  inline void SetAlphaTestInt(pixTest curtest);  inline void SetAlphaTestInt(pixTest curtest);
219    
220  inline void RenderAlphaTest(const VB& curvb, CGparameter sOneColor);  inline void RenderAlphaTest(const VB& curvb, ZZshParameter sOneColor);
221  inline void RenderStencil(const VB& curvb, u32 dwUsingSpecialTesting);  inline void RenderStencil(const VB& curvb, u32 dwUsingSpecialTesting);
222  inline void ProcessStencil(const VB& curvb);  inline void ProcessStencil(const VB& curvb);
223  inline void RenderFBA(const VB& curvb, CGparameter sOneColor);  inline void RenderFBA(const VB& curvb, ZZshParameter sOneColor);
224  inline void ProcessFBA(const VB& curvb, CGparameter sOneColor);                 // zz  inline void ProcessFBA(const VB& curvb, ZZshParameter sOneColor);                       // zz
225    
226    
227  }  }
# Line 248  inline void SetAlphaTest(const pixTest& Line 247  inline void SetAlphaTest(const pixTest&
247                  glAlphaFunc(g_dwAlphaCmp[curtest.atst], AlphaReferedValue(curtest.aref));                  glAlphaFunc(g_dwAlphaCmp[curtest.atst], AlphaReferedValue(curtest.aref));
248          }          }
249  }  }
250    
251    // Return, if tcc, aem or psm mode told us, than Alpha test should be used
252    // if tcc == 0 than no alpha used, aem used for alpha expanding and I am not sure
253    // that it's correct, psm -- color mode,
254    inline bool IsAlphaTestExpansion(tex0Info tex0)
255    {
256            return (tex0.tcc && gs.texa.aem && PSMT_ALPHAEXP(PIXEL_STORAGE_FORMAT(tex0)));
257    }
258    
259  // Switch wireframe rendering off for first flush, so it's draw few solid primitives  // Switch wireframe rendering off for first flush, so it's draw few solid primitives
260  inline void SwitchWireframeOff()  inline void SwitchWireframeOff()
# Line 375  inline void FlushUpdateEffect() Line 382  inline void FlushUpdateEffect()
382  // Check, maybe we cold skip flush  // Check, maybe we cold skip flush
383  inline bool IsFlushNoNeed(VB& curvb, const pixTest& curtest)  inline bool IsFlushNoNeed(VB& curvb, const pixTest& curtest)
384  {  {
385          if (curvb.nCount == 0 || (curtest.zte && curtest.ztst == 0))          if (curvb.nCount == 0 || (curtest.zte && curtest.ztst == 0) || IsBadFrame(curvb))
386          {          {
387                  curvb.nCount = 0;                  curvb.nCount = 0;
388                  return true;                  return true;
# Line 852  inline Vector FlushSetPageOffset(FRAGMEN Line 859  inline Vector FlushSetPageOffset(FRAGMEN
859          // zoe2          // zoe2
860          if (PSMT_ISZTEX(ptextarg->psm)) vpageoffset.w = -1.0f;          if (PSMT_ISZTEX(ptextarg->psm)) vpageoffset.w = -1.0f;
861    
862          ZZcgSetParameter4fv(pfragment->fPageOffset, vpageoffset, "g_fPageOffset");          ZZshSetParameter4fv(pfragment->fPageOffset, vpageoffset, "g_fPageOffset");
863    
864          return vpageoffset;          return vpageoffset;
865  }  }
# Line 870  inline Vector FlushSetTexOffset(FRAGMENT Line 877  inline Vector FlushSetTexOffset(FRAGMENT
877                  v.y = 16.0f / (float)curvb.tex0.th;                  v.y = 16.0f / (float)curvb.tex0.th;
878                  v.z = 0.5f * v.x;                  v.z = 0.5f * v.x;
879                  v.w = 0.5f * v.y;                  v.w = 0.5f * v.y;
880                  ZZcgSetParameter4fv(pfragment->fTexOffset, v, "g_fTexOffset");                  ZZshSetParameter4fv(pfragment->fTexOffset, v, "g_fTexOffset");
881          }          }
882          else if (shadertype == 4)          else if (shadertype == 4)
883          {          {
# Line 879  inline Vector FlushSetTexOffset(FRAGMENT Line 886  inline Vector FlushSetTexOffset(FRAGMENT
886                  v.y = 16.0f / (float)ptextarg->fbh;                  v.y = 16.0f / (float)ptextarg->fbh;
887                  v.z = -1;                  v.z = -1;
888                  v.w = 8.0f / (float)ptextarg->fbh;                  v.w = 8.0f / (float)ptextarg->fbh;
889                  ZZcgSetParameter4fv(pfragment->fTexOffset, v, "g_fTexOffset");                  ZZshSetParameter4fv(pfragment->fTexOffset, v, "g_fTexOffset");
890          }          }
891    
892          return v;          return v;
# Line 913  inline Vector FlushTextureDims(FRAGMENTS Line 920  inline Vector FlushTextureDims(FRAGMENTS
920          if (shadertype == 4)          if (shadertype == 4)
921                  vTexDims.z += 8.0f;                  vTexDims.z += 8.0f;
922    
923          ZZcgSetParameter4fv(pfragment->fTexDims, vTexDims, "g_fTexDims");          ZZshSetParameter4fv(pfragment->fTexDims, vTexDims, "g_fTexDims");
924    
925          return vTexDims;          return vTexDims;
926  }  }
# Line 950  inline FRAGMENTSHADER* FlushUseExistRend Line 957  inline FRAGMENTSHADER* FlushUseExistRend
957    
958          GLuint ptexclut = 0;          GLuint ptexclut = 0;
959    
960          //int psm = GetTexCPSM(curvb.tex0);          //int psm = PIXEL_STORAGE_FORMAT(curvb.tex0);
961          int shadertype = FlushGetShaderType(curvb, ptextarg, ptexclut);          int shadertype = FlushGetShaderType(curvb, ptextarg, ptexclut);
962    
963          FRAGMENTSHADER* pfragment = LoadShadeEffect(shadertype, 0, curvb.curprim.fge,          FRAGMENTSHADER* pfragment = LoadShadeEffect(shadertype, 0, curvb.curprim.fge,
964                                                                  IsAlphaTestExpansion(curvb), exactcolor, curvb.clamp, context, NULL);                                                                  IsAlphaTestExpansion(curvb.tex0), exactcolor, curvb.clamp, context, NULL);
965    
966          Vector vpageoffset = FlushSetPageOffset(pfragment, shadertype, ptextarg);          Vector vpageoffset = FlushSetPageOffset(pfragment, shadertype, ptextarg);
967    
# Line 963  inline FRAGMENTSHADER* FlushUseExistRend Line 970  inline FRAGMENTSHADER* FlushUseExistRend
970          Vector vTexDims = FlushTextureDims(pfragment, shadertype, curvb, ptextarg);          Vector vTexDims = FlushTextureDims(pfragment, shadertype, curvb, ptextarg);
971    
972          if (pfragment->sCLUT != NULL && ptexclut != 0)          if (pfragment->sCLUT != NULL && ptexclut != 0)
973          {                  ZZshGLSetTextureParameter(pfragment->sCLUT, ptexclut, "CLUT");
                 cgGLSetTextureParameter(pfragment->sCLUT, ptexclut);  
                 cgGLEnableTextureParameter(pfragment->sCLUT);  
         }  
974    
975          FlushApplyResizeFilter(curvb, dwFilterOpts, ptextarg, context);          FlushApplyResizeFilter(curvb, dwFilterOpts, ptextarg, context);
976    
# Line 996  inline FRAGMENTSHADER* FlushMadeNewTarge Line 1000  inline FRAGMENTSHADER* FlushMadeNewTarge
1000          }          }
1001    
1002          FRAGMENTSHADER* pfragment = LoadShadeEffect(0, GetTexFilter(curvb.tex1), curvb.curprim.fge,          FRAGMENTSHADER* pfragment = LoadShadeEffect(0, GetTexFilter(curvb.tex1), curvb.curprim.fge,
1003                                                                  IsAlphaTestExpansion(curvb), exactcolor, curvb.clamp, context, NULL);                                                                  IsAlphaTestExpansion(curvb.tex0), exactcolor, curvb.clamp, context, NULL);
1004    
1005          if (pfragment == NULL)          if (pfragment == NULL)
1006                  ZZLog::Error_Log("Could not find memory target shader.");                  ZZLog::Error_Log("Could not find memory target shader.");
# Line 1010  inline void FlushSetTexture(VB& curvb, F Line 1014  inline void FlushSetTexture(VB& curvb, F
1014          SetTexVariables(context, pfragment);          SetTexVariables(context, pfragment);
1015          SetTexInt(context, pfragment, ptextarg == NULL);          SetTexInt(context, pfragment, ptextarg == NULL);
1016    
1017          // have to enable the texture parameters(curtest.atst=          // have to enable the texture parameters(curtest.atst)
1018            if( curvb.ptexClamp[0] != 0 )
1019          if (curvb.ptexClamp[0] != 0)                  ZZshGLSetTextureParameter(pfragment->sBitwiseANDX, curvb.ptexClamp[0], "Clamp 0");
1020          {          
1021                  cgGLSetTextureParameter(pfragment->sBitwiseANDX, curvb.ptexClamp[0]);          if( curvb.ptexClamp[1] != 0 )
1022                  cgGLEnableTextureParameter(pfragment->sBitwiseANDX);                  ZZshGLSetTextureParameter(pfragment->sBitwiseANDY, curvb.ptexClamp[1], "Clamp 1");
1023          }          
1024            if( pfragment->sMemory != NULL && s_ptexCurSet[context] != 0)
1025          if (curvb.ptexClamp[1] != 0)                  ZZshGLSetTextureParameter(pfragment->sMemory, s_ptexCurSet[context], "Clamp memory");
         {  
                 cgGLSetTextureParameter(pfragment->sBitwiseANDY, curvb.ptexClamp[1]);  
                 cgGLEnableTextureParameter(pfragment->sBitwiseANDY);  
         }  
1026    
         if (pfragment->sMemory != NULL && s_ptexCurSet[context] != 0)  
         {  
                 cgGLSetTextureParameter(pfragment->sMemory, s_ptexCurSet[context]);  
                 cgGLEnableTextureParameter(pfragment->sMemory);  
         }  
1027  }  }
1028    
1029  // Reset programm and texture variables;  // Reset program and texture variables;
1030  inline void FlushBindProgramm(FRAGMENTSHADER* pfragment, int context)  inline void FlushBindProgramm(FRAGMENTSHADER* pfragment, int context)
1031  {  {
1032          vb[context].bTexConstsSync = 0;          vb[context].bTexConstsSync = 0;
1033          vb[context].bVarsTexSync = 0;          vb[context].bVarsTexSync = 0;
1034    
1035          cgGLBindProgram(pfragment->prog);          ZZshSetPixelShader(pfragment->prog);
         g_psprog = pfragment->prog;  
1036  }  }
1037    
1038  inline FRAGMENTSHADER* FlushRendererStage(VB& curvb, u32& dwFilterOpts, CRenderTarget* ptextarg, int exactcolor, int context)  inline FRAGMENTSHADER* FlushRendererStage(VB& curvb, u32& dwFilterOpts, CRenderTarget* ptextarg, int exactcolor, int context)
# Line 1071  inline FRAGMENTSHADER* FlushRendererStag Line 1065  inline FRAGMENTSHADER* FlushRendererStag
1065          GL_REPORT_ERRORD();          GL_REPORT_ERRORD();
1066    
1067          // set the shaders          // set the shaders
1068          SetShaderCaller("FlushRendererStage")   ;          SetShaderCaller("FlushRendererStage");
1069          SETVERTEXSHADER(pvs[2 * ((curvb.curprim._val >> 1) & 3) + 8 * s_bWriteDepth + context]);          ZZshSetVertexShader(pvs[2 * ((curvb.curprim._val >> 1) & 3) + 8 * s_bWriteDepth + context]);
1070          FlushBindProgramm(pfragment, context);          FlushBindProgramm(pfragment, context);
1071    
1072          GL_REPORT_ERRORD();          GL_REPORT_ERRORD();
# Line 1115  inline void AlphaSetDepthTest(VB& curvb, Line 1109  inline void AlphaSetDepthTest(VB& curvb,
1109    
1110          GL_ZTEST(curtest.zte);          GL_ZTEST(curtest.zte);
1111    
 //      glEnable (GL_POLYGON_OFFSET_FILL);  
 //        glPolygonOffset (-1., -1.);  
   
1112          if (s_bWriteDepth)          if (s_bWriteDepth)
1113          {          {
1114                  if (!curvb.zbuf.zmsk)                  if (!curvb.zbuf.zmsk)
# Line 1179  inline u32 AlphaRenderAlpha(VB& curvb, c Line 1170  inline u32 AlphaRenderAlpha(VB& curvb, c
1170                          v.w *= 255;                          v.w *= 255;
1171                  }                  }
1172    
1173                  ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");                  ZZshSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");
1174          }          }
1175          else          else
1176          {          {
1177                  // not using blending so set to defaults                  // not using blending so set to defaults
1178                  Vector v = exactcolor ? Vector(1, 510 * 255.0f / 256.0f, 0, 0) : Vector(1, 2 * 255.0f / 256.0f, 0, 0);                  Vector v = exactcolor ? Vector(1, 510 * 255.0f / 256.0f, 0, 0) : Vector(1, 2 * 255.0f / 256.0f, 0, 0);
1179                  ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");                  ZZshSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");
1180    
1181          }          }
1182    
# Line 1276  inline void AlphaPabe(VB& curvb, FRAGMEN Line 1267  inline void AlphaPabe(VB& curvb, FRAGMEN
1267    
1268                  if (exactcolor) v.y *= 255;                  if (exactcolor) v.y *= 255;
1269    
1270                  ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");                  ZZshSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");
1271    
1272                  Draw(curvb);                  Draw(curvb);
1273    
# Line 1345  inline void AlphaFailureTestJob(VB& curv Line 1336  inline void AlphaFailureTestJob(VB& curv
1336    
1337                  if (exactcolor) { v.y *= 255; v.w *= 255; }                  if (exactcolor) { v.y *= 255; v.w *= 255; }
1338    
1339                  ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");                  ZZshSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");
1340    
1341                  glEnable(GL_BLEND);                  glEnable(GL_BLEND);
1342                  GL_STENCILFUNC(GL_EQUAL, s_stencilref | STENCIL_FBA, s_stencilmask | STENCIL_FBA);                  GL_STENCILFUNC(GL_EQUAL, s_stencilref | STENCIL_FBA, s_stencilmask | STENCIL_FBA);
# Line 1369  inline void AlphaFailureTestJob(VB& curv Line 1360  inline void AlphaFailureTestJob(VB& curv
1360    
1361                  if (exactcolor) v.y *= 255;                  if (exactcolor) v.y *= 255;
1362    
1363                  ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");                  ZZshSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");
1364    
1365                  Draw(curvb);                  Draw(curvb);
1366    
# Line 1421  inline void AlphaSpecialTesting(VB& curv Line 1412  inline void AlphaSpecialTesting(VB& curv
1412                  glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);                  glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
1413    
1414                  Vector v = Vector(0, exactcolor ? 510.0f : 2.0f, 0, 0);                  Vector v = Vector(0, exactcolor ? 510.0f : 2.0f, 0, 0);
1415                  ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");                  ZZshSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor");
1416                  Draw(curvb);                  Draw(curvb);
1417    
1418                  // don't need to restore                  // don't need to restore
# Line 1468  inline void AlphaSaveTarget(VB& curvb) Line 1459  inline void AlphaSaveTarget(VB& curvb)
1459  //#endif  //#endif
1460  //              char str[255];  //              char str[255];
1461  //              sprintf(str, "frames/frame%.4d.tga", g_SaveFrameNum++);  //              sprintf(str, "frames/frame%.4d.tga", g_SaveFrameNum++);
1462  //              if( (g_bSaveFlushedFrame & 2) ) {  
1463  //                      //glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); // switch to the backbuffer  //              //glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); // switch to the backbuffer
1464  //                      //glFlush();  //              //glFlush();
1465  //                      //SaveTexture("tex.jpg", GL_TEXTURE_RECTANGLE_NV, curvb.prndr->ptex, RW(curvb.prndr->fbw), RH(curvb.prndr->fbh));  //              //SaveTexture("tex.jpg", GL_TEXTURE_RECTANGLE_NV, curvb.prndr->ptex, RW(curvb.prndr->fbw), RH(curvb.prndr->fbh));
1466  //                      SaveRenderTarget(str, RW(curvb.prndr->fbw), RH(curvb.prndr->fbh), 0);  //              SaveRenderTarget(str, RW(curvb.prndr->fbw), RH(curvb.prndr->fbh), 0);
 //              }  
1467  //      }  //      }
1468  #endif  #endif
1469  }  }
# Line 1499  inline void AlphaColorClamping(VB& curvb Line 1489  inline void AlphaColorClamping(VB& curvb
1489    
1490                  SetShaderCaller("AlphaColorClamping");                  SetShaderCaller("AlphaColorClamping");
1491    
1492                  SETPIXELSHADER(ppsOne.prog);                  ZZshSetPixelShader(ppsOne.prog);
1493                  GL_BLEND_RGB(GL_ONE, GL_ONE);                  GL_BLEND_RGB(GL_ONE, GL_ONE);
1494    
1495                  float f;                  float f;
# Line 1507  inline void AlphaColorClamping(VB& curvb Line 1497  inline void AlphaColorClamping(VB& curvb
1497                  if (bAlphaClamping & 1)    // min                  if (bAlphaClamping & 1)    // min
1498                  {                  {
1499                          f = 0;                          f = 0;
1500                          ZZcgSetParameter4fv(ppsOne.sOneColor, &f, "g_fOneColor");                          ZZshSetParameter4fv(ppsOne.sOneColor, &f, "g_fOneColor");
1501                          GL_BLENDEQ_RGB(GL_MAX_EXT);                          GL_BLENDEQ_RGB(GL_MAX_EXT);
1502                          Draw(curvb);                          Draw(curvb);
1503                  }                  }
# Line 1516  inline void AlphaColorClamping(VB& curvb Line 1506  inline void AlphaColorClamping(VB& curvb
1506                  if (bAlphaClamping & 2)    // max                  if (bAlphaClamping & 2)    // max
1507                  {                  {
1508                          f = 1;                          f = 1;
1509                          ZZcgSetParameter4fv(ppsOne.sOneColor, &f, "g_fOneColor");                          ZZshSetParameter4fv(ppsOne.sOneColor, &f, "g_fOneColor");
1510                          GL_BLENDEQ_RGB(GL_MIN_EXT);                          GL_BLENDEQ_RGB(GL_MIN_EXT);
1511                          Draw(curvb);                          Draw(curvb);
1512                  }                  }
# Line 1614  void ZeroGS::FlushBoth() Line 1604  void ZeroGS::FlushBoth()
1604          Flush(1);          Flush(1);
1605  }  }
1606    
1607  inline void ZeroGS::RenderFBA(const VB& curvb, CGparameter sOneColor)  inline void ZeroGS::RenderFBA(const VB& curvb, ZZshParameter sOneColor)
1608  {  {
1609          // add fba to all pixels          // add fba to all pixels
1610          GL_STENCILFUNC(GL_ALWAYS, STENCIL_FBA, 0xff);          GL_STENCILFUNC(GL_ALWAYS, STENCIL_FBA, 0xff);
# Line 1635  inline void ZeroGS::RenderFBA(const VB& Line 1625  inline void ZeroGS::RenderFBA(const VB&
1625    
1626          Vector v(1,2,0,0);          Vector v(1,2,0,0);
1627    
1628          ZZcgSetParameter4fv(sOneColor, v, "g_fOneColor");          ZZshSetParameter4fv(sOneColor, v, "g_fOneColor");
1629    
1630          Draw(curvb);          Draw(curvb);
1631    
# Line 1658  inline void ZeroGS::RenderFBA(const VB& Line 1648  inline void ZeroGS::RenderFBA(const VB&
1648          GL_ZTEST(curvb.test.zte);          GL_ZTEST(curvb.test.zte);
1649  }  }
1650    
1651  __forceinline void ZeroGS::RenderAlphaTest(const VB& curvb, CGparameter sOneColor)  __forceinline void ZeroGS::RenderAlphaTest(const VB& curvb, ZZshParameter sOneColor)
1652  {  {
1653          if (!g_bUpdateStencil) return;          if (!g_bUpdateStencil) return;
1654    
# Line 1674  __forceinline void ZeroGS::RenderAlphaTe Line 1664  __forceinline void ZeroGS::RenderAlphaTe
1664    
1665          Vector v(1,2,0,0);          Vector v(1,2,0,0);
1666    
1667          ZZcgSetParameter4fv(sOneColor, v, "g_fOneColor");          ZZshSetParameter4fv(sOneColor, v, "g_fOneColor");
1668    
1669          // or a 1 to the stencil buffer wherever alpha passes          // or a 1 to the stencil buffer wherever alpha passes
1670          glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);          glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
# Line 1698  __forceinline void ZeroGS::RenderAlphaTe Line 1688  __forceinline void ZeroGS::RenderAlphaTe
1688          if (curvb.test.ate && curvb.test.atst > 1 && curvb.test.aref > 0x80)          if (curvb.test.ate && curvb.test.atst > 1 && curvb.test.aref > 0x80)
1689          {          {
1690                  v = Vector(1,1,0,0);                  v = Vector(1,1,0,0);
1691                  ZZcgSetParameter4fv(sOneColor, v, "g_fOneColor");                  ZZshSetParameter4fv(sOneColor, v, "g_fOneColor");
1692                  glAlphaFunc(g_dwAlphaCmp[curvb.test.atst], AlphaReferedValue(curvb.test.aref));                  glAlphaFunc(g_dwAlphaCmp[curvb.test.atst], AlphaReferedValue(curvb.test.aref));
1693          }          }
1694    
# Line 1762  inline void ZeroGS::ProcessStencil(const Line 1752  inline void ZeroGS::ProcessStencil(const
1752    
1753          SetShaderCaller("ProcessStencil");          SetShaderCaller("ProcessStencil");
1754    
1755          SETPIXELSHADER(ppsOne.prog);          ZZshSetPixelShader(ppsOne.prog);
1756          Draw(curvb);          Draw(curvb);
1757    
1758          // process when alpha >= 0xff          // process when alpha >= 0xff
# Line 1796  inline void ZeroGS::ProcessStencil(const Line 1786  inline void ZeroGS::ProcessStencil(const
1786          glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);          glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
1787  }  }
1788    
1789  __forceinline void ZeroGS::ProcessFBA(const VB& curvb, CGparameter sOneColor)  __forceinline void ZeroGS::ProcessFBA(const VB& curvb, ZZshParameter sOneColor)
1790  {  {
1791          if ((curvb.frame.fbm&0x80000000)) return;          if ((curvb.frame.fbm&0x80000000)) return;
1792    
# Line 1822  __forceinline void ZeroGS::ProcessFBA(co Line 1812  __forceinline void ZeroGS::ProcessFBA(co
1812          GL_BLENDEQ_ALPHA(GL_FUNC_ADD);          GL_BLENDEQ_ALPHA(GL_FUNC_ADD);
1813    
1814          float f = 1;          float f = 1;
1815          ZZcgSetParameter4fv(sOneColor, &f, "g_fOneColor");          ZZshSetParameter4fv(sOneColor, &f, "g_fOneColor");
1816          SETPIXELSHADER(ppsOne.prog);          ZZshSetPixelShader(ppsOne.prog);
1817          Draw(curvb);          Draw(curvb);
1818          glDisable(GL_ALPHA_TEST);          glDisable(GL_ALPHA_TEST);
1819    
# Line 1979  void ZeroGS::SetTexInt(int context, FRAG Line 1969  void ZeroGS::SetTexInt(int context, FRAG
1969                  {                  {
1970                          if (vb[context].pmemtarg != pmemtarg)                          if (vb[context].pmemtarg != pmemtarg)
1971                          {                          {
1972                                  SetTexVariablesInt(context, GetTexFilter(vb[context].tex1), tex0, pmemtarg, pfragment, s_bForceTexFlush);                                  SetTexVariablesInt(context, GetTexFilter(vb[context].tex1), tex0, true, pfragment, s_bForceTexFlush);
1973                                  vb[context].bVarsTexSync = true;                                  vb[context].bVarsTexSync = true;
1974                          }                          }
1975                  }                  }
1976                  else                  else
1977                  {                  {
1978                          SetTexVariablesInt(context, GetTexFilter(vb[context].tex1), tex0, pmemtarg, pfragment, s_bForceTexFlush);                          SetTexVariablesInt(context, GetTexFilter(vb[context].tex1), tex0, false, pfragment, s_bForceTexFlush);
1979                          vb[context].bVarsTexSync = true;                          vb[context].bVarsTexSync = true;
1980    
1981                          INC_TEXVARS();                          INC_TEXVARS();
# Line 2080  void ZeroGS::SetTexClamping(int context, Line 2070  void ZeroGS::SetTexClamping(int context,
2070          }          }
2071    
2072          if (pfragment->fTexWrapMode != 0)          if (pfragment->fTexWrapMode != 0)
2073                  ZZcgSetParameter4fv(pfragment->fTexWrapMode, v, "g_fTexWrapMode");                  ZZshSetParameter4fv(pfragment->fTexWrapMode, v, "g_fTexWrapMode");
2074    
2075          if (pfragment->fClampExts != 0)          if (pfragment->fClampExts != 0)
2076                  ZZcgSetParameter4fv(pfragment->fClampExts, v2, "g_fClampExts");                  ZZshSetParameter4fv(pfragment->fClampExts, v2, "g_fClampExts");
2077    
2078    
2079  }  }
# Line 2121  void ZeroGS::SetTexVariables(int context Line 2111  void ZeroGS::SetTexVariables(int context
2111                  Vector valpha, valpha2 ;                  Vector valpha, valpha2 ;
2112    
2113                  // if clut, use the frame format                  // if clut, use the frame format
2114                  int psm = GetTexCPSM(tex0);                  int psm = PIXEL_STORAGE_FORMAT(tex0);
2115    
2116  //              printf ( "A %d psm, is-clut %d. cpsm %d | %d %d\n", psm,  PSMT_ISCLUT(psm), tex0.cpsm,  tex0.tfx, tex0.tcc );  //              ZZLog::Error_Log( "A %d psm, is-clut %d. cpsm %d | %d %d", psm,  PSMT_ISCLUT(psm), tex0.cpsm,  tex0.tfx, tex0.tcc );
2117    
2118                  Vector vblack;                  Vector vblack;
2119                  vblack.x = vblack.y = vblack.z = vblack.w = 10;                  vblack.x = vblack.y = vblack.z = vblack.w = 10;
# Line 2145  void ZeroGS::SetTexVariables(int context Line 2135  void ZeroGS::SetTexVariables(int context
2135    
2136                  valpha2.x = (tex0.tfx == 1) ;                  valpha2.x = (tex0.tfx == 1) ;
2137                  valpha2.y = (tex0.tcc == 1) && (tex0.tfx != 0) ;                  valpha2.y = (tex0.tcc == 1) && (tex0.tfx != 0) ;
2138                  valpha2.z = (tex0.tfx != 1) * 2.0f ;                  valpha2.z = (tex0.tfx != 1) * 2 ;
2139                  valpha2.w = (tex0.tfx == 0) ;                  valpha2.w = (tex0.tfx == 0) ;
2140    
2141                  if (tex0.tcc == 0 || !nNeedAlpha(psm))                  if (tex0.tcc == 0 || !PSMT_ALPHAEXP(psm))
2142                  {                  {
2143                          valpha.x = 0 ;                          valpha.x = 0 ;
2144                          valpha.y = (!!tex0.tcc) * (1.0f + (tex0.tfx == 0)) ;                          valpha.y = (!!tex0.tcc) * (1 + (tex0.tfx == 0)) ;
2145                  }                  }
2146                  else                  else
2147                  {                  {
2148                          valpha.x = (gs.texa.fta[0])  * (1.0f + (tex0.tfx == 0)) ;                          valpha.x = (gs.texa.fta[0])  * (1 + (tex0.tfx == 0)) ;
2149                          valpha.y = (gs.texa.fta[psm!=1] - gs.texa.fta[0]) * (1.0f + (tex0.tfx == 0))  ;                          valpha.y = (gs.texa.fta[psm != PSMCT24] - gs.texa.fta[0]) * (1 + (tex0.tfx == 0)) ;
2150    
2151                  }                  }
2152    
2153                  valpha.z = (tex0.tfx >= 3) ;                  valpha.z = (tex0.tfx >= 3) ;
# Line 2205  void ZeroGS::SetTexVariables(int context Line 2196  void ZeroGS::SetTexVariables(int context
2196                                                  valpha4.z = 0; valpha4.w = 0;                                                  valpha4.z = 0; valpha4.w = 0;
2197                                          }                                          }
2198    
2199                                          if( nNeedAlpha(psm) ) {                                          if( PSMT_ALPHAEXP(psm) ) {
2200    
2201                                                  if( tex0.tfx == 0 ) {                                                  if( tex0.tfx == 0 ) {
2202                                                          // make sure alpha is mult by two when the output is Cv = Ct*Cf                                                          // make sure alpha is mult by two when the output is Cv = Ct*Cf
# Line 2240  void ZeroGS::SetTexVariables(int context Line 2231  void ZeroGS::SetTexVariables(int context
2231                                  }                                  }
2232    
2233                                  if ( equal_vectors(valpha, valpha3) && equal_vectors(valpha2, valpha4) ) {                                  if ( equal_vectors(valpha, valpha3) && equal_vectors(valpha2, valpha4) ) {
2234                                          if (CheckTexArray[tex0.tfx][tex0.tcc][psm!=1][nNeedAlpha(psm)] == 0) {                                          if (CheckTexArray[tex0.tfx][tex0.tcc][psm!=1][PSMT_ALPHAEXP(psm)] == 0) {
2235                                                  printf ( "Good issue %d %d %d %d\n", tex0.tfx,  tex0.tcc, psm, nNeedAlpha(psm) );                                                  printf ( "Good issue %d %d %d %d\n", tex0.tfx,  tex0.tcc, psm, PSMT_ALPHAEXP(psm) );
2236                                                  CheckTexArray[tex0.tfx][tex0.tcc][psm!=1][nNeedAlpha(psm) ] = 1;                                                  CheckTexArray[tex0.tfx][tex0.tcc][psm!=1][PSMT_ALPHAEXP(psm) ] = 1;
2237                                          }                                          }
2238                                  }                                  }
2239                                  else if (CheckTexArray[tex0.tfx][tex0.tcc][psm!=1][nNeedAlpha(psm)] == -1) {                                  else if (CheckTexArray[tex0.tfx][tex0.tcc][psm!=1][PSMT_ALPHAEXP(psm)] == -1) {
2240                                          printf ("Bad array, %d %d %d %d\n\tolf valpha %f, %f, %f, %f : valpha2 %f %f %f %f\n\tnew valpha %f, %f, %f, %f : valpha2 %f %f %f %f\n",                                          printf ("Bad array, %d %d %d %d\n\tolf valpha %f, %f, %f, %f : valpha2 %f %f %f %f\n\tnew valpha %f, %f, %f, %f : valpha2 %f %f %f %f\n",
2241                                                   tex0.tfx,  tex0.tcc, psm, nNeedAlpha(psm),                                                   tex0.tfx,  tex0.tcc, psm, PSMT_ALPHAEXP(psm),
2242                                                  valpha3.x, valpha3.y, valpha3.z, valpha3.w, valpha4.x, valpha4.y, valpha4.z, valpha4.w,                                                  valpha3.x, valpha3.y, valpha3.z, valpha3.w, valpha4.x, valpha4.y, valpha4.z, valpha4.w,
2243                                                  valpha.x, valpha.y, valpha.z, valpha.w,  valpha2.x, valpha2.y, valpha2.z, valpha2.w);                                                  valpha.x, valpha.y, valpha.z, valpha.w,  valpha2.x, valpha2.y, valpha2.z, valpha2.w);
2244                                          CheckTexArray[tex0.tfx][tex0.tcc][psm!=1][nNeedAlpha(psm)] = -1 ;                                          CheckTexArray[tex0.tfx][tex0.tcc][psm!=1][PSMT_ALPHAEXP(psm)] = -1 ;
2245                                  }                                  }
2246    
2247                  // Test;*/                  // Test;*/
2248    
2249                  ZZcgSetParameter4fv(pfragment->fTexAlpha, valpha, "g_fTexAlpha");                  ZZshSetParameter4fv(pfragment->fTexAlpha, valpha, "g_fTexAlpha");
2250                  ZZcgSetParameter4fv(pfragment->fTexAlpha2, valpha2, "g_fTexAlpha2");                  ZZshSetParameter4fv(pfragment->fTexAlpha2, valpha2, "g_fTexAlpha2");
2251    
2252                  if (tex0.tcc && gs.texa.aem && nNeedAlpha(psm))                  if (IsAlphaTestExpansion(tex0))
2253                          ZZcgSetParameter4fv(pfragment->fTestBlack, vblack, "g_fTestBlack");                          ZZshSetParameter4fv(pfragment->fTestBlack, vblack, "g_fTestBlack");
2254    
2255                  SetTexClamping(context, pfragment);                  SetTexClamping(context, pfragment);
2256    
# Line 2275  void ZeroGS::SetTexVariables(int context Line 2266  void ZeroGS::SetTexVariables(int context
2266          }          }
2267  }  }
2268    
2269  void ZeroGS::SetTexVariablesInt(int context, int bilinear, const tex0Info& tex0, CMemoryTarget* pmemtarg, FRAGMENTSHADER* pfragment, int force)  void ZeroGS::SetTexVariablesInt(int context, int bilinear, const tex0Info& tex0, bool CheckVB, FRAGMENTSHADER* pfragment, int force)
2270  {  {
2271          FUNCLOG          FUNCLOG
2272          Vector v;          Vector v;
2273          assert(pmemtarg != NULL && pfragment != NULL && pmemtarg->ptex != NULL);          CMemoryTarget* pmemtarg = g_MemTargs.GetMemoryTarget(tex0, 1);
2274    
2275            assert( pmemtarg != NULL && pfragment != NULL && pmemtarg->ptex != NULL);      
2276          if (pmemtarg == NULL || pfragment == NULL || pmemtarg->ptex == NULL)          if (pmemtarg == NULL || pfragment == NULL || pmemtarg->ptex == NULL)
2277          {          {
2278                  printf("SetTexVariablesInt error\n");                  ZZLog::Error_Log("SetTexVariablesInt error.");
2279                  return;                  return;
2280          }          }
2281            
2282            if (CheckVB && vb[context].pmemtarg == pmemtarg) return;
2283    
2284          SetShaderCaller("SetTexVariablesInt");          SetShaderCaller("SetTexVariablesInt");
2285    
# Line 2302  void ZeroGS::SetTexVariablesInt(int cont Line 2296  void ZeroGS::SetTexVariablesInt(int cont
2296                  v.w = 1.0f / (float)fh;                  v.w = 1.0f / (float)fh;
2297    
2298                  if (pfragment->fRealTexDims)                  if (pfragment->fRealTexDims)
2299                          ZZcgSetParameter4fv(pfragment->fRealTexDims, v, "g_fRealTexDims");                          ZZshSetParameter4fv(pfragment->fRealTexDims, v, "g_fRealTexDims");
2300                  else                  else
2301                          ZZcgSetParameter4fv(cgGetNamedParameter(pfragment->prog, "g_fRealTexDims"), v, "g_fRealTexDims");                          ZZshSetParameter4fv(cgGetNamedParameter(pfragment->prog,"g_fRealTexDims"),v, "g_fRealTexDims");
2302          }          }
2303    
2304          if (m_Blocks[tex0.psm].bpp == 0)          if (m_Blocks[tex0.psm].bpp == 0)
# Line 2358  void ZeroGS::SetTexVariablesInt(int cont Line 2352  void ZeroGS::SetTexVariablesInt(int cont
2352                  v.z *= b.bpp * (1 / 32.0f);                  v.z *= b.bpp * (1 / 32.0f);
2353          }          }
2354    
2355          ZZcgSetParameter4fv(pfragment->fTexDims, vTexDims, "g_fTexDims");          ZZshSetParameter4fv(pfragment->fTexDims, vTexDims, "g_fTexDims");
2356    
2357  //      ZZcgSetParameter4fv(pfragment->fTexBlock, b.vTexBlock, "g_fTexBlock"); // I change it, and it's working. Seems casting from Vector to float[4] is ok.  //      ZZshSetParameter4fv(pfragment->fTexBlock, b.vTexBlock, "g_fTexBlock"); // I change it, and it's working. Seems casting from Vector to float[4] is ok.
2358          ZZcgSetParameter4fv(pfragment->fTexBlock, &b.vTexBlock.x, "g_fTexBlock");          ZZshSetParameter4fv(pfragment->fTexBlock, &b.vTexBlock.x, "g_fTexBlock");
2359          ZZcgSetParameter4fv(pfragment->fTexOffset, v, "g_fTexOffset");          ZZshSetParameter4fv(pfragment->fTexOffset, v, "g_fTexOffset");
2360    
2361          // get hardware texture dims          // get hardware texture dims
2362          //int texheight = (pmemtarg->realheight+pmemtarg->widthmult-1)/pmemtarg->widthmult;          //int texheight = (pmemtarg->realheight+pmemtarg->widthmult-1)/pmemtarg->widthmult;
# Line 2382  void ZeroGS::SetTexVariablesInt(int cont Line 2376  void ZeroGS::SetTexVariablesInt(int cont
2376                          v.w = 0.5f;*/                          v.w = 0.5f;*/
2377          v.w = 0.5f;          v.w = 0.5f;
2378    
2379          ZZcgSetParameter4fv(pfragment->fPageOffset, v, "g_fPageOffset");          ZZshSetParameter4fv(pfragment->fPageOffset, v, "g_fPageOffset");
2380    
2381          if (force)          if (force)
2382                  s_ptexCurSet[context] = pmemtarg->ptex->tex;                  s_ptexCurSet[context] = pmemtarg->ptex->tex;

Legend:
Removed from v.133  
changed lines
  Added in v.163

  ViewVC Help
Powered by ViewVC 1.1.22