From 1c3b60a8ee6cac492e7da387ae58aadab3d0b825 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 28 Jun 2014 21:37:41 -0700 Subject: [PATCH] Allow changing software skinning at runtime. --- Core/HLE/sceKernelThread.cpp | 2 +- GPU/GLES/GLES_GPU.cpp | 34 +++++++++++++++++++++++----------- GPU/GLES/GLES_GPU.h | 1 + GPU/GLES/TransformPipeline.cpp | 10 ++++++++++ GPU/GLES/TransformPipeline.h | 1 + GPU/GLES/VertexDecoder.cpp | 4 ++++ GPU/GLES/VertexDecoder.h | 1 + UI/GameSettingsScreen.cpp | 4 ++-- 8 files changed, 43 insertions(+), 14 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 77ef9bc45a..d916f4ed84 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1862,7 +1862,7 @@ Thread *__KernelNextThread() { void __KernelReSchedule(const char *reason) { - // First, let's check if there are any pending callback to trigger. + // First, let's check if there are any pending callbacks to trigger. // TODO: Could probably take this out of __KernelReSchedule() which is a bit hot. __KernelCheckCallbacks(); diff --git a/GPU/GLES/GLES_GPU.cpp b/GPU/GLES/GLES_GPU.cpp index 0912b12206..4c2c354774 100644 --- a/GPU/GLES/GLES_GPU.cpp +++ b/GPU/GLES/GLES_GPU.cpp @@ -445,6 +445,7 @@ GLES_GPU::GLES_GPU() if (g_Config.bSoftwareSkinning) { cmdInfo_[GE_CMD_VERTEXTYPE].flags &= ~FLAG_FLUSHBEFOREONCHANGE; + cmdInfo_[GE_CMD_VERTEXTYPE].func = &GLES_GPU::Execute_VertexTypeSkinning; } BuildReportingInfo(); @@ -562,6 +563,16 @@ inline void GLES_GPU::UpdateVsyncInterval(bool force) { } void GLES_GPU::BeginFrameInternal() { + if (resized_) { + if (g_Config.bSoftwareSkinning) { + cmdInfo_[GE_CMD_VERTEXTYPE].flags &= ~FLAG_FLUSHBEFOREONCHANGE; + cmdInfo_[GE_CMD_VERTEXTYPE].func = &GLES_GPU::Execute_VertexTypeSkinning; + } else { + cmdInfo_[GE_CMD_VERTEXTYPE].flags |= FLAG_FLUSHBEFOREONCHANGE; + cmdInfo_[GE_CMD_VERTEXTYPE].func = &GLES_GPU::Execute_VertexType; + } + transformDraw_.Resized(); + } UpdateVsyncInterval(resized_); resized_ = false; @@ -817,19 +828,20 @@ void GLES_GPU::Execute_Prim(u32 op, u32 diff) { } void GLES_GPU::Execute_VertexType(u32 op, u32 diff) { - if (!g_Config.bSoftwareSkinning) { + if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK)) { + shaderManager_->DirtyUniform(DIRTY_UVSCALEOFFSET); + } +} + +void GLES_GPU::Execute_VertexTypeSkinning(u32 op, u32 diff) { + // Don't flush when weight count changes, unless morph is enabled. + if ((diff & ~GE_VTYPE_WEIGHTCOUNT_MASK) || (op & GE_VTYPE_MORPHCOUNT_MASK) != 0) { + // Restore and flush + gstate.vertType ^= diff; + Flush(); + gstate.vertType ^= diff; if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK)) shaderManager_->DirtyUniform(DIRTY_UVSCALEOFFSET); - } else { - // Don't flush when weight count changes, unless morph is enabled. - if ((diff & ~GE_VTYPE_WEIGHTCOUNT_MASK) || (op & GE_VTYPE_MORPHCOUNT_MASK) != 0) { - // Restore and flush - gstate.vertType ^= diff; - Flush(); - gstate.vertType ^= diff; - if (diff & (GE_VTYPE_TC_MASK | GE_VTYPE_THROUGH_MASK)) - shaderManager_->DirtyUniform(DIRTY_UVSCALEOFFSET); - } } } diff --git a/GPU/GLES/GLES_GPU.h b/GPU/GLES/GLES_GPU.h index 26704164d9..364dc73a53 100644 --- a/GPU/GLES/GLES_GPU.h +++ b/GPU/GLES/GLES_GPU.h @@ -94,6 +94,7 @@ public: void Execute_Spline(u32 op, u32 diff); void Execute_BoundingBox(u32 op, u32 diff); void Execute_VertexType(u32 op, u32 diff); + void Execute_VertexTypeSkinning(u32 op, u32 diff); void Execute_Region(u32 op, u32 diff); void Execute_Scissor(u32 op, u32 diff); void Execute_FramebufType(u32 op, u32 diff); diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 6b00a27412..15110b3489 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -772,6 +772,16 @@ rotateVBO: #endif } +void TransformDrawEngine::Resized() { + decJitCache_->Clear(); + lastVType_ = -1; + dec_ = NULL; + for (auto iter = decoderMap_.begin(); iter != decoderMap_.end(); iter++) { + delete iter->second; + } + decoderMap_.clear(); +} + struct Plane { float x, y, z, w; void Set(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; } diff --git a/GPU/GLES/TransformPipeline.h b/GPU/GLES/TransformPipeline.h index 62851d117a..781a9d2d25 100644 --- a/GPU/GLES/TransformPipeline.h +++ b/GPU/GLES/TransformPipeline.h @@ -119,6 +119,7 @@ public: void InitDeviceObjects(); void DestroyDeviceObjects(); void GLLost(); + void Resized(); void DecimateTrackedVertexArrays(); void ClearTrackedVertexArrays(); diff --git a/GPU/GLES/VertexDecoder.cpp b/GPU/GLES/VertexDecoder.cpp index 84111821ca..e5e67f07a4 100644 --- a/GPU/GLES/VertexDecoder.cpp +++ b/GPU/GLES/VertexDecoder.cpp @@ -905,6 +905,10 @@ VertexDecoderJitCache::VertexDecoderJitCache() { #endif } +void VertexDecoderJitCache::Clear() { + ClearCodeSpace(); +} + #if defined(PPC) #error This should not be built for PowerPC, at least not yet. diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index f7d6ef88e1..fe065e1d7a 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -197,6 +197,7 @@ public: // Returns a pointer to the code to run. JittedVertexDecoder Compile(const VertexDecoder &dec); + void Clear(); void Jit_WeightsU8(); void Jit_WeightsU16(); diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 42cbc0997f..5d50482ad5 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -156,7 +156,7 @@ void GameSettingsScreen::CreateViews() { hwTransform->SetEnabledPtr(&hwTransformEnable); CheckBox *swSkin = graphicsSettings->Add(new CheckBox(&g_Config.bSoftwareSkinning, gs->T("Software Skinning"))); - swSkinningEnable = !PSP_IsInited() && !g_Config.bSoftwareRendering; + swSkinningEnable = !g_Config.bSoftwareRendering; swSkin->SetEnabledPtr(&swSkinningEnable); CheckBox *vtxCache = graphicsSettings->Add(new CheckBox(&g_Config.bVertexCache, gs->T("Vertex Cache"))); @@ -427,7 +427,7 @@ UI::EventReturn GameSettingsScreen::OnSoftwareRendering(UI::EventParams &e) { stencilTestEnable = !g_Config.bSoftwareRendering; beziersEnable = !g_Config.bSoftwareRendering; texSecondaryEnable = !g_Config.bSoftwareRendering; - swSkinningEnable = !PSP_IsInited() && !g_Config.bSoftwareRendering; + swSkinningEnable = !g_Config.bSoftwareRendering; hwTransformEnable = !g_Config.bSoftwareRendering; vtxCacheEnable = hwTransformEnable && g_Config.bHardwareTransform; texBackoffEnable = !g_Config.bSoftwareRendering;