diff --git a/plugins/zzogl-pg/opengl/Regs.cpp b/plugins/zzogl-pg/opengl/Regs.cpp index bbd37ccaa7..3fb3c95b46 100644 --- a/plugins/zzogl-pg/opengl/Regs.cpp +++ b/plugins/zzogl-pg/opengl/Regs.cpp @@ -287,8 +287,7 @@ void tex2Write(int i, u32 *data) FUNCLOG tex0Info& tex0 = ZeroGS::vb[i].tex0; - if (ZeroGS::vb[i].bNeedTexCheck) - ZeroGS::vb[i].FlushTexData(); + if (ZeroGS::vb[i].bNeedTexCheck) ZeroGS::vb[i].FlushTexData(); u32 psm = ZZOglGet_psm_TexBitsFix(data[0]); @@ -342,8 +341,7 @@ __forceinline void frameWrite(int i, u32 *data) return; } - ZeroGS::Flush(0); - ZeroGS::Flush(1); + ZeroGS::FlushBoth(); gsfb.fbp = ZZOglGet_fbp_FrameBitsMult(data[0]); gsfb.fbw = ZZOglGet_fbw_FrameBitsMult(data[0]); @@ -383,7 +381,6 @@ __forceinline void clampWrite(int i, u32 *data) if ((s_uClampData[i] != data[0]) || (((clamp.minv >> 8) | (clamp.maxv << 2)) != (data[1]&0x0fff))) { - ZeroGS::Flush(i); s_uClampData[i] = data[0]; @@ -418,10 +415,10 @@ void __fastcall GIFRegHandlerPRIM(u32 *data) { FUNCLOG - if (data[0] & ~0x3ff) - { + //if (data[0] & ~0x3ff) + //{ //ZZLog::Warn_Log("Warning: unknown bits in prim %8.8lx_%8.8lx", data[1], data[0]); - } + //} gs.nTriFanVert = gs.primIndex; @@ -645,8 +642,7 @@ void __fastcall GIFRegHandlerPRMODE(u32* data) FUNCLOG gs._prim[0]._val = (data[0] >> 3) & 0xff; - if (gs.prac == 0) - ZeroGS::Prim(); + if (gs.prac == 0) ZeroGS::Prim(); } void __fastcall GIFRegHandlerTEXCLUT(u32* data) @@ -664,8 +660,7 @@ void __fastcall GIFRegHandlerTEXCLUT(u32* data) void __fastcall GIFRegHandlerSCANMSK(u32* data) { FUNCLOG -// ZeroGS::Flush(0); -// ZeroGS::Flush(1); +// ZeroGS::FlushBoth(); // ZeroGS::ResolveC(&ZeroGS::vb[0]); // ZeroGS::ResolveZ(&ZeroGS::vb[0]); @@ -730,9 +725,10 @@ void __fastcall GIFRegHandlerTEXA(u32* data) if (*(u32*)&newinfo != *(u32*)&gs.texa) { - ZeroGS::Flush(0); - ZeroGS::Flush(1); + ZeroGS::FlushBoth(); + *(u32*)&gs.texa = *(u32*) & newinfo; + gs.texa.fta[0] = newinfo.ta[0] / 255.0f; gs.texa.fta[1] = newinfo.ta[1] / 255.0f; @@ -768,10 +764,8 @@ void __fastcall GIFRegHandlerSCISSOR_1(u32* data) if (newscissor.x1 != scissor.x1 || newscissor.y1 != scissor.y1 || newscissor.x0 != scissor.x0 || newscissor.y0 != scissor.y0) { - ZeroGS::Flush(0); scissor = newscissor; - ZeroGS::vb[0].bNeedFrameCheck = 1; } } @@ -791,7 +785,6 @@ void __fastcall GIFRegHandlerSCISSOR_2(u32* data) if (newscissor.x1 != scissor.x1 || newscissor.y1 != scissor.y1 || newscissor.x0 != scissor.x0 || newscissor.y0 != scissor.y0) { - ZeroGS::Flush(1); scissor = newscissor; @@ -874,8 +867,7 @@ void __fastcall GIFRegHandlerPABE(u32* data) FUNCLOG //ZeroGS::SetAlphaChanged(0, GPUREG_PABE); //ZeroGS::SetAlphaChanged(1, GPUREG_PABE); - ZeroGS::Flush(0); - ZeroGS::Flush(1); + ZeroGS::FlushBoth(); gs.pabe = *data & 0x1; } @@ -883,16 +875,17 @@ void __fastcall GIFRegHandlerPABE(u32* data) void __fastcall GIFRegHandlerFBA_1(u32* data) { FUNCLOG - ZeroGS::Flush(0); - ZeroGS::Flush(1); + + ZeroGS::FlushBoth(); ZeroGS::vb[0].fba.fba = *data & 0x1; } void __fastcall GIFRegHandlerFBA_2(u32* data) { FUNCLOG - ZeroGS::Flush(0); - ZeroGS::Flush(1); + + ZeroGS::FlushBoth(); + ZeroGS::vb[1].fba.fba = *data & 0x1; } @@ -925,8 +918,7 @@ void __fastcall GIFRegHandlerZBUF_1(u32* data) // error detection if (m_Blocks[psm].bpp == 0) return; - ZeroGS::Flush(0); - ZeroGS::Flush(1); + ZeroGS::FlushBoth(); zbuf.zbp = (data[0] & 0x1ff) * 32; zbuf.psm = 0x30 | ((data[0] >> 24) & 0xf); @@ -954,11 +946,9 @@ void __fastcall GIFRegHandlerZBUF_2(u32* data) } // error detection - if (m_Blocks[psm].bpp == 0) - return; + if (m_Blocks[psm].bpp == 0) return; - ZeroGS::Flush(0); - ZeroGS::Flush(1); + ZeroGS::FlushBoth(); zbuf.zbp = (data[0] & 0x1ff) * 32; diff --git a/plugins/zzogl-pg/opengl/ZZoglCRTC.cpp b/plugins/zzogl-pg/opengl/ZZoglCRTC.cpp index fee45a8e01..b27b007020 100644 --- a/plugins/zzogl-pg/opengl/ZZoglCRTC.cpp +++ b/plugins/zzogl-pg/opengl/ZZoglCRTC.cpp @@ -113,7 +113,7 @@ inline u32 CreateInterlaceTex(int width) glGenTextures(1, &s_ptexInterlace); glBindTexture(GL_TEXTURE_RECTANGLE_NV, s_ptexInterlace); - glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 4, width, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); + TextureRect(4, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GL_REPORT_ERRORD(); @@ -283,14 +283,11 @@ inline void RenderStartHelper(u32 bInterlace) ZZLog::Debug_Log("Disabling MRT depth writing\n"); } - Flush(0); - Flush(1); - GL_REPORT_ERRORD(); + FlushBoth(); FrameSavingHelper(); - if (s_RangeMngr.ranges.size() > 0) - FlushTransferRanges(NULL); + if (s_RangeMngr.ranges.size() > 0) FlushTransferRanges(NULL); SetShaderCaller("RenderStartHelper"); @@ -317,7 +314,7 @@ inline void RenderStartHelper(u32 bInterlace) if (conf.options & GSOPTION_WIREFRAME) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - DisableAllgl() ; + DisableAllgl(); GL_REPORT_ERRORD(); @@ -444,11 +441,12 @@ inline void RenderCRTC24helper(u32 bInterlace, int interlace, int psm) // assume that data is already in ptexMem (do Resolve?) RenderGetForClip(bInterlace, interlace, psm, &ppsCRTC24[bInterlace]); SETPIXELSHADER(ppsCRTC24[bInterlace].prog); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + DrawTriangle(); } // Maybe I do this function global-defined. Calculate bits per pixel for -// each psm. It's obly place with PSMCT16 which have diffetent bpp. +// each psm. It's the only place with PSMCT16 which have a different bpp. // FIXME: check PSMCT16S inline int RenderGetBpp(int psm) { @@ -638,9 +636,7 @@ inline bool RenderCheckForTargets(tex0Info& texframe, list& list SETPIXELSHADER(ppsCRTCTarg[bInterlace].prog); - GL_REPORT_ERRORD(); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + DrawTriangle(); if (abs(dh - (int)texframe.th) <= 1) return true; @@ -711,8 +707,8 @@ inline void RenderCheckForMemory(tex0Info& texframe, list& listT RenderCreateInterlaceTex(bInterlace, texframe.th, &ppsCRTC[bInterlace]); SETPIXELSHADER(ppsCRTC[bInterlace].prog); - GL_REPORT_ERRORD(); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + DrawTriangle(); } // Put FPS counter on screen (not in window title) diff --git a/plugins/zzogl-pg/opengl/ZZoglCreate.cpp b/plugins/zzogl-pg/opengl/ZZoglCreate.cpp index 80d7e56657..1671f847c7 100644 --- a/plugins/zzogl-pg/opengl/ZZoglCreate.cpp +++ b/plugins/zzogl-pg/opengl/ZZoglCreate.cpp @@ -456,6 +456,27 @@ inline bool CreateFillExtensionsMap() const static char* g_pShaders[] = { "full", "reduced", "accurate", "accurate-reduced" }; +void LoadglFunctions() +{ + GL_LOADFN(glIsRenderbufferEXT); + GL_LOADFN(glBindRenderbufferEXT); + GL_LOADFN(glDeleteRenderbuffersEXT); + GL_LOADFN(glGenRenderbuffersEXT); + GL_LOADFN(glRenderbufferStorageEXT); + GL_LOADFN(glGetRenderbufferParameterivEXT); + GL_LOADFN(glIsFramebufferEXT); + GL_LOADFN(glBindFramebufferEXT); + GL_LOADFN(glDeleteFramebuffersEXT); + GL_LOADFN(glGenFramebuffersEXT); + GL_LOADFN(glCheckFramebufferStatusEXT); + GL_LOADFN(glFramebufferTexture1DEXT); + GL_LOADFN(glFramebufferTexture2DEXT); + GL_LOADFN(glFramebufferTexture3DEXT); + GL_LOADFN(glFramebufferRenderbufferEXT); + GL_LOADFN(glGetFramebufferAttachmentParameterivEXT); + GL_LOADFN(glGenerateMipmapEXT); +} + bool ZeroGS::Create(int _width, int _height) { GLenum err = GL_NO_ERROR; @@ -489,23 +510,7 @@ bool ZeroGS::Create(int _width, int _height) s_srcrgb = s_dstrgb = s_srcalpha = s_dstalpha = GL_ONE; - GL_LOADFN(glIsRenderbufferEXT); - GL_LOADFN(glBindRenderbufferEXT); - GL_LOADFN(glDeleteRenderbuffersEXT); - GL_LOADFN(glGenRenderbuffersEXT); - GL_LOADFN(glRenderbufferStorageEXT); - GL_LOADFN(glGetRenderbufferParameterivEXT); - GL_LOADFN(glIsFramebufferEXT); - GL_LOADFN(glBindFramebufferEXT); - GL_LOADFN(glDeleteFramebuffersEXT); - GL_LOADFN(glGenFramebuffersEXT); - GL_LOADFN(glCheckFramebufferStatusEXT); - GL_LOADFN(glFramebufferTexture1DEXT); - GL_LOADFN(glFramebufferTexture2DEXT); - GL_LOADFN(glFramebufferTexture3DEXT); - GL_LOADFN(glFramebufferRenderbufferEXT); - GL_LOADFN(glGetFramebufferAttachmentParameterivEXT); - GL_LOADFN(glGenerateMipmapEXT); + LoadglFunctions(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); GL_REPORT_ERROR(); @@ -523,7 +528,8 @@ bool ZeroGS::Create(int _width, int _height) glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, s_uFramebuffer); - if (glDrawBuffers != NULL) glDrawBuffers(1, s_drawbuffers); + DrawBuffers(s_drawbuffers); + GL_REPORT_ERROR(); if (err != GL_NO_ERROR) bSuccess = false; @@ -582,7 +588,10 @@ bool ZeroGS::Create(int _width, int _height) PBITMAPINFO pinfo = (PBITMAPINFO)LockResource(hBitmapGlob); - glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 4, pinfo->bmiHeader.biWidth, pinfo->bmiHeader.biHeight, 0, pinfo->bmiHeader.biBitCount == 32 ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, (u8*)pinfo + pinfo->bmiHeader.biSize); + if (pinfo->bmiHeader.biBitCount == 32) + TextureRect(4, pinfo->bmiHeader.biWidth, pinfo->bmiHeader.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, (u8*)pinfo + pinfo->bmiHeader.biSize); + else + TextureRect(4, pinfo->bmiHeader.biWidth, pinfo->bmiHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, (u8*)pinfo + pinfo->bmiHeader.biSize); nLogoWidth = pinfo->bmiHeader.biWidth; nLogoHeight = pinfo->bmiHeader.biHeight; @@ -622,14 +631,14 @@ bool ZeroGS::Create(int _width, int _height) g_internalFloatFmt = GL_ALPHA_FLOAT32_ATI; g_internalRGBAFloatFmt = GL_RGBA_FLOAT32_ATI; g_internalRGBAFloat16Fmt = GL_RGBA_FLOAT16_ATI; - - glTexImage2D(GL_TEXTURE_2D, 0, g_internalFloatFmt, BLOCK_TEXWIDTH, BLOCK_TEXHEIGHT, 0, GL_ALPHA, GL_FLOAT, &vBlockData[0]); + + Texture2D(g_internalFloatFmt, GL_ALPHA, GL_FLOAT, &vBlockData[0]); if (glGetError() != GL_NO_ERROR) { // try different internal format g_internalFloatFmt = GL_FLOAT_R32_NV; - glTexImage2D(GL_TEXTURE_2D, 0, g_internalFloatFmt, BLOCK_TEXWIDTH, BLOCK_TEXHEIGHT, 0, GL_RED, GL_FLOAT, &vBlockData[0]); + Texture2D(g_internalFloatFmt, GL_RED, GL_FLOAT, &vBlockData[0]); } glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -643,7 +652,7 @@ bool ZeroGS::Create(int _width, int _height) g_fBlockMult = 65535.0f * (float)g_fiGPU_TEXWIDTH / 32.0f; BLOCK::FillBlocks(vBlockData, vBilinearData, 0); - glTexImage2D(GL_TEXTURE_2D, 0, 2, BLOCK_TEXWIDTH, BLOCK_TEXHEIGHT, 0, GL_R, GL_UNSIGNED_SHORT, &vBlockData[0]); + Texture2D(2, GL_R, GL_UNSIGNED_SHORT, &vBlockData[0]); if (glGetError() != GL_NO_ERROR) { @@ -658,13 +667,13 @@ bool ZeroGS::Create(int _width, int _height) // fill in the bilinear blocks glGenTextures(1, &ptexBilinearBlocks); glBindTexture(GL_TEXTURE_2D, ptexBilinearBlocks); - glTexImage2D(GL_TEXTURE_2D, 0, g_internalRGBAFloatFmt, BLOCK_TEXWIDTH, BLOCK_TEXHEIGHT, 0, GL_RGBA, GL_FLOAT, &vBilinearData[0]); + Texture2D(g_internalRGBAFloatFmt, GL_RGBA, GL_FLOAT, &vBilinearData[0]); if (glGetError() != GL_NO_ERROR) { g_internalRGBAFloatFmt = GL_FLOAT_RGBA32_NV; g_internalRGBAFloat16Fmt = GL_FLOAT_RGBA16_NV; - glTexImage2D(GL_TEXTURE_2D, 0, g_internalRGBAFloatFmt, BLOCK_TEXWIDTH, BLOCK_TEXHEIGHT, 0, GL_RGBA, GL_FLOAT, &vBilinearData[0]); + Texture2D(g_internalRGBAFloatFmt, GL_RGBA, GL_FLOAT, &vBilinearData[0]); ZZLog::Error_Log("ZZogl Fill bilinear blocks."); B_G(glGetError() == GL_NO_ERROR, return false); } @@ -753,6 +762,7 @@ bool ZeroGS::Create(int _width, int _height) } glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, &conv16to32data[0]); + nullTex = false; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); diff --git a/plugins/zzogl-pg/opengl/ZZoglFlush.cpp b/plugins/zzogl-pg/opengl/ZZoglFlush.cpp index 953dbdb444..460bc9ad2e 100644 --- a/plugins/zzogl-pg/opengl/ZZoglFlush.cpp +++ b/plugins/zzogl-pg/opengl/ZZoglFlush.cpp @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -// Realisation of Flush -- drawing function of GS +// Realization of Flush -- drawing function of GS #include @@ -61,7 +61,13 @@ bool g_bSaveResolved = 0; //#define STENCIL_PBE 16 #define STENCIL_CLEAR (2|4|8|16) -#define DRAW() glDrawArrays(primtype[curvb.curprim.prim], 0, curvb.nCount) +void Draw(const VB& curvb) +{ + if (nullTex) + ZZLog::Debug_Log("DRAW: Drawing arrays without a texture!"); + else + glDrawArrays(primtype[curvb.curprim.prim], 0, curvb.nCount); +} #define GL_BLEND_RGB(src, dst) { \ s_srcrgb = src; \ @@ -1241,7 +1247,7 @@ inline void AlphaTest(VB& curvb) if (!curvb.test.ate || curvb.test.atst > 0) { - DRAW(); + Draw(curvb); } GL_REPORT_ERRORD(); @@ -1266,7 +1272,7 @@ inline void AlphaPabe(VB& curvb, FRAGMENTSHADER* pfragment, int exactcolor) ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor"); - DRAW(); + Draw(curvb); // reset if (!s_stencilmask) s_stencilfunc = GL_ALWAYS; @@ -1341,7 +1347,7 @@ inline void AlphaFailureTestJob(VB& curvb, const pixTest curtest, FRAGMENTSHADE GL_STENCILFUNC(GL_EQUAL, s_stencilref | STENCIL_FBA, s_stencilmask | STENCIL_FBA); } - DRAW(); + Draw(curvb); GL_REPORT_ERRORD(); @@ -1361,7 +1367,7 @@ inline void AlphaFailureTestJob(VB& curvb, const pixTest curtest, FRAGMENTSHADE ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor"); - DRAW(); + Draw(curvb); // reset if (oldabe) glEnable(GL_BLEND); @@ -1412,7 +1418,7 @@ inline void AlphaSpecialTesting(VB& curvb, FRAGMENTSHADER* pfragment, u32 dwUsin Vector v = Vector(0, exactcolor ? 510.0f : 2.0f, 0, 0); ZZcgSetParameter4fv(pfragment->sOneColor, v, "g_fOneColor"); - DRAW(); + Draw(curvb); // don't need to restore } @@ -1497,7 +1503,7 @@ inline void AlphaColorClamping(VB& curvb, const pixTest curtest) f = 0; ZZcgSetParameter4fv(ppsOne.sOneColor, &f, "g_fOneColor"); GL_BLENDEQ_RGB(GL_MAX_EXT); - DRAW(); + Draw(curvb); } // bios shows white screen @@ -1506,7 +1512,7 @@ inline void AlphaColorClamping(VB& curvb, const pixTest curtest) f = 1; ZZcgSetParameter4fv(ppsOne.sOneColor, &f, "g_fOneColor"); GL_BLENDEQ_RGB(GL_MIN_EXT); - DRAW(); + Draw(curvb); } if (!curvb.zbuf.zmsk) @@ -1597,6 +1603,12 @@ void ZeroGS::Flush(int context) GL_REPORT_ERRORD(); } +__forceinline void ZeroGS::FlushBoth() +{ + Flush(0); + Flush(1); +} + inline void ZeroGS::RenderFBA(const VB& curvb, CGparameter sOneColor) { // add fba to all pixels @@ -1620,7 +1632,7 @@ inline void ZeroGS::RenderFBA(const VB& curvb, CGparameter sOneColor) ZZcgSetParameter4fv(sOneColor, v, "g_fOneColor"); - DRAW(); + Draw(curvb); SetAlphaTest(curvb.test); @@ -1673,7 +1685,7 @@ __forceinline void ZeroGS::RenderAlphaTest(const VB& curvb, CGparameter sOneColo glStencilMask(STENCIL_CLEAR); glDisable(GL_ALPHA_TEST); GL_STENCILFUNC_SET(); - DRAW(); + Draw(curvb); if (curvb.test.ate && curvb.test.afail != 1 && USEALPHATESTING) glEnable(GL_ALPHA_TEST); } @@ -1691,7 +1703,7 @@ __forceinline void ZeroGS::RenderAlphaTest(const VB& curvb, CGparameter sOneColo GL_STENCILFUNC_SET(); glDisable(GL_DEPTH_TEST); - DRAW(); + Draw(curvb); if (curvb.test.zte) glEnable(GL_DEPTH_TEST); @@ -1746,17 +1758,17 @@ inline void ZeroGS::ProcessStencil(const VB& curvb) SetShaderCaller("ProcessStencil"); SETPIXELSHADER(ppsOne.prog); - DRAW(); + Draw(curvb); // process when alpha >= 0xff GL_STENCILFUNC(GL_EQUAL, STENCIL_PIXELWRITE | STENCIL_FBA | STENCIL_ALPHABIT, STENCIL_PIXELWRITE | STENCIL_FBA); - DRAW(); + Draw(curvb); // clear STENCIL_PIXELWRITE bit glStencilMask(STENCIL_CLEAR); GL_STENCILFUNC(GL_ALWAYS, 0, STENCIL_PIXELWRITE | STENCIL_FBA); - DRAW(); + Draw(curvb); // restore state GL_COLORMASK(s_dwColorWrite); @@ -1807,14 +1819,14 @@ __forceinline void ZeroGS::ProcessFBA(const VB& curvb, CGparameter sOneColor) float f = 1; ZZcgSetParameter4fv(sOneColor, &f, "g_fOneColor"); SETPIXELSHADER(ppsOne.prog); - DRAW(); + Draw(curvb); glDisable(GL_ALPHA_TEST); // reset bits glStencilMask(STENCIL_CLEAR); GL_STENCILFUNC(GL_GREATER, 0, STENCIL_PIXELWRITE | STENCIL_FBA); glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); - DRAW(); + Draw(curvb); if (curvb.test.atst && USEALPHATESTING) { diff --git a/plugins/zzogl-pg/opengl/ZZoglVB.cpp b/plugins/zzogl-pg/opengl/ZZoglVB.cpp index 7398cfa0bd..99e6b73bcd 100644 --- a/plugins/zzogl-pg/opengl/ZZoglVB.cpp +++ b/plugins/zzogl-pg/opengl/ZZoglVB.cpp @@ -240,7 +240,6 @@ inline int ZeroGS::VB::CheckFrameAddConstraints(int tbp) #ifdef DEVBUILD int noscissorpos = maxpos; - int ConstrainR1 = ConstraintReason; #endif @@ -249,26 +248,24 @@ inline int ZeroGS::VB::CheckFrameAddConstraints(int tbp) frame = gsfb; frame.fbh = maxpos; - if (!PSMT_ISHALF(frame.psm) || !(g_GameSettings&GAME_FULL16BITRES)) - CheckFrame32bitRes(maxpos); + if (!PSMT_ISHALF(frame.psm) || !(g_GameSettings&GAME_FULL16BITRES)) CheckFrame32bitRes(maxpos); #ifdef DEVBUILD if (frame.fbh == 0xe2) ZZLog::Error_Log("Const: %x %x %d| %x %d %x %x", frame.fbh, frame.fbw, ConstraintReason, noscissorpos, ConstrainR1, tbp, frame.fbp); - #endif // Fixme: Reserved psm for framebuffers // gsfb.psm &= 0xf; // shadow tower - return 0 ; + return 0; } // Check if after resizing new depth target is needed to be used. // it returns 2 if a new depth target is used. inline int ZeroGS::VB::CheckFrameResolveDepth(int tbp) { - int result = 0 ; + int result = 0; CDepthTarget* pprevdepth = pdepth; pdepth = NULL; @@ -287,7 +284,7 @@ inline int ZeroGS::VB::CheckFrameResolveDepth(int tbp) pdepth = pnewdepth; - return result ; + return result; } // Check if after resizing, a new render target is needed to be used. Also perform deptarget check. @@ -330,11 +327,11 @@ inline int ZeroGS::VB::CheckFrameResolveRender(int tbp) prndr = pnewtarg; - pdepth = pprevdepth ; + pdepth = pprevdepth; - result |= CheckFrameResolveDepth(tbp) ; + result |= CheckFrameResolveDepth(tbp); - return result ; + return result; } // After frame resetting, it is possible that 16 to 32 or 32 to 16 (color bits) conversion should be made. @@ -362,6 +359,8 @@ inline void ZeroGS::VB::CheckFrame16vs32Conversion() // If tbp != 0, use it to bound. void ZeroGS::VB::CheckFrame(int tbp) { + GL_REPORT_ERRORD(); + static int bChanged; if (bNeedZCheck) @@ -384,7 +383,7 @@ void ZeroGS::VB::CheckFrame(int tbp) bNeedFrameCheck = 0; bNeedZCheck = 0; - if (CheckFrameAddConstraints(tbp) == -1) return ; + if (CheckFrameAddConstraints(tbp) == -1) return; if ((prndr != NULL) && (prndr->psm != gsfb.psm)) { @@ -400,11 +399,11 @@ void ZeroGS::VB::CheckFrame(int tbp) { bNeedZCheck = 0; - if (prndr != NULL && gsfb.fbw > 0) - CheckFrameResolveDepth(tbp); + if (prndr != NULL && gsfb.fbw > 0) CheckFrameResolveDepth(tbp); } if (prndr != NULL) SetContextTarget(ictx); + GL_REPORT_ERRORD(); } // This is the case, most easy to perform, when nothing was changed @@ -422,8 +421,7 @@ inline void ZeroGS::VB::FlushTexUnchangedClutDontUpdate() // update anything except texture itself inline void ZeroGS::VB::FlushTexClutDontUpdate() { - if (!ZZOglClutStorageUnchanged(uCurTex0Data, uNextTex0Data)) - ZeroGS::Flush(ictx); + if (!ZZOglClutStorageUnchanged(uCurTex0Data, uNextTex0Data)) ZeroGS::Flush(ictx); // clut memory isn't going to be loaded so can ignore, but at least update CSA and CPSM! uCurTex0Data[1] = (uCurTex0Data[1] & CPSM_CSA_NOTMASK) | (uNextTex0Data[1] & CPSM_CSA_BITMASK); @@ -457,8 +455,9 @@ inline void ZeroGS::VB::FlushTexSetNewVars(u32 psm) // This function made VB state consistant before real Flush. void ZeroGS::VB::FlushTexData() { + GL_REPORT_ERRORD(); + assert(bNeedTexCheck); - bNeedTexCheck = 0; u32 psm = ZZOglGet_psm_TexBitsFix(uNextTex0Data[0]); @@ -468,7 +467,7 @@ void ZeroGS::VB::FlushTexData() if (ZZOglAllExceptClutIsSame(uCurTex0Data, uNextTex0Data)) { // Don't need to do anything if there is no clutting and VB tex data was not changed - if (!PSMT_ISCLUT(psm)) return ; + if (!PSMT_ISCLUT(psm)) return; // have to write the CLUT again if only CLD was changed if (ZZOglClutMinusCLDunchanged(uCurTex0Data, uNextTex0Data)) @@ -497,4 +496,5 @@ void ZeroGS::VB::FlushTexData() FlushTexSetNewVars(psm); if (PSMT_ISCLUT(psm)) ZeroGS::CluttingForFlushedTex(&tex0, uNextTex0Data[1], ictx) ; + GL_REPORT_ERRORD(); } diff --git a/plugins/zzogl-pg/opengl/targets.cpp b/plugins/zzogl-pg/opengl/targets.cpp index ea540249bc..269bf1f006 100644 --- a/plugins/zzogl-pg/opengl/targets.cpp +++ b/plugins/zzogl-pg/opengl/targets.cpp @@ -35,6 +35,8 @@ #define RHA //#define RW +bool nullTex = false; + extern int g_GameSettings; using namespace ZeroGS; @@ -96,17 +98,21 @@ inline void DestroyAllTargetsHelper(void* ptr) } } -// Made an empty rexture and bind it to $ptr_p -// return false if creating texture was uncuccessfull -// fbh and fdb should be properly shifter before calling this!. -// We should ignore framebuffer trouble here, we put textures of dufferent sized to it. +// Made an empty texture and bind it to $ptr_p +// return false if creating texture was unsuccessfull +// fbh and fdb should be properly shifted before calling this!. +// We should ignore framebuffer trouble here, we put textures of different sizes to it. inline bool ZeroGS::CRenderTarget::InitialiseDefaultTexture(u32 *ptr_p, int fbw, int fbh) { glGenTextures(1, ptr_p); glBindTexture(GL_TEXTURE_RECTANGLE_NV, *ptr_p); + // initialize to default - glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GetRenderTargetFormat(), fbw, fbh, 0, GL_RGBA, GetRenderFormat() == RFT_float16 ? GL_FLOAT : GL_UNSIGNED_BYTE, NULL); - + if (GetRenderFormat() == RFT_float16) + TextureRect(GetRenderTargetFormat(), fbw, fbh, GL_RGBA, GL_FLOAT, NULL); + else + TextureRect(GetRenderTargetFormat(), fbw, fbh, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -116,7 +122,7 @@ inline bool ZeroGS::CRenderTarget::InitialiseDefaultTexture(u32 *ptr_p, int fbw, return ((Error == GL_NO_ERROR) || (Error == GL_INVALID_FRAMEBUFFER_OPERATION_EXT)); } -// Draw 4 triangles from binded array using only stenclil buffer +// Draw 4 triangles from binded array using only stencil buffer inline void FillOnlyStencilBuffer() { if (ZeroGS::IsWriteDestAlphaTest() && !(g_GameSettings&GAME_NOSTENCIL)) @@ -127,8 +133,8 @@ inline void FillOnlyStencilBuffer() glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glStencilFunc(GL_ALWAYS, 1, 0xff); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + DrawTriangle(); glColorMask(1, 1, 1, 1); } } @@ -514,8 +520,8 @@ void ZeroGS::CRenderTarget::Update(int context, ZeroGS::CRenderTarget* pdepth) SETVERTEXSHADER(pvsBitBlt.prog); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + DrawTriangle(); + // fill stencil buf only FillOnlyStencilBuffer(); glEnable(GL_SCISSOR_TEST); @@ -578,9 +584,8 @@ void ZeroGS::CRenderTarget::ConvertTo32() SET_STREAM(); // assume depth already set !? - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, ptexConv, 0); + FBTexture(0, ptexConv); ZeroGS::ResetRenderTarget(1); - GL_REPORT_ERRORD(); BindToSample(&ptex) ; @@ -596,9 +601,8 @@ void ZeroGS::CRenderTarget::ConvertTo32() SETVERTEXSHADER(pvsBitBlt.prog); SETPIXELSHADER(ppsConvert16to32.prog); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + DrawTriangle(); + #ifdef _DEBUG if (g_bSaveZUpdate) { @@ -685,8 +689,7 @@ void ZeroGS::CRenderTarget::ConvertTo16() SET_STREAM(); // assume depth already set !? - // assume depth already set !? - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, ptexConv, 0); + FBTexture(0, ptexConv); ZeroGS::ResetRenderTarget(1); GL_REPORT_ERRORD(); @@ -705,9 +708,8 @@ void ZeroGS::CRenderTarget::ConvertTo16() SETVERTEXSHADER(pvsBitBlt.prog); SETPIXELSHADER(ppsConvert32to16.prog); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + DrawTriangle(); + #ifdef _DEBUG //g_bSaveZUpdate = 1; if (g_bSaveZUpdate) @@ -794,7 +796,7 @@ void ZeroGS::CRenderTarget::_CreateFeedback() glBindBuffer(GL_ARRAY_BUFFER, vboRect); SET_STREAM(); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, ptexFeedback, 0); + FBTexture(0, ptexFeedback); glBindTexture(GL_TEXTURE_RECTANGLE_NV, ptex); GL_REPORT_ERRORD(); @@ -808,9 +810,8 @@ void ZeroGS::CRenderTarget::_CreateFeedback() // render with an AA shader if possible (bilinearly interpolates data) SETVERTEXSHADER(pvsBitBlt.prog); SETPIXELSHADER(ppsBaseTexture.prog); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + DrawTriangle(); + // restore swap(ptex, ptexFeedback); @@ -833,8 +834,8 @@ void ZeroGS::CRenderTarget::_CreateFeedback() void ZeroGS::CRenderTarget::SetRenderTarget(int targ) { FUNCLOG - - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + targ, GL_TEXTURE_RECTANGLE_NV, ptex, 0); + + FBTexture(targ, ptex); //GL_REPORT_ERRORD(); //if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) @@ -854,8 +855,7 @@ bool ZeroGS::CDepthTarget::Create(const frameInfo& frame) { FUNCLOG - if (!CRenderTarget::Create(frame)) - return false; + if (!CRenderTarget::Create(frame)) return false; GL_REPORT_ERROR(); @@ -903,8 +903,8 @@ void ZeroGS::CDepthTarget::Destroy() if (status) // In this case Framebuffer extension is off-use and lead to segfault { ResetRenderTarget(1); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + TextureRect(GL_DEPTH_ATTACHMENT_EXT); + TextureRect(GL_STENCIL_ATTACHMENT_EXT); GL_REPORT_ERRORD(); if (pstencil != 0) @@ -1011,9 +1011,9 @@ void ZeroGS::CDepthTarget::Update(int context, ZeroGS::CRenderTarget* prndr) cgGLSetTextureParameter(ppsBitBltDepth.sMemory, pmemtarg->ptex->tex); cgGLEnableTextureParameter(ppsBaseTexture.sFinal); - Vector v = DefaultBitBltPos() ; + Vector v = DefaultBitBltPos(); - v = DefaultBitBltTex() ; + v = DefaultBitBltTex(); v.x = 1; v.y = 2; @@ -1037,16 +1037,20 @@ void ZeroGS::CDepthTarget::Update(int context, ZeroGS::CRenderTarget* prndr) ZZcgSetParameter4fv(ppsBitBltDepth.sBitBltZ, ((255.0f / 256.0f)*vdepth), "g_fBitBltZ"); assert(pdepth != 0); + //GLint w1 = 0; + //GLint h1 = 0; glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_NV, ptex, 0); + //glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_WIDTH_EXT, &w1); + //glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_HEIGHT_EXT, &h1); SetDepthStencilSurface(); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_NV, 0, 0); + FBTexture(1, 0); + GLenum buffer = GL_COLOR_ATTACHMENT0_EXT; - if (glDrawBuffers != NULL) glDrawBuffers(1, &buffer); - - GL_REPORT_ERRORD(); + //ZZLog::Error_Log("CDepthTarget::Update: w1 = 0x%x; h1 = 0x%x", w1, h1); + DrawBuffers(&buffer); SetViewport(); @@ -1058,7 +1062,7 @@ void ZeroGS::CDepthTarget::Update(int context, ZeroGS::CRenderTarget* prndr) SETVERTEXSHADER(pvsBitBlt.prog); SETPIXELSHADER(ppsBitBltDepth.prog); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + DrawTriangle(); status = TS_Resolved; @@ -1083,12 +1087,12 @@ void ZeroGS::CDepthTarget::Update(int context, ZeroGS::CRenderTarget* prndr) void ZeroGS::CDepthTarget::SetDepthStencilSurface() { FUNCLOG - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, pdepth); + TextureRect(GL_DEPTH_ATTACHMENT_EXT, pdepth); if (pstencil) { // there's a bug with attaching stencil and depth buffers - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, pstencil); + TextureRect(GL_STENCIL_ATTACHMENT_EXT, pstencil); if (icount++ < 8) // not going to fail if succeeded 4 times { @@ -1096,20 +1100,18 @@ void ZeroGS::CDepthTarget::SetDepthStencilSurface() if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + TextureRect(GL_STENCIL_ATTACHMENT_EXT); - if (pstencil != pdepth) - glDeleteRenderbuffersEXT(1, &pstencil); + if (pstencil != pdepth) glDeleteRenderbuffersEXT(1, &pstencil); pstencil = 0; - g_bUpdateStencil = 0; } } } else { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + TextureRect(GL_STENCIL_ATTACHMENT_EXT); } } @@ -1751,8 +1753,7 @@ bool ZeroGS::CMemoryTarget::ValidateTex(const tex0Info& tex0, int starttex, int { FUNCLOG - if (clearmaxy == 0) - return true; + if (clearmaxy == 0) return true; int checkstarty = max(starttex, clearminy); int checkendy = min(endtex, clearmaxy); @@ -2167,11 +2168,9 @@ ZeroGS::CMemoryTarget* ZeroGS::CMemoryTargetMngr::GetMemoryTarget(const tex0Info if (PSMT_ISHALF_STORAGE(tex0)) fmt = GL_UNSIGNED_SHORT_1_5_5_5_REV; int widthmult = 1; - - if ((g_MaxTexHeight < 4096) && (end - start > g_MaxTexHeight)) widthmult = 2; - int channels = 1; + if ((g_MaxTexHeight < 4096) && (end - start > g_MaxTexHeight)) widthmult = 2; channels = NumberOfChannels(tex0.psm); targ = MemoryTarget_ClearedTargetsSearch(fmt, widthmult, channels, end - start); @@ -2251,9 +2250,11 @@ ZeroGS::CMemoryTarget* ZeroGS::CMemoryTargetMngr::GetMemoryTarget(const tex0Info #if defined(ZEROGS_DEVBUILD) g_TransferredToGPU += GPU_TEXWIDTH * channels * 4 * targ->height; - #endif + const int texH = (targ->realheight + widthmult - 1) / widthmult; + const int texW = GPU_TEXWIDTH * channels * widthmult; + // fill with data if (targ->ptex->memptr == NULL) { @@ -2268,7 +2269,7 @@ ZeroGS::CMemoryTarget* ZeroGS::CMemoryTargetMngr::GetMemoryTarget(const tex0Info if (PSMT_ISCLUT(tex0.psm)) { - texdata.resize((tex0.cpsm <= 1 ? 4 : 2) *GPU_TEXWIDTH*channels*widthmult*(targ->realheight + widthmult - 1) / widthmult); + texdata.resize(((tex0.cpsm <= 1) ? 4 : 2) * texW * texH); ptexdata = &texdata[0]; u8* psrc = (u8*)(g_pbyGSMemory + 4 * GPU_TEXWIDTH * targ->realy); @@ -2292,7 +2293,7 @@ ZeroGS::CMemoryTarget* ZeroGS::CMemoryTargetMngr::GetMemoryTarget(const tex0Info { if (tex0.psm == PSMT16Z || tex0.psm == PSMT16SZ) { - texdata.resize(4*GPU_TEXWIDTH*channels*widthmult*(targ->realheight + widthmult - 1) / widthmult + texdata.resize(4 * texW * texH #if defined(ZEROGS_SSE2) + 15 // reserve additional elements for alignment if SSE2 used. // better do it now, so less resizing would be needed @@ -2315,7 +2316,7 @@ ZeroGS::CMemoryTarget* ZeroGS::CMemoryTargetMngr::GetMemoryTarget(const tex0Info // Later we would move eax by 16, so only we should verify is first element align // FIXME. As I see, texdata used only once here, it does not have any impact on other code. // Probably, usage of _aligned_maloc() would be preferable. - int disalignment = 16 - ((u32)(uptr)dst) % 16 ; // This is value of shift. It could be 0 < disalignment <= 15 + int disalignment = 16 - ((u32)(uptr)dst) % 16; // This is value of shift. It could be 0 < disalignment <= 15 ptexdata = &texdata[disalignment]; // Set pointer to aligned element dst = (u16*)ptexdata; ZZLog::GS_Log("Made alignment for texdata, 0x%x", dst); @@ -2356,9 +2357,11 @@ ZeroGS::CMemoryTarget* ZeroGS::CMemoryTargetMngr::GetMemoryTarget(const tex0Info if (targ->ptex->tex == 0) glGenTextures(1, &targ->ptex->tex); glBindTexture(GL_TEXTURE_RECTANGLE_NV, targ->ptex->tex); - - glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, fmt == GL_UNSIGNED_BYTE ? 4 : GL_RGB5_A1, GPU_TEXWIDTH*channels*widthmult, - (targ->realheight + widthmult - 1) / widthmult, 0, GL_RGBA, fmt, ptexdata); + + if (fmt == GL_UNSIGNED_BYTE) + TextureRect(4, texW, texH, GL_RGBA, fmt, ptexdata); + else + TextureRect(GL_RGB5_A1, texW, texH, GL_RGBA, fmt, ptexdata); int realheight = targ->realheight; @@ -2380,8 +2383,8 @@ ZeroGS::CMemoryTarget* ZeroGS::CMemoryTargetMngr::GetMemoryTarget(const tex0Info DestroyOldest(); } - - glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 4, GPU_TEXWIDTH*channels*widthmult, (targ->realheight + widthmult - 1) / widthmult, 0, GL_RGBA, fmt, ptexdata); + + TextureRect(4, texW, texH, GL_RGBA, fmt, ptexdata); } glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP); @@ -2576,7 +2579,7 @@ u32 ZeroGS::CBitwiseTextureMngr::GetTexInt(u32 bitvalue, u32 ptexDoNotDelete) glBindTexture(GL_TEXTURE_RECTANGLE_NV, ptex); if (glGetError() != GL_NO_ERROR) ZZLog::Error_Log("Error on binding bitmask texture."); - glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, GL_LUMINANCE16, GPU_TEXMASKWIDTH + 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_SHORT, &data[0]); + TextureRect(GL_LUMINANCE16, GPU_TEXMASKWIDTH + 1, 1, GL_LUMINANCE, GL_UNSIGNED_SHORT, &data[0]); if (glGetError() != GL_NO_ERROR) ZZLog::Error_Log("Error on applying bitmask texture."); // Removing clamping, as it seems lead to numerous troubles at some drivers @@ -2785,8 +2788,7 @@ void ResolveInRange(int start, int end) if (listTargs.size() > 0) { - Flush(0); - Flush(1); + FlushBoth(); // We need another list, because old one could be brocken by Flush(). listTargs.clear(); @@ -2835,8 +2837,7 @@ void FlushTransferRanges(const tex0Info* ptex) s_RTs.GetTargs(start, end, listTransmissionUpdateTargs);*/ // if( !bHasFlushed && listTransmissionUpdateTargs.size() > 0 ) { -// Flush(0); -// Flush(1); +// FlushBoth(); // //#ifdef _DEBUG // // make sure targets are still the same @@ -2999,8 +3000,7 @@ void InitTransferHostLocal() //ZZLog::Prim_Log("trans: bp:%x x:%x y:%x w:%x h:%x\n", gs.dstbuf.bp, gs.trxpos.dx, gs.trxpos.dy, gs.imageWnew, gs.imageHnew); // if( !bHasFlushed && (vb[0].bNeedFrameCheck || vb[0].bNeedZCheck || vb[1].bNeedFrameCheck || vb[1].bNeedZCheck)) { -// Flush(0); -// Flush(1); +// FlushBoth(); // bHasFlushed = 1; // } // @@ -3011,8 +3011,7 @@ void InitTransferHostLocal() // GetRectMemAddress(tstart, tend, vb[0].tex0.psm, 0, 0, vb[0].tex0.tw, vb[0].tex0.th, vb[0].tex0.tbp0, vb[0].tex0.tbw); // // if( start < tend && end > tstart ) { -// Flush(0); -// Flush(1); +// FlushBoth(); // bHasFlushed = 1; // } // } @@ -3022,8 +3021,7 @@ void InitTransferHostLocal() // GetRectMemAddress(tstart, tend, vb[1].tex0.psm, 0, 0, vb[1].tex0.tw, vb[1].tex0.th, vb[1].tex0.tbp0, vb[1].tex0.tbw); // // if( start < tend && end > tstart ) { -// Flush(0); -// Flush(1); +// FlushBoth(); // bHasFlushed = 1; // } // } diff --git a/plugins/zzogl-pg/opengl/targets.h b/plugins/zzogl-pg/opengl/targets.h index 358cccf85a..a80b86abfb 100644 --- a/plugins/zzogl-pg/opengl/targets.h +++ b/plugins/zzogl-pg/opengl/targets.h @@ -22,6 +22,8 @@ #define TARGET_VIRTUAL_KEY 0x80000000 #include "PS2Edefs.h" +extern bool nullTex; + inline Vector DefaultOneColor(FRAGMENTSHADER ptr) { Vector v = Vector(1, 1, 1, 1); @@ -300,4 +302,64 @@ inline u32 GetFrameKeyDummy(CRenderTarget* frame) } // End of namespace +#include "Mem.h" + +// Naive attempt at preventing texures from being drawn if their data is null. (which is undefined behavior.) +// Gets rid of garbage at the beginning of Grandia III. +// And messes up Kingdom Hearts opening. I need to read up more on OpenGL. :( +//#define NO_NULL_TEXTURES + +static __forceinline void DrawTriangle() +{ +#ifdef NO_NULL_TEXTURES + if (nullTex) + { + ZZLog::Debug_Log("Drawing arrays without a texture!"); + } + else +#endif + { + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + GL_REPORT_ERRORD(); + } +} + +static __forceinline void DrawBuffers(GLenum *buffer) +{ + if (glDrawBuffers != NULL) + { +#ifdef NO_NULL_TEXTURES + if (nullTex) + ZZLog::Debug_Log("Update2: Drawing buffers without a texture!"); + else +#endif + glDrawBuffers(1, buffer); + } + + GL_REPORT_ERRORD(); +} + +static __forceinline void FBTexture(int attach, int id) +{ + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + attach, GL_TEXTURE_RECTANGLE_NV, id, 0); + GL_REPORT_ERRORD(); +} + +static void Texture2D(GLint iFormat, GLenum format, GLenum type, const GLvoid* pixels) +{ + glTexImage2D(GL_TEXTURE_2D, 0, iFormat, BLOCK_TEXWIDTH, BLOCK_TEXHEIGHT, 0, format, type, pixels); + nullTex = (pixels == NULL); +} + +static void TextureRect(GLint iFormat, GLint width, GLint height, GLenum format, GLenum type, const GLvoid* pixels) +{ + glTexImage2D(GL_TEXTURE_RECTANGLE_NV, 0, iFormat, width, height, 0, format, type, pixels); + nullTex = (pixels == NULL); +} + +static void TextureRect(GLenum attach, GLuint id = 0) +{ + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, attach, GL_RENDERBUFFER_EXT, id); +} + #endif diff --git a/plugins/zzogl-pg/opengl/zerogs.cpp b/plugins/zzogl-pg/opengl/zerogs.cpp index 095483a68d..d232e19510 100644 --- a/plugins/zzogl-pg/opengl/zerogs.cpp +++ b/plugins/zzogl-pg/opengl/zerogs.cpp @@ -158,7 +158,7 @@ void ExtWrite(); void ResetRenderTarget(int index) { - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + index, GL_TEXTURE_RECTANGLE_NV, 0, 0); + FBTexture(index, 0); } DrawFn drawfn[8] = { KickDummy, KickDummy, KickDummy, KickDummy, @@ -545,9 +545,8 @@ void ZeroGS::RenderCustom(float fAlpha) SETVERTEXSHADER(pvsBitBlt.prog); SETPIXELSHADER(ppsBaseTexture.prog); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + DrawTriangle(); + // restore if (conf.options & GSOPTION_WIREFRAME) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); @@ -845,8 +844,7 @@ void ZeroGS::SetFogColor(u32 fog) // { gs.fogcol = fog; - ZeroGS::Flush(0); - ZeroGS::Flush(1); + ZeroGS::FlushBoth(); if (!g_bIsLost) { diff --git a/plugins/zzogl-pg/opengl/zerogs.h b/plugins/zzogl-pg/opengl/zerogs.h index 5f3a82b491..d36b786f53 100644 --- a/plugins/zzogl-pg/opengl/zerogs.h +++ b/plugins/zzogl-pg/opengl/zerogs.h @@ -113,7 +113,7 @@ using namespace std; GLenum err = glGetError(); \ if( err != GL_NO_ERROR ) \ { \ - ZZLog::Error_Log("%s:%d: gl error %s", __FILE__, (int)__LINE__, error_name(err)); \ + ZZLog::Error_Log("%s:%d: gl error %s(0x%x)", __FILE__, (int)__LINE__, error_name(err), err); \ ZeroGS::HandleGLError(); \ } \ } @@ -124,7 +124,7 @@ using namespace std; GLenum err = glGetError(); \ if( err != GL_NO_ERROR ) \ { \ - ZZLog::Error_Log("%s:%d: gl error %s", __FILE__, (int)__LINE__, error_name(err)); \ + ZZLog::Error_Log("%s:%d: gl error %s (0x%x)", __FILE__, (int)__LINE__, error_name(err), err); \ ZeroGS::HandleGLError(); \ } \ } @@ -210,12 +210,15 @@ inline const char *error_name(int err) case GL_TABLE_TOO_LARGE: return "GL_TABLE_TOO_LARGE"; + case GL_INVALID_FRAMEBUFFER_OPERATION: + return "GL_INVALID_FRAMEBUFFER_OPERATION"; + default: return "Unknown GL error"; } } -// inline for an extemely often used sequence +// inline for an extremely often used sequence // This is turning off all gl functions. Safe to do updates. inline void DisableAllgl() { @@ -823,7 +826,7 @@ void Prim(); void SetTexFlush(); // flush current vertices, call before setting new registers (the main render method) void Flush(int context); - +void FlushBoth(); void ExtWrite(); void SetWriteDepth();