From a3847a976882d052a27fe7493bcdba88c18bc262 Mon Sep 17 00:00:00 2001 From: Shinovon Date: Tue, 12 May 2026 22:44:44 +0500 Subject: [PATCH] VC4 fixes Fixed lags on specific conditions, skinning --- TODO.md | 8 ++++---- src/core/main.cpp | 6 +++--- src/renderer/SpecialFX.cpp | 6 +++--- vendor/librw/src/gl/gl3immed.cpp | 20 ++++++++++++++++++++ vendor/librw/src/gl/gl3skin.cpp | 1 - vendor/librw/src/gl/shaders/skin.vert | 2 +- vendor/librw/src/gl/shaders/skin_gl.inc | 2 +- 7 files changed, 32 insertions(+), 13 deletions(-) diff --git a/TODO.md b/TODO.md index 32eb71c..3b2cf5f 100644 --- a/TODO.md +++ b/TODO.md @@ -16,13 +16,13 @@ Common: GLES 2.0 specific: - [x] Optimize to always run 10+ fps - [x] Fix skinning shader (cutscene heads require it) +- [x] Fix face animations in optimized builds +- [x] Disappearing background in cutscenes +- [x] Huge lag spikes on VC4 +- [x] Skinning shader is still broken on VC4 - [ ] Optimize to always run 20+ fps - [ ] Use etc1 compression -- [ ] Fix face animations in optimized builds -- [ ] Skinning shader is still broken on VC4 -- [ ] Disappearing background in cutscenes - [ ] HUD still disappearing sometimes -- [ ] Huge lag spikes on VC4 GLES 1.1 specific: - [x] Backport to STLport v4 diff --git a/src/core/main.cpp b/src/core/main.cpp index d44fe99..21643e0 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -1403,10 +1403,10 @@ RenderScene(void) } #endif PUSH_RENDERGROUP("RenderScene"); -// CClouds::Render(); + CClouds::Render(); DoRWRenderHorizon(); CRenderer::RenderRoads(); -// CCoronas::RenderReflections(); + CCoronas::RenderReflections(); RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE); CRenderer::RenderEverythingBarRoads(); CRenderer::RenderBoats(); @@ -1416,7 +1416,7 @@ RenderScene(void) #ifndef SQUEEZE_PERFORMANCE CRenderer::RenderVehiclesButNotBoats(); #endif -// CWeather::RenderRainStreaks(); + CWeather::RenderRainStreaks(); POP_RENDERGROUP(); } diff --git a/src/renderer/SpecialFX.cpp b/src/renderer/SpecialFX.cpp index 4f4e4a0..6d96d21 100644 --- a/src/renderer/SpecialFX.cpp +++ b/src/renderer/SpecialFX.cpp @@ -137,10 +137,10 @@ void CSpecialFX::Render(void) { PUSH_RENDERGROUP("CSpecialFX::Render"); -// CMotionBlurStreaks::Render(); + CMotionBlurStreaks::Render(); CBulletTraces::Render(); -// CBrightLights::Render(); -// CShinyTexts::Render(); + CBrightLights::Render(); + CShinyTexts::Render(); CMoneyMessages::Render(); #ifdef NEW_RENDERER if(!(gbNewRenderer && FredIsInFirstPersonCam())) diff --git a/vendor/librw/src/gl/gl3immed.cpp b/vendor/librw/src/gl/gl3immed.cpp index 1619f23..8eaa827 100644 --- a/vendor/librw/src/gl/gl3immed.cpp +++ b/vendor/librw/src/gl/gl3immed.cpp @@ -118,6 +118,11 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices) glEnableVertexAttribArray(ATTRIB_TEXCOORDS0); glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + OFFSET_OF(Im2DVertex, u)); + glDisableVertexAttribArray(ATTRIB_NORMAL); + glDisableVertexAttribArray(ATTRIB_WEIGHTS); + glDisableVertexAttribArray(ATTRIB_INDICES); + glDisableVertexAttribArray(ATTRIB_TEXCOORDS1); + glDrawArrays(primTypeMap[primType], 0, numVertices); glDisableVertexAttribArray(ATTRIB_POS); @@ -151,6 +156,11 @@ im2DRenderIndexedPrimitive(PrimitiveType primType, glEnableVertexAttribArray(ATTRIB_TEXCOORDS0); glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + OFFSET_OF(Im2DVertex, u)); + glDisableVertexAttribArray(ATTRIB_NORMAL); + glDisableVertexAttribArray(ATTRIB_WEIGHTS); + glDisableVertexAttribArray(ATTRIB_INDICES); + glDisableVertexAttribArray(ATTRIB_TEXCOORDS1); + glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices); glDisableVertexAttribArray(ATTRIB_POS); @@ -221,6 +231,11 @@ im3DRenderPrimitive(PrimitiveType primType) glEnableVertexAttribArray(ATTRIB_TEXCOORDS0); glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u)); + glDisableVertexAttribArray(ATTRIB_NORMAL); + glDisableVertexAttribArray(ATTRIB_WEIGHTS); + glDisableVertexAttribArray(ATTRIB_INDICES); + glDisableVertexAttribArray(ATTRIB_TEXCOORDS1); + glDrawArrays(primTypeMap[primType], 0, num3DVertices); glDisableVertexAttribArray(ATTRIB_POS); @@ -245,6 +260,11 @@ im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndic glEnableVertexAttribArray(ATTRIB_TEXCOORDS0); glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u)); + glDisableVertexAttribArray(ATTRIB_NORMAL); + glDisableVertexAttribArray(ATTRIB_WEIGHTS); + glDisableVertexAttribArray(ATTRIB_INDICES); + glDisableVertexAttribArray(ATTRIB_TEXCOORDS1); + glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices); glDisableVertexAttribArray(ATTRIB_POS); diff --git a/vendor/librw/src/gl/gl3skin.cpp b/vendor/librw/src/gl/gl3skin.cpp index 8c626d7..a3dbeee 100644 --- a/vendor/librw/src/gl/gl3skin.cpp +++ b/vendor/librw/src/gl/gl3skin.cpp @@ -342,7 +342,6 @@ skinClose(void *o, int32, int32) void initSkin(void) { - if (moreVram) return; // TODO u_boneMatrices = registerUniform("u_boneMatrices", UNIFORM_MAT4, MAX_BONES); Driver::registerPlugin(PLATFORM_GL3, 0, ID_SKIN, diff --git a/vendor/librw/src/gl/shaders/skin.vert b/vendor/librw/src/gl/shaders/skin.vert index 1092d85..65e8595 100644 --- a/vendor/librw/src/gl/shaders/skin.vert +++ b/vendor/librw/src/gl/shaders/skin.vert @@ -13,7 +13,7 @@ main(void) SkinVertex += (u_boneMatrices[int(in_indices.x)] * vec4(in_pos, 1.0)).xyz * in_weights.x; SkinVertex += (u_boneMatrices[int(in_indices.y)] * vec4(in_pos, 1.0)).xyz * in_weights.y; SkinVertex += (u_boneMatrices[int(in_indices.z)] * vec4(in_pos, 1.0)).xyz * in_weights.z; - SkinVertex += (u_boneMatrices[int(in_indices.w)] * vec4(in_pos, 1.0)).xyz * in_weights.w; + //SkinVertex += (u_boneMatrices[int(in_indices.w)] * vec4(in_pos, 1.0)).xyz * in_weights.w; vec4 Vertex = u_world * vec4(SkinVertex, 1.0); gl_Position = u_proj * u_view * Vertex; diff --git a/vendor/librw/src/gl/shaders/skin_gl.inc b/vendor/librw/src/gl/shaders/skin_gl.inc index 21f13d7..ab7115a 100644 --- a/vendor/librw/src/gl/shaders/skin_gl.inc +++ b/vendor/librw/src/gl/shaders/skin_gl.inc @@ -14,7 +14,7 @@ const char *skin_vert_src = " SkinVertex += (u_boneMatrices[int(in_indices.x)] * vec4(in_pos, 1.0)).xyz * in_weights.x;\n" " SkinVertex += (u_boneMatrices[int(in_indices.y)] * vec4(in_pos, 1.0)).xyz * in_weights.y;\n" " SkinVertex += (u_boneMatrices[int(in_indices.z)] * vec4(in_pos, 1.0)).xyz * in_weights.z;\n" -" SkinVertex += (u_boneMatrices[int(in_indices.w)] * vec4(in_pos, 1.0)).xyz * in_weights.w;\n" +" //SkinVertex += (u_boneMatrices[int(in_indices.w)] * vec4(in_pos, 1.0)).xyz * in_weights.w;\n" " vec4 Vertex = u_world * vec4(SkinVertex, 1.0);\n" " gl_Position = u_proj * u_view * Vertex;\n"